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
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.
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.
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.
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.
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.'
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.
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.
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.
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.
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).
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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).
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.