Najim · the AI staffing agency for UAE & Saudiyour AI hire starts in 10 working daysbespoke face, voice, CV per businessAED 5,000/month, AED 3,500 setupSaudi-Arabic voice notes built-inruns on WhatsAppRUH · JED · DXBmeet the team at /teambuilt in RiyadhNajim · the AI staffing agency for UAE & Saudiyour AI hire starts in 10 working daysbespoke face, voice, CV per businessAED 5,000/month, AED 3,500 setupSaudi-Arabic voice notes built-inruns on WhatsAppRUH · JED · DXBmeet the team at /teambuilt in Riyadh
Built in public · what shipped this week

We ship every day.
Here is the receipt.

Every entry below maps to a commit on github.com/dhnpmp-tech/project-agent. We dogfood the platform for Saffron Kitchen (our own restaurant) so the bugs surface before our customers see them. The agent on +1 (205) 858-2516 runs the same code as this page.

The last 26 days

infrad59e112

Najim Brain HTTP server live in production · spec v1.0.2

`gbrain serve --http` running as a systemd unit on the VPS. `GET http://127.0.0.1:3131/health` returns {status:ok, version:0.41.26.0, engine:postgres}. Three corrections vs the original spec, captured per hardwire rule #1: (a) port is 3131 not 8300 — gbrain ignores --port and uses its built-in default; (b) bind is 0.0.0.0 with no flag override — locked down to localhost-only via iptables INPUT DROP rule on 3131, persisted via /etc/iptables/rules.v4 + @reboot cron; (c) embedding provider is minimax:embo-01 not Ollama nomic-embed-text. Verified put/search end-to-end — gbrain ingested 'Saffron Kitchen serves lamb mandi nightly' and returned it on a 'lamb' query with score 0.24. najim-brain-versions.json bumped, endpoints.* dict added, change-log row written. systemd unit + iptables rules persistent across reboot.

infra78e2ae4

Najim Brain · gbrain installed on VPS · spec bumped to v1.0.1

First contact with production. Installed Bun 1.3.14 + gbrain 0.41.26.0 (commit 42d99b6) on the VPS. Ran `gbrain apply-migrations --yes --non-interactive` — six migrations through schema v0.32.2 completed cleanly. Applied 021_clients_gbrain.sql to agents-postgres — the three new columns (gbrain_token, gbrain_source_slug, gbrain_provisioned_at) are live on the clients table. Critical discovery: gbrain is Bun-based, NOT Node-based — the original spec assumed `node migrate.js` which doesn't exist. Per hardwire rule #2 (never edit bootstrap.sh without updating §5 in the same commit), bumped spec_version 1.0.0 → 1.0.1, rewrote §5.1 and §5.2 in najim-brain.md to match reality, updated bootstrap.sh to install Bun + gbrain globally + run apply-migrations + generate the systemd unit pointing at the global gbrain binary. Regenerated /spec/najim-brain.html from the v1.0.1 markdown. Still queued: configure DATABASE_URL to point gbrain at the production gbrain-postgres container, decide on embedding provider (Ollama nomic-embed-text vs OpenAI), wire the `gbrain serve` HTTP endpoint, then exercise §6 against Saffron.

infraf074979

Najim Brain architecture · deploy runbook · replicable

Before building the real gbrain integration we wrote the architecture. docs/architecture/najim-brain.md is the canonical reference — system goal, ASCII architecture diagram of how gbrain fits with the FastAPI prompt-builder + Kapso webhook + Graphiti adjacent layer, current-state inventory of what's on the VPS today, bootstrap procedure (one-time, ~30 min: clone gbrain, run migrations against gbrain-postgres, configure secrets, systemd service, Traefik localhost-only, Dream Cycle cron, smoke test), and the per-tenant provisioning procedure as 7 numbered steps with exact curl commands and verifications. Plus schema migration (clients.gbrain_token), three Python helper scripts to write next (seed_gbrain.py, backfill_gbrain.py, diff_gbrain.py), code integration points in the prompt-builder, the /brain page swap, rollback, monitoring, DR RPO/RTO, and future work. ~600 lines, copy-pasteable commands throughout. Next sprint: execute §5 then §6 against Saffron first.

featadd176b

The Najim Brain · two delivery modes · system, not founder

Named our shared knowledge layer the Najim Brain — like WorksHQ's Works Brain but built on gbrain + Graphiti + pgvector (all three already running on our VPS as gbrain-postgres / brain-graphiti / brain-neo4j-graphiti containers). New homepage section walks the six layers: customer memory · business knowledge · the vault · knowledge graph · dream cycle (2am enrichment) · MCP protocol. Open-source stack, hosted on infrastructure we own in UAE & Saudi. Also new: 'Two ways we ship' section makes the delivery choice explicit — REMOTE (default, 10 days, AED 5K+3.5K) vs ON-SITE SPRINT (30 days, ~3× price, a Najim operator embeds inside the business — for brokerages, multi-outlet restaurants, clinics). Footer de-Petered — 'WhatsApp Peter' is now 'WhatsApp the team' / hello@najim.ai. Updated §06 of the Najim Laws to lead the system-not-person framing: 'The Brain is the team that stays. Not the person you called.'

uxf11ade9

WorksHQ-inspired voice upgrade · 5 new homepage sections

Adopted five patterns from workshq.com.au's tight Australian voice: (1) The Najim Laws — six declarative commitments ("The unit is a hire, not a tool · If she doesn't sound like your business in 10 days, you don't pay · Voice notes ship in her own voice, or they don't ship · ..."). (2) Without/With — a behavioral 6-row table contrasting daily SMB pain with the solved state. (3) NajimICP — explicit "Najim is for you if / NOT for you if" qualifier that filters tire-kickers. (4) /pricing offer letter now shows the 10-day onboarding broken into Day 1 / 2-5 / 6-8 / 9 / 10 with concrete deliverables per phase. (5) Footer rebuilt — Najim star mark, Peter named as the founder line (WhatsApp + email), provenance signature ("operated by Project Agent FZ-LLC · Built in Riyadh · backed by DCP"). /team route removed last commit; this commit fills the page real estate it freed.

uxb0533d3

Tightened the funnel · positioning line · /kickoff in depth

Deleted /demo and dropped Nadia from the public /team pages (she lives in the hero now — single canonical surface). Removed /app/onboarding from public CTAs site-wide; every "start" button now points at /kickoff. Reframed /teardown as a Najim hire preview ("Watch a Najim hire read your business in 60 seconds"). New position line under the hero — "You don't have an AI problem. You have a hiring problem. We solved hiring." /kickoff got a trust strip (response SLA · cities · cancel-anytime), a fast-track WhatsApp shortcut for in-a-hurry visitors, a "What we'll ask on the call" 5-question list, and a mono-font privacy/cancel line in fine print.

uxf581083

Cut the drift pages · tight navigation only

Deleted 7 routes that didn't fit the staffing-agency narrative: /admin (marketing mockup of internal ops dashboard), /book-audit (duplicated /kickoff), and 5× /preview/* (design exploration variants). Rebranded the keepers — /privacy now reads "Najim (operated by Project Agent FZ-LLC)", /rami body copy reframes him as "Najim's founder agent", and the Ask-Rami greeting widget now answers "Ask me anything about Najim". Inspired by workshq.com.au — they ship five focused routes, no drift, every link earns its slot.

uxec2f510

Brand rollout · Najim live across the site + /kickoff form

Najim wordmark replaces the DCP·sa lockup in the nav (with a ★ glyph in saffron gradient). Marquee header rewritten to lead with the staffing-agency pitch in both EN and AR. "Project Agent" → "Najim" across consumer copy on homepage, pricing, /vs/chatbase, and onboarding (legal entity "Project Agent FZ-LLC" stays on the pricing-page signature footer). New /kickoff intake page wires every "Schedule kickoff" CTA into a 3-field form that opens WhatsApp with a pre-filled message to the founders — no Calendly needed yet.

ux1e5241e

Najim — the staffing-agency restructure

Marketing site rebuilt around the verb HIRE. New hero ("Hire your first AI employee"), "The Math" section comparing AED 25,500 (three-hire status quo) vs AED 5K+3.5K (us), per-agent CV pages at /team/nadia · /team/omar · /team/layla, and a /pricing page rebuilt as a literal job-offer letter (letterhead, salary block, benefits package, founding-customer rate, signature). First appearance of the proposed brand name Najim (نجم — "star employee" in Riyadh dialect).

feat3aa2286

Per-language voice routing · Saudi-Arabic voice ready for Nadia

voice_id now carries a primary + Arabic-override pair (Jessica for English, Heba Mansuri for Saudi-accent Arabic). When the reply language is detected as Arabic, the agent speaks in a native Saudi customer-care voice. Falls back to the English voice + multilingual model when library voices are tier-gated. Activates instantly the moment the ElevenLabs subscription clears.

feata74fbcd

Nadia gets a face and a voice · ElevenLabs wired per business

Saffron's customer agent now has a real face (Recraft-generated portrait) and a real voice (ElevenLabs Jessica · warm, conversational). voice.py routes by provider prefix — el: for ElevenLabs, mm: for MiniMax. The architecture supports a unique voice per tenant — every business hires their own Nadia, not a shared template.

infracf1e3c7

Production deployment moved into git · 9 files recovered

/opt/prompt-builder on the VPS is now a symlink to a real git checkout — future deploys are 'git pull + systemctl restart' instead of scp. Recovered voice.py, ai_video.py, arabic_tts.py, video_maker.py, requirements.txt, and 4 cron wrappers that had only ever lived on the production disk. Stripped two hardcoded Supabase JWTs left over from the pre-cutover era while we were in there.

ux33687e4

Agent board · watch your teammates work in real time

/dashboard/agent-queue is now a four-column assignment board (Awaiting your nod · Doing now · Drafts ready · Skipped). Cards move across as the cron loop picks them up and drafts the work. Auto-refreshes every 30s while the tab is visible. Same approve/skip API as before — pure presentation upgrade.

fix32b7b5e

Owner brain stopped treating questions as commands

"are you working?" used to come back as a confused refusal. Now the brain has three new intent branches (status check, brief resend, chitchat) and the LLM fallback is reframed as a 4-way classifier — update / query / chitchat / unknown — that responds like a teammate, never like a parser. Reactive WhatsApp replies also synthesize a voice note now, mirroring the daily brief.

feat9ec1622

Property-scraper showcase + DLD public data ingester

Pluggable real-estate scraping service. Pydantic ListingRecord schema, async fan-out registry, SSE streaming, per-row auth_basis governance. First registered source: Dubai Land Department open data. Bayut + Property Finder slots documented as future partnership work — not shipped without explicit data-feed authorization.

feat149fefb

Real-estate vertical teardown + Gmail OAuth dashboard

Teardown now detects Bayut / Property Finder / Dubizzle Property URLs and produces broker-shaped audits (search profile, viewings, RERA schema, mortgage). New /dashboard/integrations/gmail OAuth page unblocks the Gmail-triage cron.

feat9ab6cd3

Gmail triage wired into the owner brief + DAQ

9am brief now folds in '📧 Email queue: N urgent · M hot leads'. Hot-lead threads with needs_reply auto-queue email_reply_draft rows in the daily action queue — owner approves via WhatsApp letter codes.

feat48eadb0

Composio Gmail triage agent

Reads the tenant's existing Gmail every morning, classifies threads into 8 buckets (urgent / hot lead / supplier / receipt / etc.). FastAPI endpoints + cron + migration. Cost ~$0.18/month/tenant.

feat13b13a7

Real-estate teardown scaffold

TeardownCategory union with real_estate first-class. URL detection for Bayut, Property Finder, Dubizzle Property, Propspace, .realtor.ae. RealEstateAgent + RealEstateListing schema audit. Broker-tuned B2B prompt examples.

uxe02ee62

Pricing collapsed to one offer · AED 5K/mo + AED 3.5K setup

No tiers, no friction. Cost-comparison panel anchored against verified UAE salary medians (GulfTalent, Indeed, PayScale). Founding-customer rate AED 2.5K/mo for case-study trade.

featf047577

WhatsApp-native hero · /vs/chatbase · /changelog · sticky CTA

Hero rewritten to lead with the structural wedges (WhatsApp-native, Arabic-first, done-for-you). New comparison page targeting the chatbase-alternative long tail. Public ship-log page. Floating WhatsApp-demo CTA on every page.

feat44f9fe1

Customer-memory wired to brief segmentation

VIP / at-risk / lapsed counts on the morning brief now read from the live customer memory tags written by the nightly LLM analyzer, not RFM-by-activity. The agent sees what it learned.

uxf6252f0

Owner brief rewritten for WhatsApp-native rendering

Dropped ASCII borders, meta-AI metrics, and the 10-line command menu. Bold headings, italic eyebrow, voice-note version delivered alongside text. /help command now returns the full menu on demand.

feat898598d

Owner brief audio via on-device TTS

Daily 9am brief now lands as text + voice note. Supertonic synthesizes the brief on the VPS — zero per-character cost. Sanitizes emojis and ASCII borders before synthesis.

featfead059

Customer memory auto-refresh on every message

Webhook fires fire-and-forget analyzer after each inbound message. Dashboard at /dashboard/customers updates live, no 2-hour cron lag.

feate12ed48

Customer memory analyzer + dashboard

Walks conversation history per customer, LLM-extracts name, language, preferences, sentiment, tags (vip / at_risk / lapsed). Three endpoints + a 2-hour safety-net cron.

feat17aef2b

On-device TTS endpoint

POST /tts/synthesize returns WhatsApp-ready OGG opus from Supertonic v3. ~6× real-time on CPU, 31 languages, zero per-call cost.

fixa3e74a2

Prompt-builder URL fallbacks corrected

Onboarding submit + teardown routes were silently 404-ing on api.dcp.sa (reserved for DCP GPU) and the retired n8n.dcp.sa. Both now default to the actual prompt-builder.

infra2f499f0

Phase 7: Supabase residue cleared

Final 4 dashboard files cut over to the post-cutover API layer. New PATCH /api/agents/[id]/status. Stub libs deleted. Migration structurally complete.

featd54b4c9

Tenant-isolation audit suite

23 tests assert no row leaks across tenants for every server-queries helper. Fixed a real leak in /api/owner/daily-pulse/send (URL-embedded clientId wasn't verified against session).

feat6e6c425

Onboarding submit → live Kapso provisioning

The wizard's last step now actually starts the WhatsApp setup. New tenant lands on /dashboard with status=provisioning and the WIA agent already wiring up.

feat

Daily action queue with approval letters

Each night the planner drafts 5–7 actions per tenant (replies, posts, outbound). Owner approves via WhatsApp reply (YES, NO, or 'A C E'). Executor drafts the deliverables in the morning.

feat

Cron heartbeat + watchdog

Every cron now reports start + finish to /cron/heartbeat. A 15-min watchdog pages the founder on Kapso when a critical cron misses its grace window.

feat

Public teardown wedge live at /teardown

Paste any UAE/Saudi SMB URL → 60-second AI-generated audit with screenshot, agent score, top 3 issues, sample WhatsApp reply, 3 IG captions. Shareable permalink.