go mod download
go run src/main.go
- Go doc (terminal):
- View all exported APIs: `cd src; go doc -all`
- View a package: `go doc ./src/models`
- View a symbol: `go doc ./src/models Post`
Server runs on `http://localhost:8080`
Copy .env.example to .env and configure:
# Database
DATABASE_URL=postgres://user:password@localhost:5432/dbname?sslmode=disable
# Auth (required for Platform Console)
JWT_SECRET=your_secure_secret_here
JWT_EXPIRATION_HOURS=24
# Admin User (dev only)
ADMIN_EMAIL=admin@example.com
ADMIN_PASSWORD=ChangeMe123!
ADMIN_ROLE=admin
GET /- Welcome message and endpoint listGET /health- Health checkGET /docs- OpenAPI documentation
GET /api/v1/feed/foryou- For You feedGET /api/v1/feed/news- News feedGET /api/v1/feed/rss.xml- RSS 2.0 output feed (type,topic,limit)GET /api/v1/content/:id- Content item detailsGET /api/v1/interactions- User interactionsGET /api/v1/interactions/bookmarks- Bookmarked contentGET /api/v1/posts- Posts CRUDGET /api/v1/media- Media CRUDGET /api/v1/pages- Pages CRUD
POST /admin/login- Admin login (issues JWT)GET /admin/me- Get current admin user (requires JWT)GET /admin/users- List admin usersPOST /admin/users- Create admin userGET /admin/users/:id- Get admin userPUT /admin/users/:id- Update admin userDELETE /admin/users/:id- Delete admin userPOST /admin/users/:id/password- Reset admin passwordGET /admin/sources- List content sourcesPOST /admin/sources- Create content sourcePOST /admin/sources/bulk- Bulk create content sources (OPML import flow)POST /admin/sources/discover- Discover feed URLs via AggregationPOST /admin/sources/preview- Preview source ingestion via AggregationGET /admin/sources/:id- Get content sourcePUT /admin/sources/:id- Update content sourceDELETE /admin/sources/:id- Delete content sourcePOST /admin/sources/:id/run- Trigger source ingestionGET /admin/content- List ingested contentGET /admin/content/:id- Get content detailsPATCH /admin/content/:id/status- Update content status (moderation/archive)
Ranking Config
GET /admin/intelligence/ranking- Get current ranking config (weights, decay params, active state)PUT /admin/intelligence/ranking- Update ranking config (validates weights sum ≈ 1.0)
Content Flags — editorial overrides per content item
GET /admin/intelligence/flags- List all flags (paginated, filterable by type)GET /admin/intelligence/flags/:id- Get flag for a specific content itemPOST /admin/intelligence/flags/:id- Upsert flag (boost / suppress / pin / exclude)DELETE /admin/intelligence/flags/:id- Remove flagPOST /admin/intelligence/flags/bulk- Bulk set flags on multiple items
Embedding & Cluster Analytics
GET /admin/intelligence/embeddings/clusters- Topic clusters fromtopic_tags(UNNEST + AVG engagement)GET /admin/intelligence/embeddings/similar/:id- pgvector cosine neighbors for a content itemGET /admin/intelligence/embeddings/stats- Embedding coverage by content type
Feed Analytics
GET /admin/intelligence/analytics/score-distribution- Histogram of ranking scoresGET /admin/intelligence/analytics/velocity- Top items by interaction rate (rolling window)GET /admin/intelligence/analytics/trending- Trending items (spike detection vs. baseline)GET /admin/intelligence/analytics/sources- Engagement performance by sourceGET /admin/intelligence/analytics/signal-health- % coverage per signal across all READY content
Feed Preview
GET /admin/intelligence/preview/foryou- Ranked For You feed preview with score breakdownGET /admin/intelligence/preview/news- Ranked News feed preview with score breakdown
Both preview endpoints accept query params to override weights temporarily (e.g.
?freshness_weight=0.5) without saving to the config.
go test -v ./src/tests/integration
To run only admin auth tests:
go test -v ./src/tests/integration -run Admin
-
Swagger/OpenAPI UI:
- Spec file:
docs/openapi.yaml - Serve static docs locally:
go run ./cmd/docserver - Open in browser:
http://localhost:8090 - Swagger UI:
go run ./cmd/docserver→http://localhost:8090 - Go docs:
cd src; go doc -all
- Spec file: