> ## Documentation Index
> Fetch the complete documentation index at: https://kardow.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Kardow Platform Audit – Primitives, Capabilities & Gaps

> Complete investigation of the Kardow job board platform: every primitive available, what the system can do today, current limitations, and what's needed for a 10x platform in 2026.

This is a full platform audit — every primitive, what the AI editor can call, what users can build, and where the gaps are.

***

## Platform architecture at a glance

Kardow is a multi-tenant job board builder. Each organization gets a fully isolated job board with its own domain, branding, categories, payment plans, and user base.

| Layer           | Technology                          |
| --------------- | ----------------------------------- |
| Frontend        | Next.js 15 (App Router)             |
| Database        | Supabase (PostgreSQL + RLS)         |
| Search          | Meilisearch (full-text, faceted)    |
| Payments        | Stripe (primary), PayPal, Polar     |
| Email           | Resend, AWS SES, Custom SMTP        |
| Caching         | Redis + Cloudflare Edge             |
| AI              | Vercel AI SDK, OpenAI, custom tools |
| Analytics       | Plausible + Tinybird                |
| Realtime        | Centrifugo                          |
| Background Jobs | QStash (Upstash)                    |
| Scraping        | Custom engine + ATS connectors      |
| Workers         | Cloudflare Workers                  |
| Templates       | Platform SDK + custom Next.js apps  |

***

## All primitives available today

These are the building blocks your AI editor and users can call.

### 1. Jobs

The core primitive. Full lifecycle: create → approve → publish → expire → delete.

| Primitive          | How to access                                                                          |
| ------------------ | -------------------------------------------------------------------------------------- |
| Create job         | Dashboard, API (`POST /api/external/jobs`), scraper import, CSV import, AI bulk create |
| Update job         | Dashboard editor, API                                                                  |
| Delete job         | Dashboard, API                                                                         |
| Approve job        | Dashboard (admin)                                                                      |
| Search jobs        | Meilisearch (full-text, faceted by category/location/type/salary)                      |
| Similar jobs       | AI-powered similarity matching                                                         |
| Job form templates | Custom fields per org, configurable required/optional                                  |
| Job categories     | Configurable per org with AI categorization                                            |
| Job locations      | Structured locations with Mapbox geocoding                                             |
| Job types          | Full-time, part-time, contract, internship, freelance                                  |
| Salary data        | Structured salary ranges with currency                                                 |
| Media assets       | Images + video (Cloudflare Stream)                                                     |
| Sticky/highlighted | Premium placement options                                                              |
| Remote flag        | Remote work indicator                                                                  |
| Expiry             | Auto-expiry with configurable duration                                                 |

**Platform SDK**: `platform.jobs.search()`, `platform.jobs.get()`, `platform.business.postJob()`

**Automation triggers**: `job.created`, `job.created.user`, `job.created.admin`, `job.created.scraper`, `job.updated`, `job.approved`, `job.expired`, `job.deleted`

***

### 2. Users & roles

Multi-role user system with per-org isolation.

| Primitive          | How to access                               |
| ------------------ | ------------------------------------------- |
| Create user        | Signup form, admin dashboard, API           |
| User roles         | Employer, Candidate, Admin (per org)        |
| User approval      | Manual approval workflow with custom fields |
| User profiles      | Name, email, phone, resume, custom fields   |
| Custom auth fields | Configurable signup fields per org          |
| OAuth login        | Google, GitHub, and other providers         |
| OTP login          | Email-based passwordless login              |
| MFA                | Multi-factor authentication                 |

**Platform SDK**: `platform.auth.login()`, `platform.auth.signup()`, `platform.employee.profile()`, `platform.business.userInfo()`

**Automation triggers**: `user.created`, `user.created.employer`, `user.created.candidate`, `user.created.admin`, `user.updated`

***

### 3. Applications

Full application tracking from submission to decision.

| Primitive                 | How to access                                             |
| ------------------------- | --------------------------------------------------------- |
| Submit application        | Public job page form                                      |
| Custom application fields | Configurable form fields per org                          |
| Resume processing         | AI-powered resume parsing                                 |
| Application tracking      | Status workflow (received → reviewed → accepted/rejected) |
| Candidate management      | Dashboard candidate pool                                  |
| Application export        | CSV export                                                |

**Platform SDK**: `platform.apply.submit()`, `platform.employee.applications()`, `platform.business.candidates()`

**Automation triggers**: `application.created`, `application.updated`, `application.status_changed`

***

### 4. Payments & subscriptions

Stripe-first payment system with multiple plan types and paywalls.

| Primitive              | How to access                                              |
| ---------------------- | ---------------------------------------------------------- |
| Payment plans          | Create plans with Stripe price IDs                         |
| Plan types             | Lifetime single, monthly single, monthly unlimited         |
| Subscription lifecycle | Create → active → cancel → expired                         |
| Stripe Connect         | Multi-seller marketplace payments                          |
| Credits system         | 600 credits per subscription, spend on features            |
| Paywall                | Gate content behind subscription (configurable free limit) |
| Billing portal         | Stripe-hosted billing management                           |
| Coupons                | Stripe coupon integration                                  |
| PayPal                 | Alternative payment method                                 |
| Polar                  | Alternative payment method                                 |

**Platform SDK**: `platform.payments.plans()`, `platform.payments.createCheckout()`, `platform.payments.billing()`, `platform.paywall.plans()`, `platform.paywall.checkSubscription()`

**Automation triggers**: `subscription.created`, `subscription.cancelled`, `subscription.updated`, `payment.succeeded`, `payment.failed`, `invoice.created`

***

### 5. Email system

Multi-provider email with templates, campaigns, and analytics.

| Primitive                | How to access                                            |
| ------------------------ | -------------------------------------------------------- |
| Send transactional email | `sendJobEmail()`, `sendWelcomeEmail()`, `sendOtpEmail()` |
| Email providers          | Resend, AWS SES, Custom SMTP (configurable per org)      |
| Email templates          | HTML templates with variable interpolation               |
| Email campaigns          | Newsletter campaigns with segments                       |
| Email analytics          | Open rates, click tracking                               |
| Subscriber management    | Subscribe/unsubscribe, preferences                       |
| Email queue              | QStash-backed async delivery with monthly limits         |
| Inbound email            | Receive and process incoming emails                      |
| Suppression lists        | Manage bounces and complaints                            |

**Automation action**: `send_email` — send templated email with `{{variables}}` from trigger payload

***

### 6. Automations

Event-driven workflow engine with 12 action types.

| Primitive         | How to access                                        |
| ----------------- | ---------------------------------------------------- |
| Trigger on events | 27 events across jobs, users, applications, payments |
| Send email        | Templated transactional emails                       |
| Send webhook      | POST data to any URL                                 |
| HTTP request      | Any method, any URL, custom headers/body             |
| Wait/delay        | QStash-backed delays that survive restarts           |
| Notifications     | Discord/Slack webhook messages                       |
| Run Worker        | Execute Cloudflare Workers                           |
| Condition         | If/stop branching on payload fields                  |
| Update record     | Write to database                                    |
| Create record     | Insert into database                                 |
| Fetch data        | Pull from JSON APIs, RSS, XML feeds                  |
| Filter/transform  | Filter items, map fields, assign users               |
| Loop              | Iterate over items, run downstream actions per item  |
| Schedule          | Cron-based scheduled execution (hourly to weekly)    |

**One-line integration**: `triggerAutomation(supabase, { event, organization_id, payload })`

***

### 7. Content & pages

Rich content system for custom pages, blogs, and SEO.

| Primitive      | How to access                          |
| -------------- | -------------------------------------- |
| Custom pages   | Plate.js rich text editor              |
| Blog system    | Blog posts with SEO metadata           |
| Template pages | Auto-generated location/category pages |
| SEO metadata   | Title, description, OG tags per page   |
| i18n content   | Multi-language content support         |
| Footer pages   | Terms, privacy, about                  |

**Platform SDK**: `platform.content.page()`, `platform.content.list()`, `platform.blog.list()`, `platform.blog.get()`

***

### 8. Analytics & tracking

Comprehensive analytics across multiple providers.

| Primitive          | How to access                              |
| ------------------ | ------------------------------------------ |
| Page analytics     | Views, visitors, bounce rate, time on page |
| Job analytics      | Per-job views, applications, click-through |
| Company analytics  | Per-company engagement metrics             |
| Traffic sources    | UTM tracking, referrer analysis            |
| Geographic data    | Country/city visitor distribution          |
| Device/browser     | Device type, browser, OS breakdown         |
| Real-time visitors | Live visitor count                         |
| Email analytics    | Open rates, click rates, delivery stats    |
| Scheduled reports  | Automated analytics email reports          |
| Tinybird           | Real-time analytics pipeline               |

**External API**: `POST /api/external/analytics` — full analytics with filters, comparisons, timeseries

***

### 9. Search & discovery

Full-text search with faceted filtering.

| Primitive          | How to access                     |
| ------------------ | --------------------------------- |
| Full-text search   | Meilisearch-powered job search    |
| Category filtering | Filter by job category            |
| Location filtering | Filter by location (structured)   |
| Job type filtering | Filter by employment type         |
| Salary filtering   | Filter by salary range            |
| Remote filter      | Filter remote positions           |
| Similar jobs       | AI-powered similarity suggestions |
| Autocomplete       | Search suggestions                |
| Advanced search    | Multi-faceted advanced search UI  |

**Platform SDK**: `platform.jobs.search()`, `platform.jobs.metadata()`

***

### 10. Scraping & data import

Automated job aggregation from external sources.

| Primitive            | How to access                     |
| -------------------- | --------------------------------- |
| Web scraper          | Custom scraping engine            |
| ATS connectors       | Workday, Greenhouse, Workland     |
| CSV import           | Bulk import with AI field mapping |
| Company enrichment   | Automatic company data and logos  |
| Location enrichment  | AI-powered location parsing       |
| Salary normalization | Standardized salary data          |
| Scheduled imports    | Automation-driven data pipelines  |
| Google indexing      | Automated Google search indexing  |

***

### 11. Organization & multi-tenancy

Full multi-tenant architecture.

| Primitive      | How to access                      |
| -------------- | ---------------------------------- |
| Organizations  | Create, manage, transfer ownership |
| Members        | Invite, roles (owner/admin/member) |
| Custom domains | Branded domains per org            |
| White label    | Remove Kardow branding             |
| Branding       | Colors, logos, themes              |
| Dark mode      | Theme support                      |
| Translations   | i18n per org                       |
| API keys       | External API access tokens         |
| Subdomains     | Auto-generated subdomains          |

***

### 12. Chat & realtime

Live communication features.

| Primitive         | How to access                  |
| ----------------- | ------------------------------ |
| Chat widget       | Embeddable chat for job boards |
| Conversations     | Threaded conversations         |
| Typing indicators | Real-time typing status        |
| Presence          | Online/offline user status     |
| Discord alerts    | Chat-to-Discord notifications  |

***

### 13. Platform SDK (for custom templates)

The Platform SDK is the interface custom Next.js templates use to access all platform data. Every method listed above under "Platform SDK" is callable from template code.

**Available to AI editor**: The AI editor (AI chat) can modify template pages that call these SDK methods. It can build any UI that the SDK data supports.

**Key SDK modules**: `platform.jobs`, `platform.auth`, `platform.payments`, `platform.business`, `platform.employee`, `platform.config`, `platform.content`, `platform.companies`, `platform.blog`, `platform.paywall`, `platform.carousel`, `platform.badge`, `platform.templatePages`

***

## What the AI editor can build today

Using the Platform SDK + automations + existing primitives:

1. **Custom job board frontends** — any design, any layout, calling `platform.jobs.search()`
2. **Employer dashboards** — job management, candidate tracking via `platform.business.*`
3. **Candidate portals** — application tracking, profile management via `platform.employee.*`
4. **Subscription flows** — checkout, billing, paywall gates via `platform.payments.*`
5. **Blog & content sites** — blog posts, custom pages via `platform.content.*`
6. **Company directory pages** — company profiles, job listings via `platform.companies.*`
7. **Location/category landing pages** — SEO-optimized template pages via `platform.templatePages.*`
8. **Job alert signup** — newsletter subscription via `platform.subscribe.*`
9. **Badge widgets** — embeddable job count badges via `platform.badge.*`
10. **Featured job carousels** — premium placement displays via `platform.carousel.*`

***

## Current limitations — what's blocking a 10x platform

### Critical gaps (high impact, needed for competitive parity)

#### 1. No applicant tracking system (ATS) for employers

**What's missing**: Employers can see applications but can't manage a hiring pipeline. No stages (phone screen → interview → offer), no collaborative hiring (comments, ratings), no interview scheduling, no offer management.

**Why it matters**: Every serious job board (LinkedIn, Indeed, ZipRecruiter) includes ATS features. Employers who post on Kardow boards still need a separate ATS tool.

**What's needed**: Pipeline stages table, stage transitions, team comments on candidates, interview scheduling integration (Calendly/Cal.com), offer letter templates.

#### 2. No candidate matching / recommendations

**What's missing**: No "recommended jobs for you" or "recommended candidates for this role". The AI categorization exists but isn't used for matching.

**Why it matters**: Job matching is the #1 feature users expect from a modern job board. LinkedIn, Indeed, and ZipRecruiter all have it. It drives engagement and keeps users coming back.

**What's needed**: Skill extraction from resumes and jobs, embedding-based matching (the scraper package already has vectorization utilities at `packages/scraper/src/utils/embeddings.ts`), recommendation API endpoint, Platform SDK method.

#### 3. No saved jobs / job alerts granularity

**What's missing**: Users can subscribe to email alerts but can't save individual jobs, set up multiple alert filters, or get personalized recommendations.

**Why it matters**: Saved jobs + granular alerts is table stakes for job seekers. It's the #1 re-engagement feature.

**What's needed**: `saved_jobs` table, alert preferences with multiple filter sets, alert frequency options.

#### 4. External API is too limited

**What's missing**: External API only exposes jobs (read/write) and analytics (read). No API for users, applications, subscriptions, categories, or notifications.

**Why it matters**: Users asking for programmatic control over their job board can only manage jobs. They can't build external integrations that create users, manage subscriptions, or read applications.

**What's needed**: Add `/api/external/users`, `/api/external/applications`, `/api/external/subscriptions`, `/api/external/categories` endpoints with the same API key auth pattern.

#### 5. No webhook outbound for all events

**What's missing**: The automation system fires on events internally, but there's no "webhook subscription" API where external tools can register to receive events. Users can set up webhook actions in automations, but they have to configure each one manually in the UI.

**Why it matters**: Modern platforms offer outbound webhooks as a first-class API feature. It's how Stripe, GitHub, and Shopify work — register a URL, get events pushed to you.

**What's needed**: Webhook subscriptions table, webhook registration API endpoint, automatic delivery with retry logic.

***

### Important gaps (moderate impact, differentiators)

#### 6. No community / forum features

**What's missing**: No built-in community features (posts, discussions, groups). Users wanting community features have to use Circle.so or Discord externally.

**Why it matters**: Community engagement keeps users on the platform. Niche job boards like WeWorkRemotely and Hacker News Jobs thrive because of their community. A community module can be built on existing primitives — organizations for isolation, payment\_plans for gating, automations for event-driven workflows.

#### 7. No employer branding pages

**What's missing**: Companies can have logos and basic info but can't create branded employer profiles with culture pages, team photos, benefits, office tours, or embedded videos.

**Why it matters**: Employer branding pages are a monetization opportunity (charge for premium profiles) and a user engagement feature.

#### 8. No resume database search for employers

**What's missing**: Employers can see candidates who apply, but can't search a resume database to proactively find candidates.

**Why it matters**: Resume database access is a premium feature that top job boards monetize. LinkedIn Recruiter is built on this.

**What's needed**: Resume indexing in Meilisearch, search API, paywall integration for gated access.

#### 9. No multi-language job postings

**What's missing**: The i18n system handles UI translations but jobs themselves are single-language. No way to post a job in English and French simultaneously.

**Why it matters**: International job boards need multi-language job content, not just UI translations.

#### 10. No A/B testing for job postings

**What's missing**: No way to test different job titles, descriptions, or application forms to optimize conversion.

**Why it matters**: Data-driven job boards optimize for application rates. A/B testing job titles alone can improve applications by 20-30%.

***

### Nice-to-have gaps (lower priority, future features)

#### 11. No salary benchmarking

Salary data exists but isn't aggregated into benchmarks. Users would benefit from "what's the average salary for X role in Y location?"

#### 12. No job board marketplace

No way for multiple organizations to list on a central marketplace. Each org is fully isolated.

#### 13. No mobile app (native)

The `/apps/mobile` directory exists (Expo) but appears minimal. No deep native features.

#### 14. No referral system

No employee referral tracking or referral bonus management.

#### 15. No compliance features

No EEO/diversity reporting, no GDPR-specific data deletion workflows beyond basic account delete.

***

## What the best job boards in 2026 can do (competitive benchmark)

| Feature                  | LinkedIn | Indeed | ZipRecruiter | Kardow (today)             |
| ------------------------ | -------- | ------ | ------------ | -------------------------- |
| Job posting & management | ✅        | ✅      | ✅            | ✅                          |
| Job search with filters  | ✅        | ✅      | ✅            | ✅                          |
| Applications             | ✅        | ✅      | ✅            | ✅                          |
| ATS pipeline             | ✅        | ✅      | ✅            | ❌                          |
| AI job matching          | ✅        | ✅      | ✅            | ❌                          |
| Resume database search   | ✅        | ✅      | ✅            | ❌ (data exists, no search) |
| Saved jobs               | ✅        | ✅      | ✅            | ❌                          |
| Employer branding pages  | ✅        | ✅      | ✅            | ⚠️ (basic)                 |
| Email alerts             | ✅        | ✅      | ✅            | ✅                          |
| Analytics                | ✅        | ✅      | ✅            | ✅                          |
| Custom domains           | ❌        | ❌      | ❌            | ✅                          |
| White label              | ❌        | ❌      | ❌            | ✅                          |
| Multi-tenant             | ❌        | ❌      | ❌            | ✅                          |
| Automations              | ❌        | ❌      | ❌            | ✅                          |
| Custom templates         | ❌        | ❌      | ❌            | ✅                          |
| Platform SDK             | ❌        | ❌      | ❌            | ✅                          |
| Paywall / monetization   | ✅        | ✅      | ✅            | ✅                          |
| Community                | ✅        | ❌      | ❌            | ❌                          |
| Job scraping             | ❌        | ❌      | ❌            | ✅                          |
| AI content generation    | ✅        | ❌      | ❌            | ✅                          |
| Scheduled imports        | ❌        | ❌      | ❌            | ✅                          |

**Kardow's competitive advantages** over LinkedIn/Indeed/ZipRecruiter: multi-tenancy, white-label, custom templates, Platform SDK, automations, job scraping, scheduled imports. These are "platform builder" features that the big players don't offer because they're not a platform-builder product.

**Kardow's gaps** vs. the big players: ATS pipeline, AI matching, resume database search, saved jobs, community. These are "end-user experience" features.

***

## Priority roadmap recommendations

### Phase 1 — Close the critical end-user gaps (biggest impact)

1. **Expand External API** — add users, applications, subscriptions, categories endpoints. This unblocks all external integrations users are asking for. \~3-4 days.

2. **Saved jobs** — `saved_jobs` table + Platform SDK method + template page. Simple feature, big engagement impact. \~1-2 days.

3. **Outbound webhook subscriptions** — register URLs for events, get automatic delivery. Turns the automation engine into a developer platform. \~3-4 days.

### Phase 2 — Differentiate with AI-first features (unique to Kardow)

4. **AI candidate matching** — use the embedding infrastructure from the scraper to match candidates to jobs. Show "recommended jobs" and "recommended candidates". \~5-7 days.

5. **Resume database search** — index resumes in Meilisearch, add search UI in dashboard, gate behind paywall. \~3-5 days.

### Phase 3 — Employer experience (retention)

6. **ATS pipeline** — stages, transitions, team comments, basic interview scheduling. \~7-10 days.

7. **Employer branding pages** — rich company profiles with media, culture, benefits. \~3-4 days.

### Phase 4 — Community & engagement

8. **Community module** — Spaces with Posts (as designed in the investigation). \~10-12 days.

***

## System health — what works and what needs attention

### What works well ✅

* **Multi-tenancy isolation** — RLS policies enforce complete org separation
* **Payment system** — Stripe integration is mature with Connect, credits, coupons
* **Email system** — multi-provider with queue, analytics, campaigns
* **Scraping engine** — sophisticated with ATS connectors and AI enrichment
* **Analytics** — dual Plausible + Tinybird coverage
* **Automations** — 12 action types, 27 triggers, scheduled pipelines
* **Search** — Meilisearch with faceted filtering
* **Caching** — Redis + Cloudflare edge caching

### What needs attention ⚠️

* **External API coverage** — only jobs and analytics are exposed
* **TypeScript strictness** — pre-existing TS errors in the (app) route group due to missing module type declarations (known codebase-wide issue, not caused by new code)
* **Test coverage** — automations has 352 tests, but most other systems have minimal test coverage
* **Documentation** — API reference only covers jobs and analytics, not the full platform
* **Rate limiting** — implemented but not uniform across all endpoints

***

## File count summary — proving simplicity

The automations system is 5 files:

| File                 | Purpose                                 | Lines |
| -------------------- | --------------------------------------- | ----- |
| `types.ts`           | Type definitions + registry data        | \~180 |
| `engine.ts`          | `triggerAutomation()` + action executor | \~650 |
| `templates.ts`       | Pre-built automation templates          | \~350 |
| `index.ts`           | Re-export barrel                        | \~5   |
| `use-automations.ts` | React hook for dashboard                | \~80  |

**Total**: \~1,265 lines across 5 files. One function import to trigger any automation from any route.

The entire system extends existing routes with single-line additions:

```ts theme={null}
// In any existing route:
triggerAutomation(supabase, { event: 'job.created.user', organization_id: orgId, payload }).catch(console.error);
```

No new middleware. No new auth patterns. No new database clients. Just function calls.
