Self-hosted social feed. Anyone can read posts. Sign in to publish. Ads are placed by age, country, and platform.
Go API, Next.js, Expo, PostgreSQL or SQLite. The app is called Stream.
Signed-in members can activate an advertiser workspace at /advertiser to upload creative, buy and redeem advertising credits, fund targeted campaigns, and review campaign impressions and clicks. Internal staff use /admin for live platform and advertising analytics, roles, campaign controls, company credit adjustments, and promotions. The public advertising services page is available at /advertise. See the backend guide for API and storage configuration.
Members can publish photos directly from the composer. Advertiser and staff reports support date filters and accessible daily data tables. The product review and engineering brief records the priorities, acceptance criteria, completed workflow checks, and next features.
- apps/backend — Go API
- apps/web — Next.js
- apps/mobile — Expo
pnpm installRun the stack (Postgres, API with hot reload, web with hot reload):
docker compose up --build
docker compose exec backend go run ./cmd/seedOpen http://localhost:3000 signed out to read the mock feed. Sign in as admin@stream.local for administrative reporting, jane@stream.local, kai@stream.local, or nova@stream.local for advertiser data, or miles@stream.local as a regular member (password password123 for every development fixture).
| Page | Route | Access |
|---|---|---|
| Social feed | http://localhost:3000/ | Public |
| Advertiser dashboard | http://localhost:3000/advertiser | Sign in; members can activate advertising |
| Admin dashboard | http://localhost:3000/admin | Admin account, such as admin@stream.local |
| Sign in | http://localhost:3000/login | Public |
A Cannot GET / response with an X-Powered-By: Express header is from
another server. Make port 3000 available, then recreate the frontend if needed:
docker compose up -d --build --force-recreate --no-deps webCheck docker compose ps for a published web port. Docker development uses
Webpack with polling for file changes and keeps .next in a Docker volume to
avoid sharing generated files with host development. These settings also apply
to the SQLite stack.
Wipe the database and start over:
docker compose down -vOr Postgres only, then every app on the host:
docker compose up -d postgres
pnpm dev
pnpm --filter backend db:seedApp-specific setup, APIs, and commands live in each app README.
For local development with a file database and local image storage, use the standalone SQLite stack:
docker compose -f docker-compose.sqlite.yml up --build
docker compose -f docker-compose.sqlite.yml exec backend go run ./cmd/seedSQLite data and uploads persist in apps/backend/data/, which is excluded from
Git. PostgreSQL remains the default provider. See the
database configuration guide for
running either provider directly on the host.