Matt Thornhill (@thornhillmatt) 's Twitter Profile
Matt Thornhill

@thornhillmatt

Building Drifft → Solving last mile design | 25+ years crafting digital experiences | Co-founder Precode

ID: 377502592

linkhttp://www.precode.co calendar_today21-09-2011 17:42:34

362 Tweet

144 Followers

905 Following

Matt Thornhill (@thornhillmatt) 's Twitter Profile Photo

The anti-detect stack: Unique device fingerprints per agent (screen resolution, WebGL hash, canvas fingerprint, timezone, language). Residential proxy binding with region selection. Persistent Playwright browser profiles with cookies, localStorage, and session data. Behavioural

Matt Thornhill (@thornhillmatt) 's Twitter Profile Photo

AI message generation uses a 3-layer pipeline: Layer 1 (Style): voice matching to the agent's persona Layer 2 (Content): contextual relevance based on prospect data Layer 3 (Safety): compliance checks, uniqueness validation, injection defence Every outbound message is checked

Matt Thornhill (@thornhillmatt) 's Twitter Profile Photo

Ship day. Final push. Last features going in: Dry run mode for agents. Operator message routing through agent VPS. Structured persona editor for SOUL.md. Knowledge base with pgvector embeddings and RAG search. Per-agent chat interface. Fleet learning lifecycle.

Matt Thornhill (@thornhillmatt) 's Twitter Profile Photo

Muthur is done. 134 user stories. 190 commits. 103,000 lines of TypeScript. 3 days. Hub-and-Spoke architecture with dedicated Hetzner VPS per agent. Tailscale mesh networking. 90-day warming protocol across 5 phases. AI-powered message generation with 3-layer pipeline. Mother

Matt Thornhill (@thornhillmatt) 's Twitter Profile Photo

Full stack for Muthur: Built in @ClaudeAI Code Next.js 15 + React 19 TypeScript strict mode Drizzle ORM + Neon Postgres PostgreSQL + pgvector @haboretzner Cloud for VPS provisioning Tailscale mesh networking Vercel AI SDK + Anthropic shadcn + Tailwind CSS 4 AES-256-GCM

Matt Thornhill (@thornhillmatt) 's Twitter Profile Photo

What surprised me building Muthur: The warming protocol research took longer than expected. How do platforms actually detect automation? Turns out timing patterns matter more than fingerprints. Bimodal activity curves and Gaussian delays were the key insights. Also: pgvector

Matt Thornhill (@thornhillmatt) 's Twitter Profile Photo

The Revolut clone (401 screens) in @SuperduperUI was essential for Muthur's Watchtower dashboards. Fintech apps nail data visualisation. Metric cards. Trend sparklines. Cost breakdowns. Status indicators. Studied their patterns. Adapted for fleet monitoring. Saved hours of

Matt Thornhill (@thornhillmatt) 's Twitter Profile Photo

Biggest lesson from Muthur: Multi-tenant isolation must be baked into every query from day one. Org-scoped queries are enforced by convention, not database-level RLS. Works, but adding RLS policies would add a safety net. Retrofitting tenant isolation is painful. Start with it.

Matt Thornhill (@thornhillmatt) 's Twitter Profile Photo

Final thoughts on Muthur. Building autonomous outreach infrastructure taught me that patience is a competitive advantage. Most tools optimise for speed. Blast messages immediately. Get banned immediately. The 90-day warming protocol feels slow. But it creates a 2-year runway

Matt Thornhill (@thornhillmatt) 's Twitter Profile Photo

Next week: Thirdmap. The problem: custom map styling is either expensive (Mapbox Studio at $500+ per month) or painful (raw OpenStreetMap with a steep learning curve). Thirdmap lets you describe the map you want in plain English or use intuitive visual controls. Export to any

Matt Thornhill (@thornhillmatt) 's Twitter Profile Photo

Week 15 of 52 products: Thirdmap. The problem: custom map styling is either expensive or painful with a steep learning curve. Thirdmap lets you describe the map you want in plain English. "Make it vintage." "Dark mode with neon roads." AI transforms 93 technical layers

Matt Thornhill (@thornhillmatt) 's Twitter Profile Photo

Tech stack for Thirdmap: React 19 + TypeScript strict @mapaboreibre GL v5 for 3D globe rendering Zustand for reactive state Anthropic Claude with function calling Supabase for persistence @firecrawlI for brand colour extraction Tailwind CSS + shadcn Built in @ClaudeAI

Matt Thornhill (@thornhillmatt) 's Twitter Profile Photo

First architecture decision: semantic layer abstraction. MapBox GL styles have 93 layers with names like road_motorway_casing_z12. Nobody thinks in those terms. Mapped them to 23 human concepts: Water, Highways, City Labels. Now users AND AI can understand "make the water

Matt Thornhill (@thornhillmatt) 's Twitter Profile Photo

Muthur is live. The AI fleet manager for autonomous outreach — Instagram DMs, cold email, warming protocols, all orchestrated from one command centre. Early access waitlist is open now. muthur.co

Matt Thornhill (@thornhillmatt) 's Twitter Profile Photo

The 3D globe was surprisingly straightforward with MapLibre GL v5. The hard part: atmosphere effects that don't look cheap. Customisable fog colour, space colour behind the globe, horizon blending, star intensity. Spent more time on star rendering than expected. They look

Matt Thornhill (@thornhillmatt) 's Twitter Profile Photo

Why function calling instead of raw LLM output? Asked Claude to generate JSON for map styles. Missing brackets. Invalid hex codes. Malformed structures. Switched to structured tool calls: update_layer_group(group="water", color="#1a1a2e") 100% valid output. Every time. Lower

Matt Thornhill (@thornhillmatt) 's Twitter Profile Photo

The Revolut clone (401 screens) in SuperDuper UI keeps paying dividends. Thirdmap's export modal needed tabs for different formats: JSON, HTML embed, React component, share URL. Pulled the tab patterns directly. Export flows already solved by fintech apps handling different

Matt Thornhill (@thornhillmatt) 's Twitter Profile Photo

Mid-build status: visual editor working. 23 semantic layer groups in an accordion sidebar. Colour pickers, opacity sliders, visibility toggles, line width controls, typography settings. Every change syncs to the map in real-time. But every state change was causing jank.

Matt Thornhill (@thornhillmatt) 's Twitter Profile Photo

Scope cut: user authentication UI. Supabase auth is configured. Database schema is done. RLS policies are in place. But building login/signup screens, password reset flows, email verification... that's a week of polish for a feature that isn't core to the value prop. Shipping