Skip to main content
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.

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. 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. 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. 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. 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. Automation action: send_email — send templated email with {{variables}} from trigger payload

6. Automations

Event-driven workflow engine with 12 action types. One-line integration: triggerAutomation(supabase, { event, organization_id, payload })

7. Content & pages

Rich content system for custom pages, blogs, and SEO. Platform SDK: platform.content.page(), platform.content.list(), platform.blog.list(), platform.blog.get()

8. Analytics & tracking

Comprehensive analytics across multiple providers. External API: POST /api/external/analytics — full analytics with filters, comparisons, timeseries

9. Search & discovery

Full-text search with faceted filtering. Platform SDK: platform.jobs.search(), platform.jobs.metadata()

10. Scraping & data import

Automated job aggregation from external sources.

11. Organization & multi-tenancy

Full multi-tenant architecture.

12. Chat & realtime

Live communication features.

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)

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 jobssaved_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)

  1. AI candidate matching — use the embedding infrastructure from the scraper to match candidates to jobs. Show “recommended jobs” and “recommended candidates”. ~5-7 days.
  2. Resume database search — index resumes in Meilisearch, add search UI in dashboard, gate behind paywall. ~3-5 days.

Phase 3 — Employer experience (retention)

  1. ATS pipeline — stages, transitions, team comments, basic interview scheduling. ~7-10 days.
  2. Employer branding pages — rich company profiles with media, culture, benefits. ~3-4 days.

Phase 4 — Community & engagement

  1. 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: 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:
No new middleware. No new auth patterns. No new database clients. Just function calls.