🪶 Feather is a modern Swift-based Content Management System.
💬 Click to join the chat on Discord.
Run these from the repository root:
make cleanClears only the Postgres database volume and media storage volume.make resetDrops the full Compose stack, including all Compose-managed volumes.make stopStops all running services without removing them.make depsBuilds and runs the current dependency services:certificates,postgres, andmigrator.make backendBuilds and runs the backend stack: dependencies plusserverandworker.make allBuilds and runs the full local stack. For the web app, this also sets browser-facing public origins for:WEB_PUBLIC_BASE_URL,STATIC_PUBLIC_BASE_URL, andMEDIA_PUBLIC_BASE_URL. By default,make allandmake all-uptry to detect the current LAN IP and use:http://<ip>:3456,http://<ip>:4567, andhttp://<ip>:8080. If LAN detection fails, Compose falls back to the localhost defaults. You can override any of them explicitly, for example:WEB_PUBLIC_BASE_URL=http://192.168.8.102:3456 STATIC_PUBLIC_BASE_URL=http://192.168.8.102:4567 MEDIA_PUBLIC_BASE_URL=http://192.168.8.102:8080 make allmake clean allClears database and media storage, then builds and runs the full stack.make clean backendClears database and media storage, then builds and runs the backend stack.
These variables control browser-facing URLs and are separate from the internal
API_BASE_URL used by the web app to talk to the backend service.
WEB_PUBLIC_BASE_URLPublic base URL for the web/admin app, for examplehttp://localhost:3456.STATIC_PUBLIC_BASE_URLPublic base URL for static assets, for examplehttp://localhost:4567.MEDIA_PUBLIC_BASE_URLPublic base URL for backend-served media assets, for examplehttp://localhost:8080.
Compose defaults:
WEB_PUBLIC_BASE_URL=http://localhost:3456STATIC_PUBLIC_BASE_URL=http://localhost:4567MEDIA_PUBLIC_BASE_URL=http://localhost:8080
- hook functions for modules -> asset deletion should trigger hook (remove related assets)
- email template system -> send out emails
- content editor for web-based contents
- required relations, autocomplete fixes (require N item)
- multiple selection for gallery picker -> video picker, file picker, etc.
- review migrations
- fix required labels design
- split openapi into modules
- cleanup css setAttribute calls
- review architecture boundaries (frontend, backend)
The Swift OpenAPI generator package lives at openapi-generator.
Use make -C openapi-generator yaml or make -C openapi-generator run
to regenerate the OpenAPI YAML and generated Swift sources in
openapi.