Khurram Badar / Archive / Papers / OFFICE — Master Claude Code Build Prompt (FINAL)

OFFICE — Master Claude Code Build Prompt (FINAL)

other · 2026-04-24 · 4690 words · Khurram Badar

OFFICE — Master Claude Code Build Prompt F...

ai · document

OFFICE — Master Claude Code Build Prompt (FINAL)

Paste this entire document as a single message into Claude Code after running:

```bash
mkdir ~/office && cd ~/office && claude
```

---

You are building "Office" end-to-end in one run — Khurram's private AI chief of staff deployed to office.khurrambadar.com. This is not a prototype. This is the production v1 he will use every day. Build it completely, test it thoroughly, and deploy it.

Work systematically. Commit to git after every phase. Test as you go. Log progress to BUILD_LOG.md so Khurram can check status anytime. When you hit a point marked DECISION, stop and ask him. Everything else, proceed autonomously.

CONTEXT YOU NEED

**Khurram's profile:**
- Non-technical founder, 30+ years C-suite experience, builds entirely through Claude Code
- Currently in Dubai (hotel stay), returning to Karachi mid-May 2026
- GitHub: khurrambadar3125
- Vercel account email: khurrambadar@gmail.com
- Owns khurrambadar.com via GoDaddy, deployed through Vercel, public KRM chatbot at root
- This Office subdomain is private — only he uses it

**Reuse existing infrastructure:**
- Supabase project: lacemhfybgqomwpyvsbu (name: getgoldsilver, org: NewWorld Education) — shared across his projects with table prefixes. All Office tables prefixed `office_` to namespace cleanly
- Anthropic API key: existing krm-khurrambadar key (he'll share the value)
- Model: claude-haiku-4-5-20251001

**Communication rules with Khurram:**
- Be concrete. Give him next actions, not long menus
- When something is simple, say so. Don't pad estimates
- When something is hard or risky, say so. Don't soften
- Step-by-step execution, one action at a time during deployments
- When he's wrong, say he's wrong and explain why
- Skip praise. Ship work

THE COMPLETE BUILD PLAN

Execute all phases in order. Do not stop between phases unless you hit a DECISION point or a genuine blocker.

---

PHASE 1 — Scaffold and dependencies

1. Confirm we are in `~/office` and the directory is empty. If not, stop and ask.
2. Initialize Next.js 14 App Router with TypeScript strict mode and Tailwind CSS. Use pnpm. App name: `office`.
3. Install additional dependencies: `@supabase/ssr @supabase/supabase-js @anthropic-ai/sdk date-fns date-fns-tz zod @simplewebauthn/browser`.
4. Initialize git repo, initial commit "Phase 1: scaffold".
5. Create `BUILD_LOG.md` — log every phase as you complete it with timestamps and token usage where relevant.
6. **DECISION:** Ask Khurram for these three values and wait until you have all three before proceeding:
- `ANTHROPIC_API_KEY` (the krm-khurrambadar key value)
- `NEXT_PUBLIC_SUPABASE_URL` (from lacemhfybgqomwpyvsbu project settings → API)
- `SUPABASE_SERVICE_ROLE_KEY` and `NEXT_PUBLIC_SUPABASE_ANON_KEY` (both from same project)
7. Write `.env.local` with all values. Add `.env.local` to `.gitignore`.

---

PHASE 2 — Complete Supabase schema

Show Khurram the following SQL block as one copy-pasteable script. Instruct him to open Supabase SQL Editor for project `lacemhfybgqomwpyvsbu`, paste, and run. Wait for his confirmation before proceeding.

```sql
-- ═══════════════════════════════════════════════════════════════════
-- OFFICE v1 — Complete Schema
-- ═══════════════════════════════════════════════════════════════════

-- CORE TABLES

create table office_people (
id uuid primary key default gen_random_uuid(),
name text not null,
organization text,
role text,
email text,
phone text,
how_met text,
their_asks text,
my_asks text,
last_contact_date date,
next_action text,
next_action_date date,
notes text,
created_at timestamptz default now(),
updated_at timestamptz default now()
);

create table office_meetings (
id uuid primary key default gen_random_uuid(),
meeting_date date not null,
attendees text[] not null,
summary text,
their_promises text,
my_promises text,
follow_up_date date,
created_at timestamptz default now()
);

create table office_tasks (
id uuid primary key default gen_random_uuid(),
description text not null,
linked_person_id uuid references office_people(id) on delete set null,
linked_goal_id uuid,
due_date date,
status text default 'open' check (status in ('open','done','dropped')),
priority text default 'normal' check (priority in ('high','normal','low')),
created_at timestamptz default now(),
completed_at timestamptz
);

create table office_notes (
id uuid primary key default gen_random_uuid(),
content text not null,
source_dump_id uuid,
created_at timestamptz default now()
);

create table office_dumps (
id uuid primary key default gen_random_uuid(),
raw_content text not null,
input_method text check (input_method in ('text','voice','photo')),
processed_at timestamptz,
extraction_summary text,
created_at timestamptz default now()
);

-- GOALS TABLES

create table office_goals (
id uuid primary key default gen_random_uuid(),
description text not null,
horizon text not null check (horizon in ('annual','quarterly','weekly')),
year int,
quarter int,
week_start_date date,
target_date date,
progress_percent int default 0 check (progress_percent between 0 and 100),
status text default 'active' check (status in ('active','done','dropped','deferred')),
parent_goal_id uuid references office_goals(id) on delete set null,
reflection text,
created_at timestamptz default now(),
updated_at timestamptz default now(),
completed_at timestamptz
);

alter table office_tasks add constraint office_tasks_goal_fk
foreign key (linked_goal_id) references office_goals(id) on delete set null;

create table office_reviews (
id uuid primary key default gen_random_uuid(),
horizon text not null check (horizon in ('weekly','quarterly','annual')),
period_start date not null,
period_end date not null,
what_worked text,
what_slipped text,
what_changed text,
next_period_goals text,
completed_at timestamptz default now()
);

-- FINANCE TABLES (Accountant module)

create table office_finance_accounts (
id uuid primary key default gen_random_uuid(),
name text not null,
type text check (type in ('bank','card','cash','payment_gateway','other')),
currency text default 'AED',
current_balance numeric(12,2) default 0,
notes text,
created_at timestamptz default now()
);

create table office_finance_categories (
id uuid primary key default gen_random_uuid(),
name text not null unique,
type text check (type in ('income','expense')),
parent_id uuid references office_finance_categories(id) on delete set null
);

create table office_finance_transactions (
id uuid primary key default gen_random_uuid(),
transaction_date date not null,
type text not null check (type in ('income','expense')),
amount numeric(12,2) not null,
currency text default 'AED',
amount_aed numeric(12,2),
category text,
subcategory text,
vendor_or_client text,
description text,
linked_platform text,
linked_person_id uuid references office_people(id) on delete set null,
linked_goal_id uuid references office_goals(id) on delete set null,
account_id uuid references office_finance_accounts(id) on delete set null,
receipt_url text,
input_method text check (input_method in ('text','voice','photo','manual')),
raw_input text,
created_at timestamptz default now()
);

create table office_finance_recurring (
id uuid primary key default gen_random_uuid(),
name text not null,
type text check (type in ('income','expense')),
amount numeric(12,2) not null,
currency text default 'AED',
frequency text check (frequency in ('monthly','quarterly','annual')),
next_date date not null,
category text,
linked_platform text,
active boolean default true,
created_at timestamptz default now()
);

-- USER PREFERENCES (for passkey device tracking)

create table office_user_preferences (
id uuid primary key default gen_random_uuid(),
user_id uuid references auth.users(id) on delete cascade,
device_name text,
passkey_registered boolean default false,
last_used_at timestamptz default now(),
user_agent text,
created_at timestamptz default now()
);

-- SEED EXPENSE/INCOME CATEGORIES

insert into office_finance_categories (name, type) values
('Client Revenue','income'),
('Grants','income'),
('Investment','income'),
('Other Income','income'),
('AI APIs','expense'),
('Hosting','expense'),
('Domains','expense'),
('Software Subscriptions','expense'),
('Living Expenses','expense'),
('Travel','expense'),
('Legal & Licensing','expense'),
('Marketing','expense'),
('Freelancers','expense'),
('Meals & Entertainment','expense'),
('Other Expense','expense');

-- RLS — single user, auth required for everything

alter table office_people enable row level security;
alter table office_meetings enable row level security;
alter table office_tasks enable row level security;
alter table office_notes enable row level security;
alter table office_dumps enable row level security;
alter table office_goals enable row level security;
alter table office_reviews enable row level security;
alter table office_finance_accounts enable row level security;
alter table office_finance_categories enable row level security;
alter table office_finance_transactions enable row level security;
alter table office_finance_recurring enable row level security;
alter table office_user_preferences enable row level security;

do $$
declare t text;
begin
for t in
select unnest(array[
'office_people','office_meetings','office_tasks','office_notes','office_dumps',
'office_goals','office_reviews',
'office_finance_accounts','office_finance_categories','office_finance_transactions','office_finance_recurring',
'office_user_preferences'
])
loop
execute format('create policy "authenticated_all" on %I for all to authenticated using (true) with check (true);', t);
end loop;
end $$;

-- INDEXES for performance

create index idx_office_people_name on office_people (lower(name));
create index idx_office_tasks_due on office_tasks (due_date) where status = 'open';
create index idx_office_tasks_status on office_tasks (status);
create index idx_office_meetings_date on office_meetings (meeting_date desc);
create index idx_office_finance_txn_date on office_finance_transactions (transaction_date desc);
create index idx_office_goals_horizon on office_goals (horizon, status);

-- Enable trigram extension for fuzzy name matching
create extension if not exists pg_trgm;
create index idx_office_people_name_trgm on office_people using gin (name gin_trgm_ops);
```

When Khurram confirms the SQL ran successfully, commit "Phase 2: schema live" and continue.

---

PHASE 3 — Supabase auth with passkey biometrics + long session

This is the upgraded auth flow. Khurram uses Face ID on iPhone / Touch ID on Mac to sign in — no passwords, no magic links after first setup on each device.

1. Configure Supabase clients for App Router:
- `lib/supabase/server.ts` — for server components
- `lib/supabase/client.ts` — for client components
- `lib/supabase/middleware.ts` — for edge middleware
Use `@supabase/ssr`.

2. **DECISION:** Ask Khurram to log into Supabase Dashboard for project `lacemhfybgqomwpyvsbu`, go to **Authentication → Sessions**, set:
- Session timeout: **60 days** (5,184,000 seconds)
- Refresh token rotation: **enabled**
- Refresh token reuse interval: **10 seconds**
Wait for confirmation.

3. **DECISION:** Ask Khurram to enable WebAuthn in Supabase Dashboard → Authentication → Providers → WebAuthn (Passkey) → enable. Wait for confirmation.

4. Build `/login` page with two auth methods:

**PRIMARY button:** "Sign in with Face ID / Touch ID"
- Uses `@simplewebauthn/browser` + Supabase WebAuthn challenge API
- On click: call Supabase auth challenge, browser prompts for biometric, on success creates session
- Only shown if user has registered a passkey on this device before (detect via localStorage flag `office_passkey_on_device`)

**FALLBACK:** "Email me a sign-in link"
- Input for email (hardcoded allowlist: only `khurrambadar@gmail.com` proceeds — any other email shows "Access restricted — this is a private system")
- Sends Supabase magic link
- Used for first-time setup on each new device, or if biometrics fail

5. Build `/auth/callback/route.ts` to handle the magic link redirect. After successful session creation, check if this device has a passkey registered. If not, redirect to `/auth/register-device`.

6. Build `/auth/register-device` page shown after first-time magic link login:
- Headline: "Enable Face ID / Touch ID for this device?"
- Body: "Skip the email next time. Sign in with a glance at your phone or a touch on your Mac."
- Two buttons: "Enable" (triggers WebAuthn enrollment) and "Skip for now"
- On enable: call `supabase.auth.mfa.enroll({ factorType: 'webauthn' })`, browser prompts for biometric, keypair generated, public key registered with Supabase
- On success: write `office_passkey_on_device = true` to localStorage, insert row in `office_user_preferences` with device_name (parse from user agent), passkey_registered = true, redirect to `/`

7. Create `middleware.ts` at root:
- Check auth on every request
- Redirect unauthenticated users to `/login` for all routes except `/login`, `/auth/callback`, `/auth/register-device`, static assets, and API endpoints handled separately
- Refresh session automatically on each request so the 60-day window stays fresh

8. Build `/settings/devices` page:
- Lists all rows from `office_user_preferences` for current user
- Shows device name, last used timestamp, registered status
- "Rename" button — inline edit device_name
- "Revoke" button — removes the passkey factor from Supabase and deletes the preferences row
- "Add this device" button (only shown if current device isn't registered) — triggers enrollment flow

9. Write test plan in BUILD_LOG.md for Khurram to execute post-deploy:
- Open `office.khurrambadar.com` on iPhone Safari → enter email → click magic link → prompted to register Face ID → register → close browser → reopen → Face ID prompt → 1-second sign-in ✓
- Same on MacBook with Touch ID ✓
- `/settings/devices` shows both registered ✓
- Wait 61 days, verify magic link fallback still works ✓ (note in log, don't actually test during build)

Note: WebAuthn only works on HTTPS with a real domain. During local dev the Face ID flow won't fully work — only magic link path testable. Full biometric test happens in Phase 14 after deploy.

Commit "Phase 3: auth with passkey + 60-day session".

---

PHASE 4 — Claude Haiku extraction engine

Build the extraction brain that parses dumps into structured data across all modules.

1. Create `/app/api/office/extract/route.ts` — server-side proxy that:
- Accepts `{ content: string, input_method: 'text'|'voice'|'photo' }`
- Loads current context from DB: all active goals, active tasks, recent people (last 30 days), active accounts
- Calls Claude Haiku with a carefully engineered extraction prompt (below)
- Returns structured JSON
- Writes all extracted records to DB
- Returns a summary to the client

2. The extraction system prompt must instruct Claude Haiku to:

```
You are the extraction engine for Khurram's private AI chief of staff.

Parse the dump into this exact JSON schema — NO preamble, NO markdown, ONLY valid JSON:

{
"people": [{ "name": "", "organization": "", "role": "", "email": "", "phone": "", "how_met": "", "their_asks": "", "my_asks": "", "notes": "" }],
"meetings": [{ "meeting_date": "ISO_DATE", "attendees": ["name1"], "summary": "", "their_promises": "", "my_promises": "", "follow_up_date": "ISO_DATE_or_null" }],
"tasks": [{ "description": "", "linked_person_name": "", "linked_goal_description": "", "due_date": "ISO_DATE_or_null", "priority": "high|normal|low" }],
"notes": [{ "content": "" }],
"finance_transactions": [{ "transaction_date": "ISO_DATE", "type": "income|expense", "amount": 0, "currency": "AED", "category": "", "vendor_or_client": "", "description": "", "linked_platform": "" }],
"extraction_summary": "human-readable 1 sentence summary"
}

DATE RESOLUTION: Current Dubai time is {CURRENT_DUBAI_ISO}. Resolve all relative dates ("tomorrow", "next Monday", "in 3 days") to ISO dates relative to this.

GOAL LINKING: Here are current active goals (annual, quarterly, weekly). If a task or expense clearly serves a goal, populate linked_goal_description with that goal's description verbatim. If unclear, leave blank.

{ACTIVE_GOALS_JSON}

RECENT PEOPLE (for fuzzy matching): If a person mentioned matches someone here by name or context, use the existing canonical name. Do NOT create duplicates.

{RECENT_PEOPLE_JSON}

FINANCE DETECTION: If the dump describes money in/out ("paid 185 AED for GoDaddy", "received 2000 USD from sister", "Claude Pro subscription 20 dollars"), treat it as finance_transaction. Detect currency — AED, USD, PKR common for this user. If currency not stated, assume AED for UAE context.

CATEGORIES for finance: {CATEGORIES_JSON}

Be concise. Only extract what's actually in the dump. Do not invent.
```

3. After Claude returns JSON, the route must:
- Deduplicate people using trigram similarity on name + organization. Update existing records if match confidence > 0.7, else create new
- Link task.linked_person_id via fuzzy name match to office_people
- Link task.linked_goal_id via fuzzy description match to office_goals where status='active'
- For finance_transactions: convert amount to AED using a hardcoded rate table (USD 3.67, PKR 0.013, EUR 4.0, GBP 4.65) — store both original currency/amount and amount_aed
- Insert all records, store raw dump in office_dumps with processed_at timestamp
- Log token usage to console (and to BUILD_LOG.md during build)

4. Return to client: `{ summary: "Created 2 people, 1 meeting, 3 tasks, 1 transaction", detail: { ... } }`

Commit "Phase 4: extraction engine".

---

PHASE 5 — Home dump interface with voice and photo

This is the primary interface Khurram will use every day.

1. Home page `/` is the dump interface.
2. Large textarea at the top (min 120px, expands as he types).
3. **Voice button** — prominent mic icon beside the textarea:
- Uses Web Speech API (`webkitSpeechRecognition`)
- Press once to start: button turns red, shows animated waveform bars (simple CSS animation, 5 vertical bars pulsing)
- Continuous listening — transcription streams into textarea live
- Press again to stop
- Language: en-US (v1)
4. **Photo button** — camera icon for receipts, business cards, whiteboard shots:
- Accepts image upload or direct camera capture on mobile (`<input type="file" accept="image/*" capture="environment">`)
- On upload, sends to a separate `/api/office/vision` endpoint
- That endpoint calls Claude Haiku with vision enabled: "Extract all text from this image. Preserve structure. Return plain text only."
- Result goes into textarea for Khurram to review before submitting
5. **Process Dump** button below the textarea:
- Disabled if textarea empty
- On click: POST to `/api/office/extract`, show spinner with message "Office is listening..."
- On success: show green card with extraction_summary ("Created 2 people, 1 meeting, 3 tasks, 1 expense") and a "View details" button that expands to show what was extracted
- Clear textarea after success
6. Clean utility design. System fonts. No gradients. No animations except the voice waveform and the loading spinner. Dark mode default, toggle in header for light. Mobile-responsive.

Commit "Phase 5: dump interface".

---

PHASE 6 — Browse views

Build the four core browse views. Clean tables, minimal UI, full functionality.

**`/people`** — list of all people
- Searchable by name / organization
- Columns: name, organization, last contact, next action
- Click row → `/people/[id]` detail page showing full record + linked meetings + linked tasks + all dumps that mentioned them
- Detail page has inline editable fields (click to edit, save on blur)

**`/meetings`** — chronological list of all meetings, newest first
- Columns: date, attendees, summary preview
- Click → detail page with full notes, promises (both sides), follow-up date
- Filter by date range, by attendee

**`/tasks`** — three sections: Overdue (red), Due Today (yellow), Upcoming (default). Dropped/Done collapsed at bottom
- Checkbox to mark done (sets completed_at, status='done')
- Inline edit of description, due date, priority, linked goal, linked person
- Filter toggles: high priority only, linked to goal X only, linked to person X only

**`/notes`** — chronological feed of all notes
- Search by content
- Click to expand full note
- Delete button

All four views are server components using Supabase server client. Fast, no client-side state bloat.

Commit "Phase 6: browse views".

---

PHASE 7 — Goals system

This is the spine. Khurram met Brian Tracy in 2003 and was told his single biggest issue was goal-setting discipline. This fixes it.

1. `/goals` page with three sections: **Annual**, **Quarterly**, **Weekly**.
2. Each section shows active goals as cards:
- Description
- Progress bar (editable by dragging)
- Target date / period
- Linked tasks count (click to see linked tasks)
- Parent goal reference (weekly cards show their quarterly parent; quarterly show their annual parent)
- Status indicator (active/done/dropped/deferred)
3. "Add goal" form at top of each section — simple: description, target date, parent goal dropdown (for weekly/quarterly).
4. Click any goal → detail view with full reflection notes, linked tasks list, linked transactions (for revenue/spend goals), goal history.
5. On home dashboard `/`, ABOVE the dump interface, show a compact "This week's goals" card:
- List of active weekly goals with inline progress
- Leads every view of Office. Goals first, meetings/tasks second.

Commit "Phase 7: goals".

---

PHASE 8 — Review rituals

1. `/review/weekly` — triggered automatically every Sunday evening (Dubai time) via a visible persistent banner on home page starting Sunday 6pm until completed. Banner text: "Sunday review pending — 10 minutes to reset the week."
2. Weekly review page shows:
- The weekly goals Khurram set last Sunday
- What progress they got
- What tasks got done vs slipped vs dropped
- Three text areas: "What worked", "What slipped", "What to change"
- Section to set next week's 3 goals (linked to current quarterly goals via dropdown)
- Submit button → marks old weekly goals 'done' or 'deferred' based on progress, inserts new weekly goals, creates office_reviews row
3. `/review/quarterly` — same pattern, triggered last Sunday of each quarter.
4. `/review/annual` — same pattern, triggered Dec 15–31.
5. Past reviews viewable at `/review` (list of all past reviews).

Commit "Phase 8: reviews".

---

PHASE 9 — Today brief

The dashboard that greets Khurram every morning.

1. Home page `/` now has this structure (top to bottom):
- **This week's goals** (from Phase 7)
- **Today's priorities** — auto-generated each page load by Claude Haiku via `/api/office/brief`. Calls Claude Haiku with: active weekly goals, today's meetings, today's tasks (open + due today + overdue), follow-ups due in 3 days, recent high-priority notes. Claude Haiku writes a 3-paragraph brief: "Here's what matters today / Here's what's overdue / Here's what's coming up." Cached 2 hours in Supabase.
- **Dump interface** (from Phase 5)
2. Small widgets at the bottom:
- Open tasks count
- Overdue count (red)
- People awaiting follow-up
- This month's net income (from finance)

Commit "Phase 9: today brief".

---

PHASE 10 — Accountant module

1. `/accountant` dashboard:
- **This month P&L** — income, expenses, net. Bar chart of last 6 months. Pie chart of expenses by category.
- **Runway** — at current 30-day burn rate, months of cash remaining based on account balances
- **Per-platform P&L** — table: platform name, revenue, linked costs, margin. Based on `linked_platform` field in transactions
- **Recurring expenses** — list from `office_finance_recurring`, editable, with next_date countdown
2. `/accountant/transactions` — chronological feed of all transactions
- Filters: date range, type, category, platform, person
- Each row inline editable
- Add transaction button (manual entry form)
3. `/accountant/accounts` — list of bank/card/cash accounts
- Add/edit/delete accounts
- Current balance manually adjustable
4. `/accountant/categorize` — when a transaction comes in without a category (low Claude confidence), it appears here for one-tap categorization
5. **Receipt flow** — when Khurram uploads a receipt photo from the home dump, the extraction engine auto-detects it as finance and routes to transactions. If linked_platform is ambiguous, the transaction appears in `/accountant/categorize` for platform assignment
6. **Hardcoded FX rates** in a `lib/fx.ts` file — USD 3.67, PKR 0.013, EUR 4.0, GBP 4.65 to AED. Comment noting rates should be updated quarterly (not auto-fetched in v1)

Commit "Phase 10: accountant".

---

PHASE 11 — Ask Office chat

1. Floating chat button on every page, bottom-right. Click opens a slide-in chat panel.
2. `/api/office/ask` endpoint:
- Takes Khurram's question + recent chat history
- Loads relevant context from DB based on question intent (tasks, people, goals, finance, meetings)
- Calls Claude Haiku with full context and chat history
- Streams response back
3. System prompt for Ask Office:
```
You are Khurram's private office. Answer only from the data provided — never invent facts. When drafting messages, match his tone: direct, warm, professional, no fluff. When asked about progress, goals, finance, or relationships, give him concrete numbers and dates.
```
4. Example queries to handle well:
- "What do I owe Hayda and when?"
- "Draft a follow-up to GMALC about the bilingual proposal"
- "How much did I spend on APIs last month?"
- "Which weekly goals have no linked tasks?"
- "Who have I not contacted in 2 weeks?"
- "What's my runway?"
5. For drafting tasks, the output is formatted as a copy-paste ready message with a "Copy" button.

Commit "Phase 11: ask office".

---

PHASE 12 — Pre-seed data

Create `/api/office/seed` — only runs if `office_people` is empty. Inserts:

**PEOPLE** (10 — Khurram refines via Supabase or `/people` UI):

1. Hayda [last name unknown] — JP Morgan Private Bank, Executive Director — introduced by Elena at networking session — potential gateway to family offices — pitched Dubai's AI House positioning
2. Elena Debache — Runs weekly Dubai networking sessions — introduced Hayda — proposed 75/25 partnership (Khurram countering with 25% sales commission on sourced deals)
3. [Sister — placeholder name] — Runs a nursery in Dubai — client — $2K build for AI nursery platform (parent/teacher face + her private office with AI, accounting, planning) + $250/month maintenance proposal pending written confirmation
4. GMALC Legal — Al Gurg & Al Matrooshi legal firm — Mizan dual-mode platform demo delivered — $4K build + $400/month proposal pending, Arabic capability via Falcon AI71 is the unlock
5. Waleed Abdelkareem — Lawyer at GMALC — handling 7 disbursement cases — awaiting detailed case-by-case email
6. Solomon — Potential client — ~$2K deal — brief pending from him
7. Champion Group Dubai (Shabbir Merchant) — Signage company since 1989 — site rebuilt — potential follow-up revenue ~$2K
8. Dr Rashid Al Ameri — Legacy/book/consulting engagement for drrashidalameri.com — Arabic content bank build pending post-signing
9. Arab partner prospect [name unknown] — Claims access to Arabic companies — testing with "one intro first" ask before any partnership commitment
10. Hub71+ AI contact [TBD] — Abu Dhabi application pending — AED 250K Falcon compute credits + potential AED 250K investment

**GOALS** — pre-seed these exactly:

ANNUAL 2026:
1. Launch Dubai's AI House as the recognized regional AI transformation firm in MENA
2. Close $100K in service revenue across verticals
3. Raise $2–3M seed round from UAE family offices / regional VCs
4. Sign 5 enterprise lighthouse clients across distinct verticals
5. Get accepted into Hub71+ AI

QUARTERLY Q2 2026 (April–June), all parented to relevant annual:
1. Close $6K+ in pilot revenue by May 15 (sister, GMALC, Solomon)
2. Ship bilingual Dubai's AI House brand, deck, landing page at dubaiaihouse.com
3. Submit Hub71+ AI application and get to decision stage
4. Secure 5 warm June meetings with family offices / strategic investors
5. Implement Falcon Arabic on 2 lighthouse demos (ZEROAGENCY + GMALC/Mizan)

WEEKLY (week starting April 21, 2026), all parented to Q2 goals:
1. Lock sister's $2K nursery deal in writing
2. Send GMALC bilingual proposal with Falcon Arabic capability quoted
3. Get Solomon's brief and send proposal within 48 hours of receipt
4. Complete Office v1 build and start daily dumping
5. Sign up for AI71 Platform, Microsoft for Startups, AWS Activate, NVIDIA Inception, Google for Startups

**FINANCE ACCOUNTS** — pre-seed empty records for:
- UAE personal bank account (AED) — balance 0, Khurram updates manually
- Pakistan bank account (PKR) — balance 0
- Business cash on hand (AED) — balance 0
- Stripe (USD, payment_gateway) — balance 0
- PayPal (USD, payment_gateway) — balance 0
- Wise (USD, payment_gateway) — balance 0

**RECURRING EXPENSES** — pre-seed these based on known burn:
- Claude Pro subscription — $20/month (AI APIs)
- Vercel Pro — $20/month (Hosting)
- Supabase Pro — $25/month (Hosting)
- Various domain renewals — ~$10/month average (Domains)
- Various SaaS — ~$50/month (Software Subscriptions)

Commit "Phase 12: seed data".

---

PHASE 13 — Deploy

1. Create private GitHub repo: `khurrambadar3125/office`
2. Push all code
3. Create Vercel project linked to repo. Framework: Next.js. Root directory: ./
4. Add all env vars in Vercel (Production + Preview + Development):
- `ANTHROPIC_API_KEY`
- `NEXT_PUBLIC_SUPABASE_URL`
- `NEXT_PUBLIC_SUPABASE_ANON_KEY`
- `SUPABASE_SERVICE_ROLE_KEY`
5. Trigger first deploy. Confirm build passes.
6. **DECISION:** Walk Khurram through adding custom domain:
- In Vercel project → Settings → Domains → Add `office.khurrambadar.com`
- Vercel will show a CNAME record to add
- In GoDaddy → khurrambadar.com DNS → Add CNAME: `office` → `cname.vercel-dns.com`
- Wait for DNS propagation (5–60 min). Check at `https://www.whatsmydns.net/#CNAME/office.khurrambadar.com`
- Once propagated, Vercel auto-issues SSL
7. **DECISION:** After DNS is live, ask Khurram to go to Supabase Dashboard → Authentication → URL Configuration → add `https://office.khurrambadar.com` to Site URL and Redirect URLs. This is required for magic link and WebAuthn to work on the production domain.
8. Confirm `https://office.khurrambadar.com` loads the login page.

Commit "Phase 13: deployed".

---

PHASE 14 — End-to-end test with Khurram

Run this test suite live with him:

1. Visit `office.khurrambadar.com` on iPhone Safari — redirects to `/login`
2. Enter `khurrambadar@gmail.com` — magic link email arrives
3. Click magic link from iPhone → lands on `/auth/register-device`
4. Click "Enable Face ID" → iOS prompts for Face ID → registers passkey → redirects to home
5. Home loads: sees weekly goals at top, today's brief, dump interface
6. Close Safari, reopen `office.khurrambadar.com` → `/login` shows "Sign in with Face ID" as primary button → tap → Face ID prompt → 1-second sign-in ✓
7. Repeat steps 1–6 on MacBook with Touch ID — both devices now registered
8. `/settings/devices` shows both devices registered ✓
9. Dump this text: *"Just met Hayda at JP Morgan, she'll introduce me to 2 family offices next week, I owe her the Dubai's AI House one-pager by Monday. Paid 74 AED for the dubaiaihouse.com domain."*
10. Verify:
- Hayda record updated with new context
- Meeting record created for today with Hayda
- Task created: "send Dubai's AI House one-pager to Hayda", due Monday, linked to Hayda, linked to goal "Ship bilingual Dubai's AI House brand"
- Finance transaction created: 74 AED expense, category "Domains"
11. Voice test: press mic, dictate *"Just spoke to Solomon, he'll send brief by Friday, I need to follow up Thursday if nothing received."* → verify Solomon updated, task created with Thursday follow-up
12. Photo test: upload a receipt image → verify text extracted and expense created with vendor detected
13. Ask Office test: type "What do I owe Hayda and when?" → verify correct answer referencing the one-pager and Monday
14. Goals test: go to `/goals` → verify all annual, quarterly, weekly goals visible with progress
15. Accountant test: go to `/accountant` → verify the 74 AED domain expense appears in monthly totals

If all 15 pass: Session complete. Update BUILD_LOG.md with final status, commit "v1 complete", push. Tell Khurram:

> "Office v1 is live at office.khurrambadar.com. Start dumping after every interaction. Sunday evening you'll get the weekly review prompt — 10 minutes, don't skip it, this is the Brian Tracy discipline. See you on the other side."

If any test fails: fix before declaring done.

---

FINAL RULES

Start Phase 1 now. Confirm directory is empty, then proceed.

← UPSKILLFREE.COM — Product Requirements Document (PRD)Model Any YouTube Channel With Claude AI — Full Workflow →
Two years of working thought, indexed.
Ask me to present it in your conference room — WhatsApp +971 55 623 9111
Book Session →