Integrating Convex with Expo (React Native)
Use this skill to add, repair, extend, or harden a Convex backend for an Expo app without drifting into web-only patterns or generic React Native advice.
Use this skill for
- Adding Convex to an existing Expo or Expo Router app.
- Fixing broken environment setup, provider wiring, or generated API imports.
- Building an end-to-end feature slice: schema, indexes, backend functions, frontend hooks, and validation.
- Choosing and implementing auth for Expo + Convex.
- Uploading files from Expo URIs into Convex storage.
- Refactoring for pagination, indexes, migrations, or reusable components.
- Hardening a project before preview or production release.
Do not use this skill for
- Pure Expo UI, animation, navigation, or styling work with no Convex involvement.
- Convex projects whose frontend is not Expo or React Native.
- Generic backend architecture discussions that do not need Expo-specific environment or client wiring.
Success criteria
A good outcome should leave the project with:
- A single, correctly scoped Convex client and provider.
- Working
EXPO_PUBLIC_CONVEX_URL handling in local development and EAS.
- Backend functions that match Convex best practices for validators, auth, actions, and query performance.
- Frontend hooks using generated
api references with clear loading, empty, and error states.
- A validation pass using
scripts/validate_project.py.
- A clear path for future growth: pagination, indexes, auth wrappers, migrations, and linting.
Non-negotiables
- Keep
npx convex dev running while developing or repairing the integration.
- Read the deployment URL from
process.env.EXPO_PUBLIC_CONVEX_URL.
- Mirror that value into EAS environments for preview and production builds.
- Create exactly one
ConvexReactClient per app, outside render paths.
- Mount the provider at the true root:
app/_layout.tsx, src/app/_layout.tsx, or App.tsx.
- In Expo and React Native, set
unsavedChangesWarning: false.
- Import generated references from
convex/_generated/api rather than stringly typed names.
- Treat all client-callable Convex functions as untrusted entry points.
- Add
args validators to public functions, and prefer returns validators as well.
- Keep public wrappers thin; move repeated logic into helpers, internal functions, or custom wrappers.
- Do not use
Date.now() or new Date() inside query logic.
- Do not use Node-only APIs or third-party SDKs inside queries or mutations.
- Put external API calls, heavy compute, or Node-only libraries in
action or internalAction files; if a file starts with "use node", keep it action-only.
- Avoid
.filter() and unbounded .collect() on large tables; prefer indexes plus pagination.
- Await every promise.
- Prefer TypeScript strict mode and the official Convex ESLint plugin.
First-pass triage
Before making changes, inspect the project and classify the job.
1. Identify the app entrypoint
Check for:
app/_layout.tsx or src/app/_layout.tsx for Expo Router.
App.tsx or App.jsx for classic entrypoints.
2. Audit Convex state
Look for:
package.json dependencies: convex, expo, auth libraries, ESLint tooling.
convex/ and convex/_generated/.
.env.local, .env, .env.development, .env.production.
eas.json if cloud builds matter.
- Existing provider usage:
ConvexProvider, ConvexProviderWithClerk, or custom auth wrappers.
- Existing schema and indexes in
convex/schema.ts.
- Existing public functions with missing validators, auth checks, or pagination.
3. Run the validator
From the project root:
python scripts/validate_project.py --root <project-root>
Use --json for machine-readable output or --fail-on-warning when you want stricter gating.
4. Choose the workflow
- Bootstrap / repair baseline: missing Convex setup, env vars, provider, or generated API.
- Build a feature slice: add backend data and UI together.
- Auth: add or repair sign-in and backend authorization.
- File uploads: move media or documents from device URIs into Convex storage.
- Scale / harden: indexes, pagination, components, linting, production checklist.
- Migration: reshape existing tables or gradually move from another backend.
Workflow A — Bootstrap or repair the baseline integration
Step 1: Install or confirm the client package
npx expo install convex
Step 2: Create or reconnect the Convex project
npx convex dev
Expect this to:
- create or connect a Convex project,
- create
convex/ if missing,
- generate
convex/_generated/,
- write
EXPO_PUBLIC_CONVEX_URL to .env.local,
- and keep syncing while the command runs.
Step 3: Ensure the root provider exists
For Expo Router:
import { ConvexProvider, ConvexReactClient } from "convex/react";
import { Stack } from "expo-router";
const convex = new ConvexReactClient(process.env.EXPO_PUBLIC_CONVEX_URL!, {
unsavedChangesWarning: false,
});
export default function RootLayout() {
return (
<ConvexProvider client={convex}>
<Stack />
</ConvexProvider>
);
}
For classic App.tsx, wrap the top-level navigation tree the same way.
Step 4: Confirm generated imports
Use:
import { api } from "../convex/_generated/api";
or the correct relative path for the project layout. Do not hand-write function names.
Step 5: Verify development and build environments
Read references/eas-env.md and ensure the same deployment URL policy is reflected in EAS.
Step 6: Validate and smoke-test
- Start the Expo app.
- Confirm
useQuery(...) moves from undefined to real data.
- Run
python scripts/validate_project.py --root <project-root>.
- If needed, scaffold the canonical example with
python scripts/scaffold_tasks_example.py --root <project-root>.
Workflow B — Build a feature slice end to end
Build each feature in the order below.
1. Model the access pattern first
Before touching code, answer:
- Is the data public, user-scoped, org-scoped, or admin-only?
- Will the list stay small, or should it paginate?
- Which fields are lookup keys and therefore need indexes?
- Does any step require an external API, AI SDK, Stripe, or Node API?
2. Design the schema
Add or extend convex/schema.ts before the function layer whenever the model is stabilising.
Use references/schema-and-indexes.md for:
- flat relational modelling,
- foreign-key indexing,
- compound indexes around actual query shapes,
- bounded array guidance,
- and pagination thresholds.
3. Implement backend functions
Use references/functions.md for the detailed patterns.
Default rules:
query for deterministic reads.
mutation for writes.
action or internalAction for external APIs, third-party SDKs, or Node-only code.
internalQuery or internalMutation for logic that should never be callable from the client.
4. Enforce access on the backend
If the feature is not public, do one of these:
- explicit
ctx.auth.getUserIdentity() checks in each function, or
- reusable custom wrappers via
convex-helpers.
See references/auth.md and references/components-and-helpers.md.
5. Wire the frontend
Use references/frontend-patterns.md.
Always handle:
- loading:
useQuery(...) === undefined,
- empty state,
- mutation pending state where relevant,
- recoverable errors,
- and pagination for unbounded lists.
6. Validate the slice
Before finishing:
- run the validator with the project root,
- run lint and typecheck if the project has them,
- verify the feature on device or simulator,
- and update or add indexes before shipping.
Workflow C — Authentication and authorization
Pick one auth story and keep the stack coherent.
Option 1: Clerk
Good when the app already uses Clerk or wants a polished auth product.
Option 2: Convex Auth
Good when you want a Convex-native auth stack and are comfortable adopting a beta library.
Option 3: Existing JWT or OIDC provider
Good when the product already depends on Auth0, WorkOS, a company IdP, or another OIDC flow.
Rules regardless of provider
- Backend authorization is mandatory; client-side gating is only for UX.
- If you persist users in Convex, index by a stable identifier such as
tokenIdentifier.
- Check ownership, organisation membership, or role on every protected function.
- Prefer helper functions or custom wrappers instead of repeating auth boilerplate.
- Use internal functions for privileged internal-only operations.
Read references/auth.md for a decision matrix and implementation patterns.
Workflow D — File uploads from Expo
Use Convex upload URLs rather than trying to push raw files through a mutation.
Recommended flow:
- public or protected mutation returns
ctx.storage.generateUploadUrl(),
- client loads the local
file:// URI with fetch(uri) and converts it to a Blob,
- client
POSTs the blob to the upload URL,
- second mutation stores the returned
storageId plus app-specific metadata,
- optional scheduled or action-based post-processing happens afterwards.
Read references/file-uploads.md.
Workflow E — Scale and harden
Once the baseline works, raise the quality bar.
Performance
- Replace
.filter() scans with indexed queries where possible.
- Replace unbounded
.collect() with take, first, or paginated queries.
- Use
usePaginatedQuery for growing feeds, notifications, and infinite-scroll screens.
- Push repeated or reusable feature areas into Convex components when boundaries are clear.
Safety
- Add validators consistently.
- Keep privileged logic behind internal functions.
- Use
ConvexError or clear return shapes for expected failures.
- Never trust IDs from the client without checking ownership or membership.
Maintainability
- Turn on
@convex-dev/eslint-plugin.
- Use TypeScript strict mode.
- Keep wrappers thin and move shared logic into plain TypeScript helpers.
- Separate
"use node" action files from regular runtime files.
Read references/production-checklist.md.
Workflow F — Migrations
When changing a live schema, prefer additive transitions.
Default migration strategy:
- add new fields or tables in a backwards-compatible way,
- dual-read or dual-write if the shape is changing,
- backfill existing documents in idempotent batches,
- switch readers and writers,
- then remove the old shape.
Use internal functions or scheduled jobs for backfills, and keep migrations restart-safe.
Read references/migrations.md.
Fast troubleshooting path
If the app is broken, check these in order:
- Is
npx convex dev running and free of TypeScript errors?
- Does
.env.local contain EXPO_PUBLIC_CONVEX_URL?
- Was Metro restarted after the env file changed?
- Is there exactly one
ConvexReactClient?
- Is the provider mounted at the real root?
- Does
convex/_generated/api exist, and are imports pointing at it correctly?
- Are public functions missing
args or returns validators?
- Is a query using
Date.now(), .filter(), or unbounded .collect()?
- Is a
"use node" file incorrectly mixing queries or mutations?
- Is auth mismatched between the client provider and the backend config?
See references/troubleshooting.md.
Available scripts
References
Load only the file that matches the current task.
- references/eas-env.md — local envs, EAS envs, and deployment URL handling.
- references/tasks-example.md — canonical minimal example for the stack.
- references/schema-and-indexes.md — schema design, indexes, query shape mapping, and pagination triggers.
- references/functions.md — query, mutation, action, internal function, validators, and runtime boundaries.
- references/frontend-patterns.md — provider placement, hook usage, loading and error states, and paginated lists.
- references/auth.md — Clerk, Convex Auth, JWT or OIDC, user mapping, and server-side authorization.
- references/file-uploads.md — upload URLs, Expo URI handling, metadata storage, and post-processing.
- references/components-and-helpers.md — Convex components and
convex-helpers patterns.
- references/migrations.md — additive rollout, backfills, dual reads and writes, and batched migrations.
- references/production-checklist.md — pre-release hardening checklist.
- references/troubleshooting.md — common failures and exact fixes.
- references/evaluation.md — how to use the bundled trigger and output eval files.
- references/sources.md — upstream docs and materials used for this rewrite.
1---2name: integrating-convex-expo3description: Use this skill when working on an Expo or React Native app that uses, adds, debugs, or migrates to Convex. It covers `npx convex dev`, `EXPO_PUBLIC_CONVEX_URL` and EAS envs, `ConvexReactClient` and provider wiring in `expo-router` or `App.tsx`, generated `api` imports, schema and index design, queries, mutations, actions, auth (Clerk, Convex Auth, JWT or OIDC), file uploads from Expo URIs, pagination, migrations, and common `useQuery` or `_generated` failures. Do not use it for generic Expo UI or navigation work, or for non-Expo Convex frontends unless the task is specifically about adapting them to this mobile stack.4---5
6# Integrating Convex with Expo (React Native)
7
8Use this skill to add, repair, extend, or harden a Convex backend for an Expo app without drifting into web-only patterns or generic React Native advice.
9
10## Use this skill for
11
12- Adding Convex to an existing Expo or Expo Router app.
13- Fixing broken environment setup, provider wiring, or generated API imports.
14- Building an end-to-end feature slice: schema, indexes, backend functions, frontend hooks, and validation.
15- Choosing and implementing auth for Expo + Convex.
16- Uploading files from Expo URIs into Convex storage.
17- Refactoring for pagination, indexes, migrations, or reusable components.
18- Hardening a project before preview or production release.
19
20## Do not use this skill for
21
22- Pure Expo UI, animation, navigation, or styling work with no Convex involvement.
23- Convex projects whose frontend is not Expo or React Native.
24- Generic backend architecture discussions that do not need Expo-specific environment or client wiring.
25
26## Success criteria
27
28A good outcome should leave the project with:
29
301. A single, correctly scoped Convex client and provider.
312. Working `EXPO_PUBLIC_CONVEX_URL` handling in local development and EAS.
323. Backend functions that match Convex best practices for validators, auth, actions, and query performance.
334. Frontend hooks using generated `api` references with clear loading, empty, and error states.
345. A validation pass using `scripts/validate_project.py`.
356. A clear path for future growth: pagination, indexes, auth wrappers, migrations, and linting.
36
37## Non-negotiables
38
39- Keep `npx convex dev` running while developing or repairing the integration.
40- Read the deployment URL from `process.env.EXPO_PUBLIC_CONVEX_URL`.
41- Mirror that value into EAS environments for preview and production builds.
42- Create exactly one `ConvexReactClient` per app, outside render paths.
43- Mount the provider at the true root: `app/_layout.tsx`, `src/app/_layout.tsx`, or `App.tsx`.
44- In Expo and React Native, set `unsavedChangesWarning: false`.
45- Import generated references from `convex/_generated/api` rather than stringly typed names.
46- Treat all client-callable Convex functions as untrusted entry points.
47- Add `args` validators to public functions, and prefer `returns` validators as well.
48- Keep public wrappers thin; move repeated logic into helpers, internal functions, or custom wrappers.
49- Do not use `Date.now()` or `new Date()` inside query logic.
50- Do not use Node-only APIs or third-party SDKs inside queries or mutations.
51- Put external API calls, heavy compute, or Node-only libraries in `action` or `internalAction` files; if a file starts with `"use node"`, keep it action-only.
52- Avoid `.filter()` and unbounded `.collect()` on large tables; prefer indexes plus pagination.
53- Await every promise.
54- Prefer TypeScript strict mode and the official Convex ESLint plugin.
55
56## First-pass triage
57
58Before making changes, inspect the project and classify the job.
59
60### 1. Identify the app entrypoint
61
62Check for:
63
64- `app/_layout.tsx` or `src/app/_layout.tsx` for Expo Router.
65- `App.tsx` or `App.jsx` for classic entrypoints.
66
67### 2. Audit Convex state
68
69Look for:
70
71- `package.json` dependencies: `convex`, `expo`, auth libraries, ESLint tooling.
72- `convex/` and `convex/_generated/`.
73- `.env.local`, `.env`, `.env.development`, `.env.production`.
74- `eas.json` if cloud builds matter.
75- Existing provider usage: `ConvexProvider`, `ConvexProviderWithClerk`, or custom auth wrappers.
76- Existing schema and indexes in `convex/schema.ts`.
77- Existing public functions with missing validators, auth checks, or pagination.
78
79### 3. Run the validator
80
81From the project root:
82
83```bash
84python scripts/validate_project.py --root <project-root>
85```
86
87Use `--json` for machine-readable output or `--fail-on-warning` when you want stricter gating.
88
89### 4. Choose the workflow
90
91- **Bootstrap / repair baseline**: missing Convex setup, env vars, provider, or generated API.
92- **Build a feature slice**: add backend data and UI together.
93- **Auth**: add or repair sign-in and backend authorization.
94- **File uploads**: move media or documents from device URIs into Convex storage.
95- **Scale / harden**: indexes, pagination, components, linting, production checklist.
96- **Migration**: reshape existing tables or gradually move from another backend.
97
98## Workflow A — Bootstrap or repair the baseline integration
99
100### Step 1: Install or confirm the client package
101
102```bash
103npx expo install convex
104```
105
106### Step 2: Create or reconnect the Convex project
107
108```bash
109npx convex dev
110```
111
112Expect this to:
113
114- create or connect a Convex project,
115- create `convex/` if missing,
116- generate `convex/_generated/`,
117- write `EXPO_PUBLIC_CONVEX_URL` to `.env.local`,
118- and keep syncing while the command runs.
119
120### Step 3: Ensure the root provider exists
121
122For Expo Router:
123
124```tsx
125import { ConvexProvider, ConvexReactClient } from "convex/react";
126import { Stack } from "expo-router";
127
128const convex = new ConvexReactClient(process.env.EXPO_PUBLIC_CONVEX_URL!, {
129 unsavedChangesWarning: false,
130});
131
132export default function RootLayout() {
133 return (
134 <ConvexProvider client={convex}>
135 <Stack />
136 </ConvexProvider>
137 );
138}
139```
140
141For classic `App.tsx`, wrap the top-level navigation tree the same way.
142
143### Step 4: Confirm generated imports
144
145Use:
146
147```ts
148import { api } from "../convex/_generated/api";
149```
150
151or the correct relative path for the project layout. Do not hand-write function names.
152
153### Step 5: Verify development and build environments
154
155Read [references/eas-env.md](references/eas-env.md) and ensure the same deployment URL policy is reflected in EAS.
156
157### Step 6: Validate and smoke-test
158
159- Start the Expo app.
160- Confirm `useQuery(...)` moves from `undefined` to real data.
161- Run `python scripts/validate_project.py --root <project-root>`.
162- If needed, scaffold the canonical example with `python scripts/scaffold_tasks_example.py --root <project-root>`.
163
164## Workflow B — Build a feature slice end to end
165
166Build each feature in the order below.
167
168### 1. Model the access pattern first
169
170Before touching code, answer:
171
172- Is the data public, user-scoped, org-scoped, or admin-only?
173- Will the list stay small, or should it paginate?
174- Which fields are lookup keys and therefore need indexes?
175- Does any step require an external API, AI SDK, Stripe, or Node API?
176
177### 2. Design the schema
178
179Add or extend `convex/schema.ts` before the function layer whenever the model is stabilising.
180
181Use [references/schema-and-indexes.md](references/schema-and-indexes.md) for:
182
183- flat relational modelling,
184- foreign-key indexing,
185- compound indexes around actual query shapes,
186- bounded array guidance,
187- and pagination thresholds.
188
189### 3. Implement backend functions
190
191Use [references/functions.md](references/functions.md) for the detailed patterns.
192
193Default rules:
194
195- `query` for deterministic reads.
196- `mutation` for writes.
197- `action` or `internalAction` for external APIs, third-party SDKs, or Node-only code.
198- `internalQuery` or `internalMutation` for logic that should never be callable from the client.
199
200### 4. Enforce access on the backend
201
202If the feature is not public, do one of these:
203
204- explicit `ctx.auth.getUserIdentity()` checks in each function, or
205- reusable custom wrappers via `convex-helpers`.
206
207See [references/auth.md](references/auth.md) and [references/components-and-helpers.md](references/components-and-helpers.md).
208
209### 5. Wire the frontend
210
211Use [references/frontend-patterns.md](references/frontend-patterns.md).
212
213Always handle:
214
215- loading: `useQuery(...) === undefined`,
216- empty state,
217- mutation pending state where relevant,
218- recoverable errors,
219- and pagination for unbounded lists.
220
221### 6. Validate the slice
222
223Before finishing:
224
225- run the validator with the project root,
226- run lint and typecheck if the project has them,
227- verify the feature on device or simulator,
228- and update or add indexes before shipping.
229
230## Workflow C — Authentication and authorization
231
232Pick one auth story and keep the stack coherent.
233
234### Option 1: Clerk
235
236Good when the app already uses Clerk or wants a polished auth product.
237
238### Option 2: Convex Auth
239
240Good when you want a Convex-native auth stack and are comfortable adopting a beta library.
241
242### Option 3: Existing JWT or OIDC provider
243
244Good when the product already depends on Auth0, WorkOS, a company IdP, or another OIDC flow.
245
246### Rules regardless of provider
247
248- Backend authorization is mandatory; client-side gating is only for UX.
249- If you persist users in Convex, index by a stable identifier such as `tokenIdentifier`.
250- Check ownership, organisation membership, or role on every protected function.
251- Prefer helper functions or custom wrappers instead of repeating auth boilerplate.
252- Use internal functions for privileged internal-only operations.
253
254Read [references/auth.md](references/auth.md) for a decision matrix and implementation patterns.
255
256## Workflow D — File uploads from Expo
257
258Use Convex upload URLs rather than trying to push raw files through a mutation.
259
260Recommended flow:
261
2621. public or protected mutation returns `ctx.storage.generateUploadUrl()`,
2632. client loads the local `file://` URI with `fetch(uri)` and converts it to a `Blob`,
2643. client `POST`s the blob to the upload URL,
2654. second mutation stores the returned `storageId` plus app-specific metadata,
2665. optional scheduled or action-based post-processing happens afterwards.
267
268Read [references/file-uploads.md](references/file-uploads.md).
269
270## Workflow E — Scale and harden
271
272Once the baseline works, raise the quality bar.
273
274### Performance
275
276- Replace `.filter()` scans with indexed queries where possible.
277- Replace unbounded `.collect()` with `take`, `first`, or paginated queries.
278- Use `usePaginatedQuery` for growing feeds, notifications, and infinite-scroll screens.
279- Push repeated or reusable feature areas into Convex components when boundaries are clear.
280
281### Safety
282
283- Add validators consistently.
284- Keep privileged logic behind internal functions.
285- Use `ConvexError` or clear return shapes for expected failures.
286- Never trust IDs from the client without checking ownership or membership.
287
288### Maintainability
289
290- Turn on `@convex-dev/eslint-plugin`.
291- Use TypeScript strict mode.
292- Keep wrappers thin and move shared logic into plain TypeScript helpers.
293- Separate `"use node"` action files from regular runtime files.
294
295Read [references/production-checklist.md](references/production-checklist.md).
296
297## Workflow F — Migrations
298
299When changing a live schema, prefer additive transitions.
300
301Default migration strategy:
302
3031. add new fields or tables in a backwards-compatible way,
3042. dual-read or dual-write if the shape is changing,
3053. backfill existing documents in idempotent batches,
3064. switch readers and writers,
3075. then remove the old shape.
308
309Use internal functions or scheduled jobs for backfills, and keep migrations restart-safe.
310
311Read [references/migrations.md](references/migrations.md).
312
313## Fast troubleshooting path
314
315If the app is broken, check these in order:
316
3171. Is `npx convex dev` running and free of TypeScript errors?
3182. Does `.env.local` contain `EXPO_PUBLIC_CONVEX_URL`?
3193. Was Metro restarted after the env file changed?
3204. Is there exactly one `ConvexReactClient`?
3215. Is the provider mounted at the real root?
3226. Does `convex/_generated/api` exist, and are imports pointing at it correctly?
3237. Are public functions missing `args` or `returns` validators?
3248. Is a query using `Date.now()`, `.filter()`, or unbounded `.collect()`?
3259. Is a `"use node"` file incorrectly mixing queries or mutations?
32610. Is auth mismatched between the client provider and the backend config?
327
328See [references/troubleshooting.md](references/troubleshooting.md).
329
330## Available scripts
331
332- `scripts/validate_project.py`
333 - Validates the project rooted at `--root` or, if copied into a repo, the current working tree.
334 - Validates Expo and Convex dependencies.
335 - Checks env files, provider wiring, generated code, validator presence, `"use node"` misuse, and common query anti-patterns.
336 - Supports `--json`, `--root`, and `--fail-on-warning`.
337
338- `scripts/scaffold_tasks_example.py`
339 - Dry-run by default.
340 - Can generate `sampleData.jsonl`, `convex/schema.ts`, `convex/tasks.ts`, and an optional Expo screen file.
341 - Supports `--write`, `--overwrite`, `--ui-file`, and `--json`.
342
343## References
344
345Load only the file that matches the current task.
346
347- [references/eas-env.md](references/eas-env.md) — local envs, EAS envs, and deployment URL handling.
348- [references/tasks-example.md](references/tasks-example.md) — canonical minimal example for the stack.
349- [references/schema-and-indexes.md](references/schema-and-indexes.md) — schema design, indexes, query shape mapping, and pagination triggers.
350- [references/functions.md](references/functions.md) — query, mutation, action, internal function, validators, and runtime boundaries.
351- [references/frontend-patterns.md](references/frontend-patterns.md) — provider placement, hook usage, loading and error states, and paginated lists.
352- [references/auth.md](references/auth.md) — Clerk, Convex Auth, JWT or OIDC, user mapping, and server-side authorization.
353- [references/file-uploads.md](references/file-uploads.md) — upload URLs, Expo URI handling, metadata storage, and post-processing.
354- [references/components-and-helpers.md](references/components-and-helpers.md) — Convex components and `convex-helpers` patterns.
355- [references/migrations.md](references/migrations.md) — additive rollout, backfills, dual reads and writes, and batched migrations.
356- [references/production-checklist.md](references/production-checklist.md) — pre-release hardening checklist.
357- [references/troubleshooting.md](references/troubleshooting.md) — common failures and exact fixes.
358- [references/evaluation.md](references/evaluation.md) — how to use the bundled trigger and output eval files.
359- [references/sources.md](references/sources.md) — upstream docs and materials used for this rewrite.