============================================================================ SAID — Backend engineer Owner, AgileTech Solutions · Amsterdam, NL taking client work ============================================================================ SERVICES ------------ · API design and build · Database modeling and query optimization · Systems integration and automation FOCUS --------- · API design · Relational data modeling · Production operations STACK --------- languages TypeScript, JavaScript, SQL databases PostgreSQL, Supabase apis GraphQL / Apollo Server, REST / Express infra DigitalOcean, nginx, PM2, Certbot SYSTEMS ----------- TizMarket — B2B agricultural commodity marketplace Next.js · Apollo Server · Prisma · PostgreSQL · Stripe Connect problem: Bulk commodity trades carry compliance paperwork — 28 distinct document types, each with its own visibility rules and approval state, referenced by buyers, sellers, and admins. decision: Modeled documents as a first-class ProductDocument entity with real enums for type, visibility and status, rather than a JSON blob on the product. Approval state became queryable, indexable, and enforceable in one place. tradeoff: Every new document type is now a migration. Worth it — the alternative was the same validation logic drifting across a web client, a mobile client, and an admin panel. forms-api — Submission ingestion for two client sites Node.js · TypeScript · Express · PostgreSQL · Resend problem: Two unrelated marketing sites needed reliable form capture and email delivery without dragging a CMS into either of them. decision: One small API on a single droplet: parameterized queries, PM2 under nginx, Certbot for TLS, managed Postgres with an explicit CA certificate rather than disabled verification. tradeoff: One droplet is one point of failure. At this volume that's the right trade, and it keeps the entire system debuggable from a single SSH session. What actually broke: a leftover systemd unit silently holding port 3000. blog-cms — Publishing backend with a public read path Next.js · Supabase · Postgres RLS · Editor.js problem: Public reads had to be fast and cheap. Writes had to be impossible for anyone who wasn't supposed to make them. decision: Enforced the split in the database with row-level security — anon reads, service role writes — instead of trusting the application layer, then pre-rendered public pages with a 24-hour revalidate. tradeoff: RLS policies are easy to write wrong and awkward to test. The payoff is that there is no unauthenticated write path to leave open by accident. lead-pipeline — Automated lead sourcing across public feeds Make · Google CSE · Reddit API · RSS problem: Surface Dutch-language service requests across sources with incompatible rate limits, no shared identity, and heavy duplication. decision: Deduplicated on a normalized content hash in a persistent store, ran an intent classifier before scoring, and tuned polling to the tightest quota — 100 queries a day — instead of the fastest source. tradeoff: Excluded Facebook Groups and Nextdoor on terms-of-service grounds and left Marktplaats manual. That costs real volume, and it's still the right call. ELSEWHERE ------------- GitHub # LinkedIn # Email # Résumé (PDF) # ---------------------------------------------------------------------------- Same URL, three representations — your Accept header decides: curl -s → this curl -s /resume.json → JSON open → the site