Add docs-site for docs.stevedores.org/oxidizedgraph - #9
Conversation
React 19 + Vite 7 + Tailwind CSS v4 + Bun documentation site. Covers core concepts (State, Nodes, Edges, Runner), API reference, comparison with LangGraph, and cross-links to other stevedores-org docs. Co-authored-by: Cursor <cursoragent@cursor.com>
stevei101
left a comment
There was a problem hiding this comment.
Code Review
Overall structure is clean and well-organized. However, there are several inaccuracies in the Rust code examples vs the actual API, plus a few infra/UX concerns.
Critical
1. max_iterations default is wrong — Runner.tsx
Docs claim default is 25, but RunnerConfig::default() sets max_iterations: 100 (src/runner.rs:27).
2. ContextRouterNode::new constructor is wrong — Edges.tsx
Docs show a 4-arg constructor that doesn't exist. The actual API is a builder pattern:
let router = ContextRouterNode::new("router", "intent")
.route("search", "search_node")
.route("chat", "chat_node")
.default_route("fallback_node");Medium
3. FunctionNode example uses unnecessary Box::pin — Nodes.tsx
The idiomatic pattern is |state| async move { ... } — no manual pinning needed. The docs' version works but is misleading.
4. Value vs serde_json::Value — Concepts.tsx, State.tsx
The AgentState struct examples show bare Value without an import. Should use serde_json::Value or include a use-statement.
5. Conditional edge closure takes &AgentState, not owned — Concepts.tsx
add_conditional_edge takes Fn(&AgentState) -> String. The examples should show the reference, e.g. |s: &AgentState|.
Low / Info
6. No mobile navigation — Sidebar is hidden lg:flex with no hamburger toggle. Mobile users have no nav.
7. No 404 catch-all route — App.tsx has no <Route path="*" ...>. Unknown paths render blank.
8. Unused components — StatusBadge, Card, CardGrid are defined but never used in any page.
9. Missing nginx security headers — No X-Content-Type-Options, X-Frame-Options, Content-Security-Policy, etc.
10. Ecosystem sidebar links may 404 if docs.stevedores.org/llama-rs etc. aren't live yet.
The API inaccuracies (items 1-5) should be fixed before merging — they'll confuse anyone trying to use the library from the docs.
Remove the Dockerfile/nginx.conf.template pair and replace with an OCI dockworker.toml configuration following the lornu-ai/lornu.ai apps/liteworks-media precedent: chainguard nginx base, bun build, SBOM + sigstore signing, multi-arch (amd64/arm64), read-only rootfs. Keep a slim nginx.conf (renamed from .template, port now a literal 8080 matching oci.config.env.PORT) to preserve the SPA fallback for /oxidizedgraph/ routes — referenced via [[oci.layers]] name="nginx-config". The cache-headers regex location is nested inside the prefix location so asset requests still hit try_files instead of falling through. Also drop the stale bun.lockb entry from .gitignore (project uses bun.lock).
Summary
Test plan
bun run buildpasses locallyMade with Cursor