Title: docs(skill): add an app-models reference and fix the skill sync map by jamesbhobbs · Pull Request #509 · deepnote/deepnote · GitHub
Open Graph Title: docs(skill): add an app-models reference and fix the skill sync map by jamesbhobbs · Pull Request #509 · deepnote/deepnote
X Title: docs(skill): add an app-models reference and fix the skill sync map by jamesbhobbs · Pull Request #509 · deepnote/deepnote
Description: "Build me a Deepnote app" has five different answers, and the skill said which one to pick nowhere. An agent had to assemble the picture from cli-publish.md, examples/local-runner/cloud-app/README.md, examples/local-runner/run-app/README.md, and the local-runner package docs — and the only place that mentioned app tokens at all was the publish reference, describing the CLI flag rather than the boundary behind it. skills/deepnote/references/apps.md Five models, each with what it is made of, where it runs, who hosts it, and what credentials it gets: Data apps (notebook apps) — notebook blocks presented through Deepnote's app UI. Not deprecated, not a fallback; an agent contributes the notebook, not the app. Streamlit apps — a .py entrypoint on project hardware. Hosted MCP can activate an existing entrypoint but cannot upload or author the file, so a "build a Streamlit app from scratch in a hosted project" plan does not work. Published static sites — browser files below _deepnote_static/**, deployed by deepnote publish, which owns that namespace. Published browser apps with API access — the same, plus a viewer token. Local Node-backed apps (serveStatic) — a local server runtime, with the complete five-route contract documented. A decision table opens the file, keyed on the questions that change the plan: notebook blocks vs. custom HTML/JS vs. Python, browser-only vs. local Node server, viewer API access, project hardware, and whether an agent can create the underlying files with its current tools. The two boundaries worth the file Publishing ownership. publish owns _deepnote_static/**; the canonical URL comes from the API, never hand-assembled. The viewer token. A published app never carries the personal token used in local preview. The shell hands it a short-lived, project- and viewer-scoped token over an origin-pinned postMessage handshake, limited to: read the configured notebook's inputs and block metadata without source content, start a detached run, poll that viewer's own run by id, receive sanitized snapshotBlocks. Not notebook enumeration, not run-history enumeration, not arbitrary /v2. The failure mode is silent — the same code works locally with a personal token — which is why examples/local-runner/cloud-app guards on isEmbedded. AGENTS.md The sync section said MCP tool changes go in skills/deepnote/references/cli-*.md "(MCP mirrors CLI commands)". That is wrong in both directions: @deepnote/mcp has tools with no CLI equivalent, and the CLI has commands (publish, sync, install-skills) with no MCP tool. It routed local-MCP changes into the CLI references. Replaced with a map from each surface to its owning document, distinguishing three things that get conflated: local @deepnote/mcp, hosted MCP at deepnote.com/mcp, and the codex-plugin consumer of the hosted server. Scope Documentation only. cli-sync.md, cli-publish.md, CLI implementation, public docs, and MCP implementation are deliberately untouched — they are moving in #492, #508, and #491. Relationship to #508 No conflict, and no merge order. The two PRs touch disjoint files (#508 is CLI/cloud source plus cli-publish.md and cli-sync.md; this is AGENTS.md, SKILL.md, and the new reference), and apps.md no longer describes the publish/sync coordination as pending. Note that #508 resolves the overlap by sharing one baseline rather than excluding _deepnote_static from sync --all-files, so this file states only the part an app author needs — publish is the deploying writer for the static root — and defers the mechanism to the CLI references, which #508 owns. Validation pnpm test (3086 passed, 1 skipped), pnpm typecheck, pnpm biome:check, pnpm prettier:check, pnpm spell-check all clean. Biome reports 8 noConsole warnings in examples/local-runner/*/serve.mjs, all pre-existing and untouched here. Packaging verified end to end rather than assumed: pnpm build copies the new reference into packages/cli/dist/skills/deepnote/references/, and deepnote install-skills --agent "Claude Code" in a scratch directory installs apps.md alongside the rest. No skill validator (quick_validate.py) or skill-creator skill is present in this checkout, so that step could not be run. 🤖 Generated with Claude Code
Open Graph Description: "Build me a Deepnote app" has five different answers, and the skill said which one to pick nowhere. An agent had to assemble the picture from cli-publish.md, examples/local-runner/cloud-a...
X Description: "Build me a Deepnote app" has five different answers, and the skill said which one to pick nowhere. An agent had to assemble the picture from cli-publish.md, examples/local-runner...
Opengraph URL: https://github.com/deepnote/deepnote/pull/509
X: @github
Domain: github.com
| react-profiling | 0 |
| react-import-map | react,react-dom,react-dom/client,react-dom/profiling,react-is,react-reconciler,react/compiler-runtime,react/jsx-dev-runtime,react/jsx-runtime,scheduler@d5750093facf |
| route-pattern | /:user_id/:repository/pull/:id/commits/:range(.:format) |
| route-controller | pull_requests |
| route-action | commits |
| fetch-nonce | v2:7d97b99f-81e9-053f-5c82-94e6e3cc5be7 |
| current-catalog-service-hash | ae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b |
| request-id | AC88:1ED336:A83F81:E4C735:6AEDCEF1 |
| html-safe-nonce | 9568811dba281f3a8c9275e1c721979c514df132f810a3238d4e1b1840b1f0a6 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBQzg4OjFFRDMzNjpBODNGODE6RTRDNzM1OjZBRURDRUYxIiwidmlzaXRvcl9pZCI6IjM5MDY4Nzc0NTQ1NDE1MDgzMzciLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | eb867c7994e2c95fdcd28f7a5366ddfd8c300c2c6d7f4828a4fb9f978da19ae7 |
| hovercard-subject-tag | pull_request:4414412439 |
| github-keyboard-shortcuts | repository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/deepnote/deepnote/pull/509/commits/3bfee90975945ee77a12024c5126194f7c33de37 |
| twitter:image | https://avatars.githubusercontent.com/u/15235276?s=400&v=4 |
| twitter:card | summary_large_image |
| og:image | https://avatars.githubusercontent.com/u/15235276?s=400&v=4 |
| og:image:alt | "Build me a Deepnote app" has five different answers, and the skill said which one to pick nowhere. An agent had to assemble the picture from cli-publish.md, examples/local-runner/cloud-a... |
| og:site_name | GitHub |
| og:type | object |
| hostname | github.com |
| expected-hostname | github.com |
| None | f60373873bb1ef795e8511ea1f2a76997e9c649d72b02942aedf2def3423a0ce |
| turbo-cache-control | no-preview |
| diff-view | unified |
| go-import | github.com/deepnote/deepnote git https://github.com/deepnote/deepnote.git |
| octolytics-dimension-user_id | 45339858 |
| octolytics-dimension-user_login | deepnote |
| octolytics-dimension-repository_id | 1066509034 |
| octolytics-dimension-repository_nwo | deepnote/deepnote |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1066509034 |
| octolytics-dimension-repository_network_root_nwo | deepnote/deepnote |
| turbo-body-classes | logged-out env-production page-responsive full-width |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 0f55cfa61438c7dc93d1024a1e5e5182b36830e2 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width