Open Call Manager
A multi-tenant SaaS for submission intake, blind review, and marketplace payments
Galleries, festivals, and grant programs run open calls: time-boxed public submission campaigns, most of which charge an entry fee. More than half of them still collect entries through bespoke sites or generic form tools that handle intake and nothing else. There is no review workflow, no status for applicants, and no clean way to take payments on behalf of the organization.
We built Open Call Manager to close that gap. It went from research to MVP in four months, and we designed the system, built it, and run it in production ourselves.
- Configurable intake: per-campaign forms, eligibility rules, file requirements
- Applicant tracking from draft to award, with bulk triage
- Role-based access scoped per organization and per campaign
- Judge assignment, scoring schemes, and blind review enforced in the database
- Entry-fee checkout with marketplace settlement to each organization
- Async processing for images, PDFs, and audio
How We Built It
Data Before Design
Seven purpose-built scrapers collected more than 6,400 open call records, and we profiled 41 competing platforms. The data showed that payments are core to the product, not an add-on, and that no form builder offers a real review pipeline. Only one competitor confirmed blind review at all.
Authorization in the Database
Roles are enforced with Postgres row-level security and column grants. Blind review is a database view that masks identity fields per campaign, so the interface can't leak what the query never returns.
Payments That Hold Up
Each entry gets its own Stripe Checkout session. An entry counts as submitted only when a verified webhook arrives, and Stripe Connect settles fees directly to each organization. Recorded event IDs and per-entry idempotency keys mean a redelivered webhook or a racing refund can't be applied twice.
A Media Tier That Fails Safely
Uploads go straight to object storage. A RabbitMQ queue hands them to a Python worker that normalizes files and builds derivatives under a hardened ImageMagick policy. Failed jobs land in a dead-letter queue instead of disappearing, and the web and media tiers deploy and scale independently.
AI-Assisted, Human-Reviewed
Claude Code implemented each backlog task. A separate model reviewed every pull request, and every finding was filtered by hand before it went back to the builder. The fixes had to come with evidence, such as a test that fails when the bug is reintroduced. The loop caught race conditions, fail-open fee settings, and security tests that couldn't fail.
Quality at Launch
- 127 test files across unit (Vitest), database (pgTAP), and end-to-end (Playwright)
- WCAG 2.2 AA audit before launch: page loads with serious or critical axe violations went from 37 of 48 to 0 of 27, and axe now gates the end-to-end suite
- Database and API attack-model audit, with every high-severity finding fixed
- 68 schema migrations, each reviewed like code
See it running at opencallmanager.com, or talk to us about building something like it.
Tech Stack
- Application
- Svelte / SvelteKitTypeScriptNode.jsPM2
- Data & Auth
- SupabasePostgreSQL
- Payments
- Stripe
- Media Pipeline
- PythonRabbitMQFFmpegImageMagick
- Infrastructure
- DigitalOceannginx
- Quality
- VitestPlaywright
- AI Tools
- Claude CodeGeminiOpenAIMistral AI