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:- Custom job board frontends — any design, any layout, calling
platform.jobs.search() - Employer dashboards — job management, candidate tracking via
platform.business.* - Candidate portals — application tracking, profile management via
platform.employee.* - Subscription flows — checkout, billing, paywall gates via
platform.payments.* - Blog & content sites — blog posts, custom pages via
platform.content.* - Company directory pages — company profiles, job listings via
platform.companies.* - Location/category landing pages — SEO-optimized template pages via
platform.templatePages.* - Job alert signup — newsletter subscription via
platform.subscribe.* - Badge widgets — embeddable job count badges via
platform.badge.* - 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 atpackages/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)
- Expand External API — add users, applications, subscriptions, categories endpoints. This unblocks all external integrations users are asking for. ~3-4 days.
-
Saved jobs —
saved_jobstable + Platform SDK method + template page. Simple feature, big engagement impact. ~1-2 days. - 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)
- AI candidate matching — use the embedding infrastructure from the scraper to match candidates to jobs. Show “recommended jobs” and “recommended candidates”. ~5-7 days.
- Resume database search — index resumes in Meilisearch, add search UI in dashboard, gate behind paywall. ~3-5 days.
Phase 3 — Employer experience (retention)
- ATS pipeline — stages, transitions, team comments, basic interview scheduling. ~7-10 days.
- Employer branding pages — rich company profiles with media, culture, benefits. ~3-4 days.
Phase 4 — Community & engagement
- 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: