01 · Independent product Pre-launch
Sited: a geospatial site-analysis platform for architects
Built for architecture students and practices: pin a site, and Sited draws its buildings, streets, green space, land use and wind from open data, plus a sun path for its latitude, onto an A4 to A0 board they can edit and export. I built the whole product: the Angular client and canvas editor, a Supabase PostgreSQL backend secured with Row Level Security, and a Fastify and DuckDB geospatial API.
ScopeProduct, frontend, database, API, deployment
- Ten site studies built from OpenStreetMap, NASA POWER and the site’s latitude, exported to PDF, PNG or SVG, with maps also as DXF or GeoJSON
- Security enforced in Postgres: Row Level Security on every table, roles in the JWT, plan limits in triggers
- Geo API in Fastify and DuckDB that queries Overture Maps data on S3, now in staging
- Angular
- TypeScript
- NgRx
- MapLibre
- Konva
- Supabase
- PostgreSQL
- Fastify
- DuckDB
Engineering details: Sited
Architecture
Product
A planning and document editor for architectural site analysis boards: what architecture students pin up at crits and practices make for competitions and early feasibility studies. Users pin a site, draw its boundary, add generated studies to a sheet, edit everything and export.
What I owned
All of it, built independently: product design, the Angular client and canvas editor, the Supabase schema and security, the Geo API, and CI/CD to Cloudflare and Railway through GitLab.
Frontend
- Angular 21 with signals and zoneless change detection; NgRx stores cache data from Supabase and external APIs
- Konva canvas editor on a framework-free core, where every edit is a command with an inverse for undo
- MapLibre site setup with place search, boundary drawing and Turf measurements
- OpenStreetMap and NASA POWER data fetched and summarized in the browser
- Export to PDF, PNG, SVG, DXF and GeoJSON, generated client-side
Backend & data
- Supabase PostgreSQL with Row Level Security on every table and access checks in security-definer functions
- Roles carried in the JWT by a custom access token hook; plan limits enforced by database triggers
- Autosave through one RPC that checks the base revision, so a conflicting save is raised, never silently overwritten
- Geo API (staging build): Fastify and DuckDB over Overture Maps GeoParquet, Supabase JWTs verified against JWKS, per-user rate limits, OpenAPI generated from route schemas, and an automated test suite in CI
Challenges and decisions
- Read only the Overture files that overlap a site, using committed per-release manifests, instead of scanning every file in the release
- Reject oversized areas instead of truncating them, so partial data never looks complete
- One DuckDB connection per query, three at most and cancellable, after a shared connection timed out under concurrent cold requests
- The database, not route guards, is the security boundary
Status
Working today
- Accounts, projects and documents with autosave
- Site setup and ten generated studies
- Canvas editor, templates and export
- Plan limits enforced in the database
In progress
- Overture buildings from the Geo API, in staging
- Roads, places, vegetation, transit and land-use routes, not yet used by the app
- Payment provider, feedback email and legal pages before launch