JerrettDavis/SignalFeed
A map-first application for reporting and subscribing to local sightings (hazards, events, community notes) with strong UX focus, trust signals, and extensible integrations.
SignalFeed
Real-time signals for everything you care about - a community-driven signal aggregation platform for real-world happenings
Stack
- Next.js (App Router) + TypeScript
- Tailwind CSS for styling
- Clean architecture: domain, application, ports, adapters
Structure
src/domain: entities and invariantssrc/application: use casessrc/ports: provider interfacessrc/contracts: runtime validation schemasdocs: vision, MVP, architecture, SDLC
Getting started
npm install
npm run devDev stack
npm run dev:stackThis starts Postgres via Docker Compose, applies db/schema.sql, and boots Next.js with Postgres enabled.
If port 5432 is already in use, stop the other Postgres instance before running this.
Docker dev stack
npm run dev:composeThis runs both Postgres and the Next.js dev server inside Docker.
To stop it:
npm run dev:compose:downTo reset (removes the Postgres volume):
npm run dev:compose:resetScripts
npm run dev: start dev servernpm run build: production buildnpm run start: start production servernpm run lint: run ESLintnpm run test: run unit testsnpm run typecheck: run TypeScript checksnpm run dev:stack: start Postgres via Docker Compose and run the dev servernpm run dev:compose: start Postgres + Next.js dev server via Docker Composenpm run dev:compose:down: stop Docker Compose dev stacknpm run dev:compose:reset: stop and remove Docker Compose dev stack volumesnpm run db:up: start Postgres onlynpm run db:down: stop Postgresnpm run db:reset: stop Postgres and remove volumes
Environment
NEXT_PUBLIC_MAP_STYLE_URL: MapLibre style URL (defaults to/map-style.json).SIGNALFEED_DATA_STORE:file(default in dev),memory, orpostgres.SIGNALFEED_DATA_DIR: directory for local JSON storage (defaults to.local).- Delete the folder to reset local data.
SIGNALFEED_DATABASE_URL: Postgres connection string (used whenSIGNALFEED_DATA_STORE=postgres).
API
GET /api/sightings: list sightingsPOST /api/sightings: create sightingGET /api/sightings/:id: fetch sightingGET /api/geofences: list geofencesPOST /api/geofences: create geofenceGET /api/geofences/:id: fetch geofenceGET /api/subscriptions: list subscriptionsPOST /api/subscriptions: create subscription
E2E tests
npm run e2ePlaywright will prompt to install browsers on first run.
Features
Core Capabilities
- Map-First Interface: Interactive map using MapLibre GL for reporting and viewing sightings
- Sighting Management: Create, view, and manage local sightings (hazards, events, community notes)
- Geofence Subscriptions: Subscribe to specific geographic areas to receive notifications
- Trust Signals: User reputation and sighting verification system
- Real-time Updates: Live updates for sightings in your subscribed areas
Architecture
- Clean Architecture: Domain-driven design with clear separation of concerns
- Multiple Storage Options: File-based, in-memory, or PostgreSQL data persistence
- Type-Safe: Full TypeScript with runtime validation using Zod
- Extensible: Plugin-ready architecture for custom integrations
- Modern Stack: Next.js 16 App Router, React 19, Tailwind CSS 4
Developer Experience
- Docker Support: Complete containerized development environment
- Testing: Comprehensive unit tests with Vitest and E2E tests with Playwright
- Type Safety: TypeScript with strict mode and ESLint configuration
- Hot Reload: Fast development with Next.js hot module replacement
Docs
docs/vision.mddocs/mvp.mddocs/architecture.mddocs/sdlc.mddocs/openapi.yamldocs/providers.mddb/schema.sql
Contributing
We welcome contributions! Please see CONTRIBUTING.md for details on:
- Development setup
- Coding standards
- Commit guidelines
- Pull request process
License
This project is licensed under the MIT License - see the LICENSE file for details.