Skip to content

Commit 440ab1d

Browse files
authored
Merge pull request #1004 from SonicJs-Org/lane711/sonic-competitor-gaps
docs: competitor gaps + SDK plan analysis
2 parents acbe6e3 + f6de512 commit 440ab1d

1 file changed

Lines changed: 100 additions & 0 deletions

File tree

docs/marketing/competitor-gaps.md

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
# SonicJS Competitor Gaps — Developer Interest Analysis
2+
3+
Source: `/compare` feature matrix (`www/src/components/ComparisonMatrix.tsx`), SonicJS
4+
vs Payload, Strapi, Directus, Sanity, Contentful. Data verified July 2026.
5+
6+
This documents the biggest gaps in the SonicJS column that would prevent a developer
7+
from choosing (or even trialing) SonicJS, ranked by severity, plus a proposed SDK plan.
8+
9+
---
10+
11+
## Tier 1 — hard filters (developer bounces before trying)
12+
13+
- **No official SDK** (`no`). All 5 competitors ship one. Developers expect a typed
14+
client with autocomplete out of the box. Biggest DX credibility hit.
15+
- **GraphQL roadmap-only** (`soon`). Payload / Strapi (plugin) / Directus / Sanity /
16+
Contentful all have it. Teams that filter their CMS shortlist on "GraphQL: yes"
17+
never see SonicJS in results.
18+
- **i18n / localization roadmap-only** — content localization, locale fallbacks, and
19+
field-level localization all `soon`; admin UI translations + RTL are `no`. Any
20+
multi-language project is eliminated instantly. Four red rows in one category.
21+
- **Type generation from schema = `partial`**. The killer: the site markets
22+
"TypeScript-first," but competitors auto-generate types from schema and SonicJS is
23+
only partial. The headline DX claim is undercut by its own matrix.
24+
25+
## Tier 2 — serious, surfaces during evaluation
26+
27+
- **Relationship modeling is weak**: one-to-one `partial`, many-to-many `partial`,
28+
polymorphic `partial`, deep population `partial`. Content modeling is a core CMS
29+
job; SonicJS trails all 5 peers here.
30+
- **No conditional fields, no computed/virtual fields, no UI fields** (`no`). Modeling
31+
depth gap — Payload / Strapi / Directus / Sanity are all `yes`.
32+
- **Single DB dialect (SQLite only)**. Postgres is roadmap. Teams with existing
33+
Postgres/Mongo infra can't adopt. Directus / Strapi / Payload flex here.
34+
- **No real-time / WebSockets** (`soon`), **no background jobs / queues** (`no`),
35+
**cron `partial`**. Automation / reactive workloads are blocked.
36+
- **No SSO/SAML** (`soon`), custom access-control functions `no`, row-level access
37+
`partial`. Enterprise evaluation fails.
38+
39+
## Tier 3 — trust / maturity signal
40+
41+
- **~1.6k GitHub stars** vs Strapi ~72k, Payload ~43k, Directus ~36k — roughly
42+
20–45x behind. Developers read stars as a risk proxy ("will this still exist in two
43+
years / is anyone using it").
44+
- **No marketplace** (~25 bundled plugins vs competitors' marketplaces). Small
45+
ecosystem = you build integrations yourself.
46+
- **No visual page builder, no soft-delete/trash, no editorial comments/collaboration.**
47+
Feels less "finished" than incumbents in a side-by-side.
48+
49+
## Sharpest problem
50+
51+
The matrix contradicts SonicJS's own pitch. The site sells **edge speed +
52+
TypeScript-first + free/no-paywall**. Edge speed is real (0–5 ms cold start; the only
53+
option with global edge *and* self-host). But "TypeScript-first" is undermined by
54+
**no SDK + partial type-gen** — the two rows a TS developer checks first. Fixing
55+
SDK + full schema→type generation closes the credibility gap more cheaply than chasing
56+
GraphQL/i18n, and defends the differentiation already claimed.
57+
58+
---
59+
60+
## Proposed SDK plan
61+
62+
The SDK is layered, not one deliverable. Build bottom-up.
63+
64+
### 1. Core: TypeScript/JavaScript client (the actual "SDK") — build first
65+
66+
Framework-agnostic. Wraps the REST + OpenAPI spec SonicJS already emits. Runs
67+
anywhere — Node, Bun, browser, Workers, React Native.
68+
69+
```ts
70+
const sonic = createClient({ url, apiKey })
71+
const posts = await sonic.collection('posts').find({ where, limit })
72+
```
73+
74+
This is what the matrix row means. Competitor equivalents: Sanity `@sanity/client`,
75+
Contentful `contentful.js`, Strapi `@strapi/sdk-js`, Directus `@directus/sdk` — all
76+
JS/TS-first and framework-neutral. This is ~90% of the value and flips the matrix
77+
`no``yes`.
78+
79+
### 2. Type layer — ties to the type-gen gap
80+
81+
Types generated from the collection schema feed the client, so `find('posts')`
82+
returns `Post`, not `any`. This is why the SDK and schema→type-generation are **one
83+
project, not two**. Directus's SDK does exactly this.
84+
85+
### 3. Framework adapters — thin, optional, later
86+
87+
- **React hooks**`useDocument`, `useCollection` (TanStack Query wrapper). Highest
88+
demand; build second.
89+
- **Next.js** helpers — server components / cache tags (Payload's whole pitch).
90+
- Vue / Svelte — later, low priority.
91+
92+
### Recommendation
93+
94+
Ship the **typed JS/TS core client first** — a single framework-agnostic package.
95+
React adapter second (biggest audience). Do **not** start with React: it locks out
96+
everyone else and can't flip the matrix row on its own.
97+
98+
**Edge angle to exploit:** SonicJS runs *on* Workers, so an SDK that works identically
99+
server-side (in the same Worker, zero network hop) and client-side is a differentiator
100+
Sanity/Contentful can't match — their "local / server-side API" rows are `no`.

0 commit comments

Comments
 (0)