Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
6b35779
docs: scaffold React Router v7 static app (replace Next/Fumadocs)
pratyush618 Jun 21, 2026
6666875
docs: port prototype design system (dark + warm-light theme)
pratyush618 Jun 21, 2026
9504bb7
docs: MDX content pipeline — render + prerender all pages
pratyush618 Jun 21, 2026
b5313a4
docs: docs shell — nav, SDK sidebar switch, TOC, prev/next
pratyush618 Jun 21, 2026
89ef730
docs: polyglot landing page (Python/Node hero, sections)
pratyush618 Jun 21, 2026
d4328b1
docs: ⌘K search modal + llms.txt routes
pratyush618 Jun 21, 2026
721ef45
docs: rewire Pages deploy to React Router static build
pratyush618 Jun 21, 2026
0fd2a5e
docs: opt into React Router v8 future flags
pratyush618 Jun 21, 2026
6e0f920
docs: add landing-page layout CSS (hero, sections, terminal)
pratyush618 Jun 21, 2026
7f6be00
docs: fix MDX code blocks to match theme (shiki [data-theme] switch)
pratyush618 Jun 21, 2026
1900d49
docs: wrap MDX code blocks in design codeblock panel + copy button
pratyush618 Jun 21, 2026
bea8fc8
docs(perf): lazy per-route MDX + build-time manifest (kill 3.9MB sear…
pratyush618 Jun 21, 2026
b95fa61
docs: split app.css into modular style files
pratyush618 Jun 21, 2026
b9a39d1
docs: rebuild landing to authentic prototype CSS + DOM
pratyush618 Jun 21, 2026
f3fddd0
docs: port architecture diagrams to prototype-faithful React components
pratyush618 Jun 21, 2026
93d46bd
docs: interactive mesh work-stealing demo (port arch.js meshdemo)
pratyush618 Jun 21, 2026
d2511e7
docs: breadcrumb + sidebar search pill
pratyush618 Jun 21, 2026
77001b2
fix(docs): match how-it-works diagram to prototype
pratyush618 Jun 21, 2026
32af038
fix(docs): re-render doc page on client-side navigation
pratyush618 Jun 21, 2026
e7b21e9
feat(docs): port remaining arch diagrams to match prototype
pratyush618 Jun 21, 2026
aee414c
fix(docs): rebuild on-this-page TOC when lazy content mounts
pratyush618 Jun 21, 2026
c16435f
feat(docs): grouped command palette with browse-on-open
pratyush618 Jun 21, 2026
9a124ba
feat(docs): collapsible sidebar nav groups
pratyush618 Jun 21, 2026
dbe202b
feat(docs): wrap markdown tables in md-table shell
pratyush618 Jun 21, 2026
3aeed5d
feat(docs): make landing hero Python-focused
pratyush618 Jun 21, 2026
7badd92
fix(docs): drop Node from landing page title/meta
pratyush618 Jun 21, 2026
dce649c
refactor(docs): restructure Node SDK nav to mirror Python
pratyush618 Jun 21, 2026
dee6b35
feat(docs): wire Node nav + split contrib into integrations
pratyush618 Jun 21, 2026
13af1b1
docs(node): getting started — install, quickstart, concepts
pratyush618 Jun 21, 2026
e5a4792
docs(node): core guides — tasks, queues, workers, scheduling
pratyush618 Jun 21, 2026
0397da2
docs(node): reliability guides — retries, locks, DLQ, breakers
pratyush618 Jun 21, 2026
51abd0b
docs(node): extensibility — events, middleware, webhooks, serializers
pratyush618 Jun 21, 2026
6f698a9
docs(node): operations — backends, dashboard, mesh, cli, deploy
pratyush618 Jun 21, 2026
75e5717
docs(node): API reference
pratyush618 Jun 21, 2026
7996889
fix(docs): remove Node link from top nav
pratyush618 Jun 21, 2026
e03ac3e
feat(docs): show shared Architecture group in Node sidebar
pratyush618 Jun 21, 2026
83a007a
docs: add Seq flow diagrams to key lifecycle pages
pratyush618 Jun 21, 2026
85882b1
refactor(docs): move Python docs under /python URLs
pratyush618 Jun 21, 2026
3bf7ea5
feat(docs): add TypeScript snippet + quickstart link to hero
pratyush618 Jun 21, 2026
9dd6e2f
feat(docs): show Python + TypeScript quickstart links in hero
pratyush618 Jun 21, 2026
cae7d12
feat(docs): global SDK store + useSdk hook with no-flash boot
pratyush618 Jun 21, 2026
3aa8df3
feat(docs): SDK-aware MDX components (CodeTabs, SdkOnly, SdkLink)
pratyush618 Jun 21, 2026
a23658f
feat(docs): drive nav + sidebar from SDK store, collapsible groups
pratyush618 Jun 21, 2026
b694169
refactor(docs): move engine + resources pages to shared URLs
pratyush618 Jun 21, 2026
4664a27
feat(docs): redirect moved doc URLs to new homes
pratyush618 Jun 21, 2026
c817bcb
feat(docs): wire landing hero to SDK store
pratyush618 Jun 21, 2026
c9bf11b
feat(docs): wire landing search, scope results to selected SDK
pratyush618 Jun 21, 2026
5574d2f
chore(docs): drop vestigial root + python meta.json
pratyush618 Jun 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 5 additions & 2 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ jobs:
run: pnpm install --frozen-lockfile

- name: Type check
run: pnpm types:check
run: pnpm typecheck

- name: Lint
run: pnpm lint
Expand All @@ -54,11 +54,14 @@ jobs:
DOCS_BASE_PATH: /taskito
run: pnpm build

- name: SPA fallback for client-side routes
run: cp build/client/__spa-fallback.html build/client/404.html

- name: Upload Pages artifact
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
uses: actions/upload-pages-artifact@v5
with:
path: docs/out
path: docs/build/client

deploy:
needs: build
Expand Down
5 changes: 4 additions & 1 deletion docs/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,7 @@ yarn-error.log*
# others
.env*.local
.vercel
next-env.d.ts
next-env.d.ts
# React Router
.react-router/
build/
76 changes: 39 additions & 37 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -1,47 +1,49 @@
# docs
# Taskito docs

This is a Next.js application generated with
[Create Fumadocs](https://github.com/fuma-nama/fumadocs).
The Taskito documentation site — a polyglot (Python + Node.js) docs site built with
[React Router v7](https://reactrouter.com) in framework mode, statically prerendered
to HTML for GitHub Pages.

It is a Next.js app with [Static Export](https://nextjs.org/docs/app/guides/static-exports) configured.
## Stack

Run development server:
- **React Router v7** (framework mode, `ssr: false` + `prerender`) — static export to
`build/client/`.
- **MDX** via `@mdx-js/rollup` — the content under `content/docs/**/*.mdx` is the source,
compiled at build and rendered through the component map in `app/components/mdx/`.
- **Shiki** for build-time code highlighting; **Mermaid** (client-side) for diagrams.
- **Tailwind v4** + a ported design system in `app/app.css` (dark + warm-light themes).
- **MiniSearch** for the client-side ⌘K search index.

## Develop

```bash
npm run dev
# or
pnpm dev
# or
yarn dev
pnpm install
pnpm dev # local dev server
pnpm typecheck # react-router typegen + tsc
pnpm lint # biome
pnpm build # static prerender → build/client/
pnpm start # serve the built output
```

Open http://localhost:3000 with your browser to see the result.

## Explore

In the project, you can see:

- `lib/source.ts`: Code for content source adapter, [`loader()`](https://fumadocs.dev/docs/headless/source-api) provides the interface to access your content.
- `lib/layout.shared.tsx`: Shared options for layouts, optional but preferred to keep.

| Route | Description |
| ------------------------- | ------------------------------------------------------ |
| `app/(home)` | The route group for your landing page and other pages. |
| `app/docs` | The documentation layout and pages. |
| `app/api/search/route.ts` | The Route Handler for search. |
Set `DOCS_BASE_PATH=/taskito` to build under the GitHub Pages base path (CI does this).

### Fumadocs MDX
## Layout

A `source.config.ts` config file has been included, you can customise different options like frontmatter schema.

Read the [Introduction](https://fumadocs.dev/docs/mdx) for further details.

## Learn More

To learn more about Next.js and Fumadocs, take a look at the following
resources:
```
content/docs/**/*.mdx the documentation source (+ meta.json nav)
app/
root.tsx document shell, fonts, no-flash theme
routes.ts route config (landing, llms.txt, docs catch-all)
routes/ home, docs-layout, docs.$ (MDX page), llms[.txt]
components/
landing/ polyglot landing sections
docs/ sidebar, SDK switch, TOC, prev/next, search modal
mdx/ Callout/Tabs/Card shims + MDX component map
ui/ nav, theme toggle, RawHtml
animated/ diagram components (reused in MDX)
lib/ content glob, nav tree, search index, theme, highlighters
```

- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js
features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
- [Fumadocs](https://fumadocs.dev) - learn about Fumadocs
Adding a page: drop an `.mdx` file under `content/docs/`, add it to the directory's
`meta.json`. It is picked up, prerendered, indexed for search, and slotted into the
sidebar automatically.
12 changes: 12 additions & 0 deletions docs/app/app.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
@import "tailwindcss";

/* Design system, split by concern. tokens first — every module uses var(--*). */
@import "./styles/tokens.css";
@import "./styles/atoms.css";
@import "./styles/cmdk.css";
@import "./styles/docs.css";
@import "./styles/changelog.css";
@import "./styles/diagrams.css";
@import "./styles/landing.css";
@import "./styles/shiki.css";
@import "./styles/sdk.css";
166 changes: 166 additions & 0 deletions docs/app/components/diagrams/arch-stack.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
import { type CSSProperties, Fragment, type ReactNode } from "react";

// Layered architecture stack — exact port of the prototype's `.archstack` HTML
// (semantic layers + PyO3/store boundaries as direct children).

type Kind = "py" | "rust" | "store" | "";

interface Layer {
tag: string;
/** Pill colour: `.ltag t-*`. */
tagKind?: Kind;
/** `.layer` modifier; defaults to `tagKind`. The prototype sometimes pairs a
* `rust` layer surface with a `py` pill (e.g. the resource-proxy layer). */
layerKind?: Kind;
style?: CSSProperties;
title: string;
body: ReactNode;
role?: string;
}

function ArchStack({
layers,
bounds,
legend,
}: {
layers: Layer[];
bounds: ReactNode[]; // one fewer than layers
legend?: ReactNode;
}) {
return (
<div className="archstack">
{legend ? <div className="arch-legend">{legend}</div> : null}
{layers.map((l, i) => (
<Fragment key={l.title}>
<div
className={`layer ${l.layerKind ?? l.tagKind ?? ""}`.trim()}
style={l.style}
>
<span className={`ltag t-${l.tagKind ?? "store"}`}>{l.tag}</span>
<div className="lbody">
<div className="lt">{l.title}</div>
<div className="ld">{l.body}</div>
</div>
{l.role ? <span className="lrole">{l.role}</span> : null}
</div>
{i < bounds.length ? <div className="bound">{bounds[i]}</div> : null}
</Fragment>
))}
</div>
);
}

/** `architecture/overview.mdx` — the Python / Rust / Store stack. */
export function ArchitectureStack() {
return (
<ArchStack
legend={
<>
<span className="al-item">
<span className="al-arrow down">↓</span> you call down — enqueue
jobs
</span>
<span className="al-item">
<span className="al-arrow up">↑</span> results &amp; state flow back
up
</span>
</>
}
layers={[
{
tag: "Python",
tagKind: "py",
title: "User-facing API",
body: (
<>
<code>Queue</code>, <code>@task</code>, <code>.delay()</code>,
results, workflows, resources — the surface you write against.
</>
),
role: "what you write",
},
{
tag: "Rust",
tagKind: "rust",
title: "Engine",
body: "Scheduler, dispatcher, worker pool, rate limiter — Tokio runtime, OS-thread pool, near-zero Python overhead.",
role: "where the work runs",
},
{
tag: "Store",
tagKind: "store",
title: "Storage layer",
body: "SQLite (bundled) or Postgres — jobs, results, schedules, rate-limit state, all in one place.",
role: "where state lives",
},
]}
bounds={[
<>
<span className="bdir">↓</span>
<span className="pyo3">PyO3 boundary</span>
<span className="bdir">↑</span>
</>,
<>
<span className="bdir">↓</span>reads &amp; writes
<span className="bdir">↑</span>
</>,
]}
/>
);
}

/** `architecture/resources.mdx` — the 3-layer resource pipeline. */
export function ResourcePipeline() {
return (
<ArchStack
layers={[
{
tag: "Layer 1",
tagKind: "py",
title: "Argument interception",
body: (
<>
The <code>ArgumentInterceptor</code> walks every argument before
serialization. CONVERT types become JSON-safe markers, REDIRECT
types become DI placeholders, PROXY types are deconstructed,
REJECT types raise in strict mode.
</>
),
},
{
tag: "Layer 2",
tagKind: "py",
title: "Worker resource runtime",
body: (
<>
<code>ResourceRuntime</code> initializes resources at worker
startup in topological order, then injects requested ones (via{" "}
<code>inject=</code> or <code>Inject["name"]</code>) as kwargs.
Task-scoped resources come from a semaphore pool.
</>
),
},
{
tag: "Layer 3",
tagKind: "py",
layerKind: "rust",
style: {
borderColor: "var(--indigo-line)",
background:
"linear-gradient(100deg,var(--indigo-soft),var(--panel))",
},
title: "Resource proxies",
body: (
<>
<code>ProxyHandler</code>s deconstruct live objects (file handles,
HTTP sessions, cloud clients) into a JSON recipe and reconstruct
them on the worker. Recipes are optionally HMAC-signed for tamper
detection.
</>
),
},
]}
bounds={["enqueue → worker", "before task()"]}
/>
);
}
54 changes: 54 additions & 0 deletions docs/app/components/diagrams/failure-timeline.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import type { ReactNode } from "react";

// Crash-recovery timeline — ports the prototype's `.timeline` (`.tl`/`.tt`/`.tb`).
// `architecture/failure-model.mdx`.
const STEPS: { at: string; body: ReactNode }[] = [
{
at: "t = 0s",
body: (
<>
Worker claims a job — status <b>pending → running</b>,{" "}
<code>started_at</code> recorded.
</>
),
},
{
at: "t = crash",
body: (
<>
Worker dies mid-task. The row is left in <b>running</b> with no result.
</>
),
},
{
at: "t = timeout_ms",
body: (
<>
The stale reaper (runs ~every 5s) finds the job has exceeded{" "}
<code>timeout_ms</code> and marks it <b>failed</b>.
</>
),
},
{
at: "t + retry",
body: (
<>
If retries remain → re-enqueued as <b>pending</b> with backoff.
Otherwise → <b>dead-letter</b>.
</>
),
},
];

export function CrashRecoveryTimeline() {
return (
<div className="timeline">
{STEPS.map((s) => (
<div className="tl" key={s.at}>
<div className="tt">{s.at}</div>
<div className="tb">{s.body}</div>
</div>
))}
</div>
);
}
12 changes: 12 additions & 0 deletions docs/app/components/diagrams/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Single barrel for every diagram component used in MDX. All architecture
// diagrams below are prototype-faithful ports (arch.js + arch-*.html).

export { Mermaid } from "@/components/mermaid";
export { ArchitectureStack, ResourcePipeline } from "./arch-stack";
export { CrashRecoveryTimeline } from "./failure-timeline";
export { JobStateMachine } from "./lifecycle-graph";
export { MeshDemo } from "./mesh-demo";
export { SchedulerPollLoop } from "./poll-cycle";
export { SchemaGrid } from "./schema-grid";
export { Seq } from "./seq";
export { WorkerDispatch } from "./worker-fork";
Loading
Loading