- Brand
- DocStash
- Category
- AI
- Primary Subcategory
- AI Page Hosting & Sharing
Integration details
Description
DocStash gives your AI-generated pages, reports, and apps a single stable home. Create and stash documents directly from your agent and publish them at a permanent, shareable URL. Stash HTML, Markdown, code, Word, Excel, PDF, and live apps (React, Vue, Three.js, and more)! You can retrieve and iterate on your documents from any AI agent you've connected, no matter which one first created them. Every edit becomes a new version at the same URL.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- AI Page Hosting & Sharing
- Secondary Subcategories
- None listed
- Brand
- DocStash
- Access
- Account required
- First tracked
- 2026-10-27
- Tool count
- 25
- Market
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Your score is coming
ChatGPT now suggests Plugins on its own when they match a user's request.Your Plugin Discovery Score measures how often yours appears, and it will show here as soon as it’s ready.
What discovery looks like

Get alerts for DocStash
Get updates when DocStash’s Discoverability Score or category rank changes.
Competing in ChatGPT AI Page Hosting & Sharing
View Category25 tools agents can invoke
Generate a beautiful, print-ready PDF document for DocStash and show the user an INLINE PREVIEW: reports, memos, proposals, letters, résumés, whitepapers, contracts, essays, one-pagers. THIS IS THE DEFAULT for a generic 'make me a document' / 'make me a PDF' request (use `create_text` for markdown/code source, `create_page` for a web page). `content` = HTML you author, and DocStash renders + presents it AS A PDF (paginated paper, page nav, zoom, one-click PDF download). Do NOT generate a binary .pdf; the user drag-and-drops pre-existing .pdf files on the dashboard. This is a REAL HTML/CSS document rendered by a full Chromium engine and baked to PDF — you have the SAME visual toolkit a web page has (any CSS layout, SVG, gradients, filters, transforms, web fonts, images), NOT a limited document format. It is a STATIC print document: NO `<script>` / JS runs (it is rejected) — draw every chart, diagram and graphic as hand-authored inline SVG + CSS (crisp, and how the best docs are built). The ONLY difference from a live web page is GEOMETRY: it prints onto fixed US Letter pages that never scroll or reflow. PAGE MODEL — TWO ways to build a page, mix them freely in one document: 1. FLOW (default) — author continuous, top-to-bottom HTML (US Letter, 816x1056px @96dpi). You do NOT emit per-page blocks or decide where breaks fall: DocStash flows your content across as many pages as it needs and paginates for you (keeping headings with their text; not splitting tables / figures / cards). Best for running text, long tables, card lists — anything whose length you can't predict. 2. CANVAS — `<section class="pdf-canvas">` is a FIXED one-page design surface: exactly one sheet, edge-to-edge, a positioning context. Inside it you CAN and SHOULD absolutely-position art, full-page backgrounds, and edge-anchored elements against KNOWN bounds — compose it like a POSTER. Its content auto-fits to one page at bake, so design ~a page without measuring height. Use a canvas for the set-pieces that make a doc look designed: the COVER, section dividers, full-page infographics / charts / hero spreads. Opt-in controls anywhere: `<div class="pdf-break"></div>` forces a fresh page; `pdf-keep` keeps a card / figure / callout from splitting; `<section class="pdf-bleed">` is a full-bleed page that still FLOWS (for a themed section whose background reaches the edges but whose length is unknown). IMPORTANT — `pdf-break` / `pdf-canvas` / `pdf-keep` / `pdf-bleed` are ENGINE-RESERVED: apply the class as-is, never redefine or restyle the class itself (especially its `break-*` properties) — the engine owns those, and overriding them corrupts pagination (e.g. blank pages). Style the CONTENT you put INSIDE a primitive freely. DESIGN THE DOCUMENT: • Make page 1 an attractive COVER — a `pdf-canvas`: absolutely-position the title, a full-bleed background, and any art against the fixed page, the way a poster is composed. Reach for a canvas again for section dividers and full-page infographics. • VISUALIZE — show as much as you tell, all as hand-authored inline SVG (+ CSS): charts (bar/line/donut via `stroke-dasharray`), timelines, diagrams, stat panels, maps, iconography, a signature motif derived from the subject. This is what makes a doc look designed — and it is exactly how the best docs are built (no JS needed). • RUNNING HEADER / FOOTER (optional) — put page numbers, a title strip, or a small logo on every page via CSS `@page` margin boxes, in ANY edge or corner (`@top-left`, `@bottom-center`, `@top-right-corner`, `@left-middle`, …), styled however fits. Fill it with the page counters (`counter(page)`, `counter(page) " / " counter(pages)`, `counter(page, decimal-leading-zero)`), a running `string-set` section title, or a `position:running()` element (e.g. a logo). Omit it entirely for a résumé / invite / one-pager. Cover, `pdf-canvas`, and full-bleed pages are kept clear of it automatically. • TYPE SCALE — 816px wide = US Letter 8.5in, so **1 CSS px = 0.75pt**: `11px` body copy PRINTS AT 8.25pt. Size in px but think in pt — body copy ~13-15px (~10-11pt), never below 11px for anything a reader must read; 9px (~7pt) is the floor for incidental labels / footers. • FILL each page — a sheet is a WHOLE page whether or not its content fills it, so a half-empty interior page reads as a mistake, not restraint. Pace and size content (type scale, spacing, columns) so every page is ROUGHLY FULL; only the FINAL page should run partial, and never orphan a lone heading or a few trailing lines. Balanced, full pages are what separate a designed document from an exported one. • MARGINS — the engine ALREADY applies a comfortable page margin (0.7in) so text never runs to the paper edge; do NOT add your own outer page margin or wrap pages in your own padding on top of it (that double-margins the page). To bleed to the edge on purpose (cover, background, edge-to-edge image), use `pdf-bleed` — it zeroes the margin for that page. • To carry a color / dark theme edge-to-edge across EVERY page (not just the cover), set it on the page background — `@page{background:...}` + a matching `body` color. In FLOW content do NOT pin heights or absolutely-position a page layout (no `height:11in`, no `100vh` — the engine owns flow pagination); absolute positioning and a fixed page box are for INSIDE a `pdf-canvas`, where they are the whole point. • Self-contained: inline all `<style>`; load fonts / images / libraries from absolute https/CDN URLs. IMAGES & FONTS — image/font URLs MUST be DIRECT files (a gallery/viewer page renders BROKEN); the direct-URL recipes, sizing, and custom-font rules are in the server instructions (VISUAL DOCUMENTS & MEDIA). REPEATING gradient patterns (`repeating-linear-gradient`, tightly-tiled backgrounds) rasterize unreliably in print — build stripes / hatching from REAL repeated elements (divs / spans) instead. Nothing is stashed yet — then STOP: do NOT call `stash` yourself; the user reviews the preview and saves it. Once stashed, the doc is at a PRIVATE url (the user, their workspace members, and people they've granted access) until published with `set_public_link`. Full lifecycle, slug/versioning, attribution + publish rules: DocStash server instructions.
create_pdf
Generate an INERT text artifact — markdown, source code, or raw data — for DocStash and show the user an INLINE PREVIEW. This is for content the user READS AS SOURCE (typography for markdown, syntax highlighting for code), never executed or rendered as a page. Set `extension` to the file's extension, which the doc keeps for good (the extension is the file's kind and its download name): • 'md' — markdown. Content = the markdown source. For prose, notes, READMEs, technical docs, documentation of any kind. • any other extension — source code or data: 'py', 'ts', 'go', 'rs', 'json', 'yaml', 'csv', 'sql', 'vue', … Content = the raw source string. Omit `extension` for plain text (.txt). A new version (`slug`) keeps the doc's extension: omit `extension`, or pass the same one. ROUTING: scripts, code files, READMEs, configs, raw CSV/JSON → here. A LIVE rendered page → `create_page`. A designed PDF (and any generic 'make me a document/PDF' ask) → `create_pdf`. Nothing is stashed yet — then STOP: do NOT call `stash` yourself; the user reviews the preview and saves it. Once stashed, the doc is at a PRIVATE url (the user, their workspace members, and people they've granted access) until published with `set_public_link`. Full lifecycle, slug/versioning, attribution + publish rules: DocStash server instructions.
create_text
Generate a WEB PAGE (a single self-contained HTML file, rendered live) for DocStash and show the user an INLINE PREVIEW: landing pages, visual/interactive dashboards, infographics, demos, interactive web apps and games (React, three.js, d3, … loaded from a CDN) — anything the user should SEE RENDERED rather than read as source. Content = a complete `<!doctype html>` document with everything inline (`<style>`, `<script>`) and any images/libraries referenced by absolute URL or CDN. IMAGES & FONTS — image/font URLs MUST be DIRECT files (a gallery/viewer page renders BROKEN); the direct-URL recipes, sizing, and custom-font rules are in the server instructions (VISUAL DOCUMENTS & MEDIA). Viewer provides chrome — don't wrap. DocStash hosts it live. Load any JS deps as `<script type="module">` ESM (esm.sh) or inline them — never reference a local build-output path (the file won't exist). ROUTING: a live page or web app → this tool, as ONE self-contained file (inline your CSS and JS). Markdown / source code / raw data → `create_text` (inert source, not a rendered page). A designed PDF document → `create_pdf`. RESPONSIVE — the page MUST reflow + scroll on mobile: include the `<meta name="viewport">` tag and DON'T lock it to `height:100vh` + `overflow:hidden` (that traps phone scrolling). The viewer renders full-width, no extra scroll container. Nothing is stashed yet — then STOP: do NOT call `stash` yourself; the user reviews the preview and saves it. Once stashed, the doc is at a PRIVATE url (the user, their workspace members, and people they've granted access) until published with `set_public_link`. Full lifecycle, slug/versioning, attribution + publish rules: DocStash server instructions.
create_page
Discard a preview (from a create_* tool) without stashing it. Call this when the user rejects it (e.g. 'discard', 'never mind', 'don't save it'). The unsaved draft is moved to Trash (recoverable from there), so it can no longer be stashed unless restored.
discard
The DEFAULT way to change a PDF — edit it in place, or copy it into a new one. Emit ONLY the changes as `{ old_string → new_string }` pairs, not the whole document. `edit_pdf` edits only a PDF; a wrong-type call names the right tool. When to edit vs re-run a create tool, and iterate-vs-new-doc: DocStash server instructions. - `old_string` must be text that appears in the CURRENT source — call `read_document` first to get it, and copy it verbatim with enough surrounding context to match EXACTLY ONE place (or set `replaceAll`). Whitespace differences are tolerated. A stale or ambiguous `old_string` fails cleanly and changes NOTHING, so re-read and retry. - `new_string` replaces it; an empty string deletes the matched text. - Edits apply in order, each to the result of the previous. - **In-place** (default): the change lands as a new version of `slug`, shown as a fresh inline preview. - **Copy mode** (`copy: true` + `name`): leaves `slug` UNTOUCHED and produces a NEW doc — a filled-in copy with your edits applied. The TEMPLATE flow: keep one master, spin off variants (an invoice/offer-letter/report template → a copy per client). Returns the new doc's own slug.
edit_pdf
The DEFAULT way to change a markdown / text / code doc — edit it in place, or copy it into a new one. Emit ONLY the changes as `{ old_string → new_string }` pairs, not the whole document. `edit_text` edits only a markdown / text / code doc; a wrong-type call names the right tool. When to edit vs re-run a create tool, and iterate-vs-new-doc: DocStash server instructions. - `old_string` must be text that appears in the CURRENT source — call `read_document` first to get it, and copy it verbatim with enough surrounding context to match EXACTLY ONE place (or set `replaceAll`). Whitespace differences are tolerated. A stale or ambiguous `old_string` fails cleanly and changes NOTHING, so re-read and retry. - `new_string` replaces it; an empty string deletes the matched text. - Edits apply in order, each to the result of the previous. - **In-place** (default): the change lands as a new version of `slug`, shown as a fresh inline preview. - **Copy mode** (`copy: true` + `name`): leaves `slug` UNTOUCHED and produces a NEW doc — a filled-in copy with your edits applied. The TEMPLATE flow: keep one master, spin off variants (an invoice/offer-letter/report template → a copy per client). Returns the new doc's own slug.
edit_text
The DEFAULT way to change a web page — edit it in place, or copy it into a new one. Emit ONLY the changes as `{ old_string → new_string }` pairs, not the whole document. `edit_page` edits only a web page; a wrong-type call names the right tool. When to edit vs re-run a create tool, and iterate-vs-new-doc: DocStash server instructions. - `old_string` must be text that appears in the CURRENT source — call `read_document` first to get it, and copy it verbatim with enough surrounding context to match EXACTLY ONE place (or set `replaceAll`). Whitespace differences are tolerated. A stale or ambiguous `old_string` fails cleanly and changes NOTHING, so re-read and retry. - `new_string` replaces it; an empty string deletes the matched text. - Edits apply in order, each to the result of the previous. - **In-place** (default): the change lands as a new version of `slug`, shown as a fresh inline preview. - **Copy mode** (`copy: true` + `name`): leaves `slug` UNTOUCHED and produces a NEW doc — a filled-in copy with your edits applied. The TEMPLATE flow: keep one master, spin off variants (an invoice/offer-letter/report template → a copy per client). Returns the new doc's own slug.
edit_page
Internal — the inline preview widget fetches its own document bytes here. Not for direct agent use.
get_file
Internal widget poll — the latest details for a preview (its current name + this version's status). Not for direct agent use.
get_document
List the workspaces (personal + team; ids and tool names call them organizations) the user can save documents to, with the currently-active one flagged. Call this to resolve a spoken name like "my team workspace" to its id before set_organization. Call them workspaces when talking to the user.
get_organizations
List the user's documents. By default returns ACTIVE docs in their default workspace (their team workspace if they have one, personal otherwise). Use `which` to switch lens: • 'active' — default. Docs the user owns or is a workspace member on. Has the user's own work. • 'trash' — recently-trashed docs. Use when the user says "what did I delete" / "restore X" / "undelete". • 'shared-with-me' — docs OTHER people shared with this user (grants from other workspaces). Returns slug, name, url, type, language, extension, owner attribution, and latest-version summary for each. Use this to find an existing doc's `slug` before calling `read_document`, a sharing or lifecycle tool, or an authoring tool.
list_documents
List the people granted access to a doc (Viewers and Editors). Does NOT include public-link state: that's `document.isPublic` on `read_document`.
list_access
List members of the user's default workspace: their names AND emails. Use this to figure out WHO TO SHARE WITH when the user says "share with the team" / "who's in this workspace?" / "share with Alice" (and you need to resolve Alice → email). Returns nothing useful for a personal workspace (just the user themselves). For team workspaces returns the full member roster. Use the emails returned here as the `email` argument to `set_access`.
list_org_members
PUBLISH a doc (`isPublic: true`) or unpublish it (`isPublic: false`). Published, anyone with the URL sees the latest saved version without signing in; this is the ONLY way to make a doc publicly viewable, and a stashed url stays private. The doc must be saved (stashed) before publishing. Unpublishing cuts off everyone using the public URL; people granted access and workspace members keep access. Returns the public docstash.ai `url` when published. Call only when the user explicitly asks to publish / make public / get a public or shareable link, or to unpublish.
set_public_link
Read a document's CONTENT into your context by slug — a SILENT read: NOTHING is rendered or shown to the user (no widget, no preview, no link card). This is the right FIRST call whenever you need the text to reason over — to summarize it, answer questions about it, or change it (then apply the change with the matching `edit_*` tool — edit_pdf / edit_page / edit_text — as surgical `{ old_string → new_string }` edits, same slug). Word and spreadsheet docs are view-only: read them, but they take no edits or new versions. Returns the doc's metadata, a reference to its latest artifact (id, signed fileUrl, metadata), `content` — the full body text — for text-like kinds (html/md/text + agent-authored pdf print-HTML; binary files like an uploaded .pdf, .docx or .xlsx aren't text-extractable), and any unresolved lint `errors` on the latest version (this is ALSO the way to re-check errors mid-fix-loop — no separate errors tool). Pass `withHistory: true` to also include the activity feed — every event newest-first (type, timestamp, author, and for content_pushed events the `artifactId` used by `revert_document`). To DISPLAY the doc to the user instead, call the matching `show_*` tool (show_pdf / show_page / show_text) — it renders inline entirely off your context. A multi-page site (an older web page made of several files) has no single body: its files come back in `files` instead, read-only.
read_document
Change a doc's name. Metadata only: no new version is created. Use when the user says "rename X to Y".
rename_document
Make an EARLIER version the doc's current version again. Get the version's `artifactId` from `read_document` with withHistory:true (each content_pushed event carries `payload.artifactId`). No content is lost: the revert is logged as a new event and the full history stays intact.
revert_document
SCREENSHOT a staged document by slug — the rendered result comes back AS IMAGES for your own review, plus the deterministic `errors`. Renders the latest pushed version and returns: • `errors` — problems detected at render time. PDF: freeflow checks (content wider than the page can hold — an unbreakable string or too-wide table; a keep-whole block taller than one page; text buried under other text; a blank page mid-document; a broken image; a blank document). HTML: viewport + runtime checks (horizontal blowout on desktop or mobile, missing viewport meta, broken images, a blank render, uncaught boot exceptions, missing files, console errors). ALL advisory — nothing blocks a stash; fix them when iterating, never by stripping design. • screenshots delivered to YOU as image content — PDF: one image per page at `resolution` px wide (DEFAULT 500 — enough to judge layout / overflow / colour and cheap on tokens; raise to ~1000–1600 ONLY to read fine print), up to 8 pages per call. A bare call serves pages 1-8; pass `firstPage`/`lastPage` for a contiguous range, or `pages` for an EXPLICIT set like [2,5] so pages you did not touch never enter your context. When more pages remain than one call ships, the result names what shipped (`pageRange`) — call again for the rest. Everything else: a bounded full-height shot at DESKTOP and at MOBILE (390px) — so you can SEE the result and catch what the checks cannot: hidden text, wrong colours, a broken visual layout. Call it after authoring or iterating a PDF or page to check your work BEFORE telling the user it is ready — especially when a create tool reported errors. The images return to YOU (the model); they are NOT the user-facing inline widget.
screenshot_document
Set one person's access to a doc: 'read' (Viewer), 'write' (Editor: can push new versions), or 'none' (remove their access). Also changes an existing Viewer to Editor or back. DocStash emails the person a link. They don't need an account: without one they can view the doc in their browser from that link, and they sign up to edit or download it. This is NOT a public link: only that person's link opens it. Resolve a name to an email with `list_org_members`. If the user didn't say whether the person may edit, ask before setting 'write'.
set_access
DISPLAY a PDF to the user inline by slug — renders OFF your context (bytes go to the widget, nothing enters the conversation; returns metadata + an artifact reference, never the text). Use when the user asks to SEE a doc ("show / open / pull up X"). To load the TEXT into your context to summarize or revise, use `read_document` instead. `show_pdf` shows only a PDF; a wrong-type call names the right tool.
show_pdf
DISPLAY a markdown / text / code doc to the user inline by slug — renders OFF your context (bytes go to the widget, nothing enters the conversation; returns metadata + an artifact reference, never the text). Use when the user asks to SEE a doc ("show / open / pull up X"). To load the TEXT into your context to summarize or revise, use `read_document` instead. `show_text` shows only a markdown / text / code doc; a wrong-type call names the right tool.
show_text
DISPLAY a web page to the user inline by slug — renders OFF your context (bytes go to the widget, nothing enters the conversation; returns metadata + an artifact reference, never the text). Use when the user asks to SEE a doc ("show / open / pull up X"). To load the TEXT into your context to summarize or revise, use `read_document` instead. `show_page` shows only a web page; a wrong-type call names the right tool.
show_page
STASH a preview (from a create_* tool) — the actual SAVE; the doc stays PRIVATE. The `slug` IS the doc's slug (creates it, or pushes a new version if the preview targeted an existing doc). ‼️ Do NOT call this automatically after a create_* call — a plain 'create X' request is satisfied by the preview alone. Call it ONLY when the user signals saving (save / stash / ship it / looks good) or clicks Stash in the inline preview; when in doubt, ask first. Returns the `url`. Stashing does NOT publish — to make it public, then call `set_public_link` with isPublic: true.
stash
Switch the active workspace that NEW documents are created in, by organizationId (from get_organizations). Persists for this connection until changed. Existing documents remain reachable by slug regardless of the active workspace.
set_organization
Move a doc to the trash (`trashed: true`) or restore it from the trash (`trashed: false`). Trash is RECOVERABLE: a trashed doc leaves the active list, appears in `list_documents` with which='trash', and comes back with `trashed: false`. Don't tell the user it's permanently gone.
set_trashed
DocStash ChatGPT Plugin FAQ
How the directory, categories and Discoverability Score work.
Read the methodologyHow do I improve DocStash's ChatGPT Plugin discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are DocStash alternatives on ChatGPT?
As of 2026-10-28, DocStash competes with anew, Buildy, Carryo, dochost.io, Hoaster, Kids Book Maker, LandGoose Advertorial Studio, Layerpath and 8 more in ChatGPT AI Page Hosting & Sharing, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.