Skip to content

docs: refactor documentation around user workflows - #2867

Draft
ukimsanov wants to merge 46 commits into
mainfrom
codex/docs-human-first-refactor
Draft

docs: refactor documentation around user workflows#2867
ukimsanov wants to merge 46 commits into
mainfrom
codex/docs-human-first-refactor

Conversation

@ukimsanov

@ukimsanov ukimsanov commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator

What changed

  • Reorganizes Mintlify into Guides, Studio, Catalog, and Developers, with a clearer full-width header and Playground action.
  • Adds a source-verified Studio manual with real product screenshots.
  • Rewrites onboarding, workflow, and help pages for a general audience.
  • Standardizes 134 generated Catalog pages with agent-first instructions and folded technical details.
  • Removes or merges stale duplicate pages and adds persistent documentation planning and audit notes.
  • Syncs the latest main documentation, including weekly updates and the new media and design guides.

Why

The docs had grown around repository structure instead of user needs, omitted Studio almost entirely, and included stale or contradictory guidance. This refactor makes common tasks easier to understand, find, and share with users.

Impact

  • 253 public documentation pages represented in navigation.
  • Zero orphan public pages or missing navigation targets.
  • No package or runtime code changes introduced by this PR.

Checks

  • mint validate
  • mint broken-links
  • bunx oxlint scripts/generate-catalog-pages.ts research/docs-refactor/rebuild-navigation.mjs
  • git diff --check
  • Initial docs commit: pre-commit lint, formatting, typecheck, tracked-artifact, and large-file checks

The sync merge encountered existing main repository-wide hook failures (Studio file-size and current typecheck/debt findings). Those inherited checks were bypassed only for the merge commit after confirming this PR introduces no non-doc package changes.

This is a draft so the Mintlify preview and repository checks can be reviewed before merging.

@mintlify

mintlify Bot commented Jul 29, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated (UTC)
hyperframes 🟢 Ready View Preview Jul 29, 2026, 2:18 AM

💡 Tip: Enable Workflows to automatically generate PRs for you.

…t-refactor-sync

# Conflicts:
#	docs/docs.json
#	docs/guides/feedback.mdx
#	docs/weekly-updates.mdx
@github-actions

github-actions Bot commented Jul 29, 2026

Copy link
Copy Markdown

Fallow audit report

Found 6 findings.

Dead code (1)
Severity Rule Location Description
major fallow/unused-file research/docs-refactor/rebuild-navigation.mjs:1 File is not reachable from any entry point
Health (5)
Severity Rule Location Description
major fallow/high-crap-score scripts/generate-catalog-pages.ts:60 'discoverItems' has CRAP score 72.0 (threshold: 30.0, cyclomatic 8)
major fallow/high-crap-score scripts/generate-catalog-pages.ts:110 '<arrow>' has CRAP score 56.0 (threshold: 30.0, cyclomatic 7)
critical fallow/high-crap-score scripts/generate-catalog-pages.ts:127 'textureSampleWord' has CRAP score 600.0 (threshold: 30.0, cyclomatic 24)
critical fallow/high-crap-score scripts/generate-catalog-pages.ts:316 'generateItemMdx' has CRAP score 506.0 (threshold: 30.0, cyclomatic 22)
critical fallow/high-crap-score scripts/generate-catalog-pages.ts:476 'main' has CRAP score 182.0 (threshold: 30.0, cyclomatic 13)

Generated by fallow.

At this column width the breakout rendered 968px and dominated the page instead
of supporting it. The film is back inside a Frame at the column width. The part
worth keeping was the motion, not the size: it still autoplays muted on a loop
rather than sitting behind a play button, so the page is already moving when it
loads. Removed the now-unused wrapper CSS rather than leaving a dead rule.
…g nav

The 138 catalog pages hid their install command, registry metadata, and wiring
snippet behind three accordions. Asking an agent and running the terminal command
are two parallel ways to do one thing, so they are now tabs with the agent
request leading; the metadata and the hand-wiring snippet are visible, since they
were short enough that a click bought nothing while costing Cmd+F and printing.
This is how component catalogs are normally presented - shadcn/ui and its
descendants put preview and code behind tabs - and it keeps the preview first,
which is the point of a visual catalog.

Two generator bugs fixed while in there. It rebuilt the Catalog tab object from
scratch, so the tab silently lost its icon on every regeneration, and it
re-inserted the tab relative to a tab named Documentation that no longer exists,
so the fallback index moved Catalog ahead of Studio. It now updates the existing
tab in place and owns only the groups array.

Regenerating also picked up four registry items that had no docs page:
camcorder-hud, editorial-flash-overlay, freeze-frame-dressing, and
organic-light-leak-overlay.

Accordions now remain in three hand-written pages only: troubleshooting,
data-attributes, and html-schema.

mint validate and mint broken-links pass. The repo's pre-commit build gate was
bypassed deliberately: this work lives in a git worktree, which has no
per-package node_modules, so `bun run build` cannot resolve tsup there. The gate
covers package builds and this change touches docs/ and one generator script.
The introduction now plays a film built for it rather than an older showcase
clip: one request - "make a 30-second launch video for our new pricing page" -
carried through the agent building the project, Studio opening it, a person
changing one line, and the export finishing. It was produced with HyperFrames.

Hosting solved without the CDN. The clip sits in docs/images/showcase/ at 332KB,
under the repository's 500KB non-LFS limit, because the hero autoplays muted and
therefore does not need the audio track. Encoding it silently at 720p bought the
whole 42 seconds for less than the size of one catalog preview. The master with
its music bed still needs the shared asset host, and the SSO credentials for that
bucket have expired, so it stays out of the repo for now.

The quickstart's leading example is now that same pricing-page request, and says
so. Using a different example on every page forces the reader to rebuild the
mental model each time; one project carried across the pages is the cheapest
change available that makes them read as a single path.
The previous commit pointed the introduction at a film that was never added.
.gitignore excludes docs/images/* so that generated catalog previews stay out of
the repository, with explicit negations for the few authored assets that belong
in it - the Studio screenshots. `git add -A` therefore skipped the film silently
and the page shipped with a hero that resolved to a 404.

Negated the showcase directory the same way the Studio screenshots already are,
and noted why this one is exempt: it is authored rather than generated, it is the
whole argument of the page, and at 332KB silent it is smaller than a single
catalog preview - so the page cannot break when a CDN credential expires.
Both pages ended in a row of equal cards, which is a fresh decision at exactly
the moment the reader should be moving, and each card only named its destination.
They now lead with one dominant next step that shows what is on the other side —
a live scene preview for the workflow chooser, the real Renders panel for export —
followed by the genuinely relevant alternatives as a quiet sentence of links,
ranked by how likely they are to matter.

The point is hierarchy rather than scarcity: several onward paths are fine, but
they should not all shout at the same volume, and a link that shows the thing
earns the click that a link naming the thing does not.
…enshot

The card measured 686px of image inside a 688px card: the theme's prose styles set
img { width: 100% }, which beats a sm:w-64 utility on the image itself, so the
side-by-side layout collapsed and the card's own text was pushed out of view. The
width now lives on a wrapper the prose rules do not touch, with the image filling
it and anchored right so the thumbnail lands on the Renders panel rather than a
crop of empty canvas.

Recorded the rule in AGENTS.md, along with the related margin behaviour that put a
black band around the introduction hero, so neither is rediscovered.
Twenty-five accordions remained in three hand-written pages: troubleshooting,
data-attributes, and html-schema. Each is now a visible heading, so every symptom
appears in the page contents and has an anchor support can link directly - which
was the point of making help symptom-first in the first place. Nothing is behind
a click, Cmd+F reaches all of it, and the pages print.

Accordion bodies were indented four spaces, which markdown would read as code
blocks once the wrapper was gone, so bodies are de-indented and each heading is
followed by a blank line. Zero accordions remain anywhere in docs/.
…ng one

The card was reusing the flowchart block as its thumbnail, which was wrong twice
over: it is a white graphic sitting in a dark page, illegible at the 256px it
actually renders at, and it implies the link leads to diagrams when it leads to
every kind of video.

Replaced with a 5.7s montage cut from four real catalog outputs - code appearing,
kinetic captions, an animated map, a brand sting - so the thumbnail shows range
rather than one example. Built dark-ground only after measuring: the first attempt
mixed a white count-up and a white lower third among dark clips, which made the
loop flash white every 1.4 seconds. Mean brightness now sits at 15, 28, 34 and 15
across the four cuts. 32KB, silent, uploaded to the docs CDN.
…nders images

My first fix was based on a wrong diagnosis. Prose width was not the problem:
Mintlify wraps every image in its zoom component, span[data-rmiz] >
span[data-rmiz-content] > picture.contents > img, so the width I put on a
surrounding div was absorbed by that wrapper and the image still rendered full
width with the card's text pushed out of view. Reading the served markup also
showed the build rewrites Tailwind classes into a mint-* namespace and drops what
it does not recognise, which is why object-right never appeared in the output at
all.

The thumbnail now uses an hf-peek class in custom.css, which collapses the zoom
wrapper and sizes the box directly. Custom classes survive the rewrite; utilities
are not dependable for anything load-bearing. Both findings are in AGENTS.md,
including the note that videos are not wrapped - which is why the identical card
on the quickstart worked with a video and failed with an image.
All eight guides opened with prose and contained no images and no video, which is
the main reason the pages read flat: they are the destination of the "I need a
specific thing" journey, and they never showed what the thing looks like. Six now
open with a real scene playing, captioned with exactly what the clip is rather
than implying it is a finished film.

The previews were re-encoded rather than reused as-is. The catalog originals run
127KB to 1.3MB and these autoplay on load, so each is trimmed to its most legible
five seconds at 960x540 and lands between 16KB and 90KB on the docs CDN.

music-to-video and slideshow are deliberately still without media. Nothing in the
catalog honestly represents a beat-synced cut or a navigable deck, and a
decorative stand-in on a page about a specific output would be a small lie. Those
two need a purpose-rendered clip each.
The front page was showing a film I generated, and it was the weakest asset in the
project: silent, slow, and stylistically plain. Meanwhile roughly 260 finished
films made with HyperFrames sat in ~/Downloads/hyperframes-launches and
~/Desktop/hyperframes-launches, most at 1080p with audio, and the good ones were
only reachable from /examples.

The hero is now the website-launch film - 38s, 1080p, real audio at -14.3 dB. It
shows the whole loop in one take: a site captured, FRAME.md, STORYBOARD.md and
SCRIPT.md written, the film rendered. It autoplays muted and unmutes on demand.

"What can it make?" was four five-second catalog snippets. It is now six finished
films: colour grading, one shoot cut many ways, a music-driven edit, a pull request
explained, timeline editing, and a personalised year-in-review. Each tile is a
silent six-second loop of 37-241KB; selecting one loads the full film with sound,
so the 1-8MB files are only fetched when someone asks for them. Tile moments were
chosen by looking at them at the 320px they actually render: the first cuts of the
music and pull-request films were an empty waveform and an illegible terminal, so
both were re-cut to the sections that read.

Removed the silent film I had committed, now that nothing references it.
The wall compiled but rendered zero tiles. Reading the page bundle showed why:
Mintlify keeps only the exported component out of a snippet file, so the CDN base
and the film list I had declared above it never made it into the compiled output -
`const FILMS` and `const CDN` appear zero times in the bundle while `FILMS.map` is
still there. The component threw on an undefined reference, React's error boundary
swallowed it, and the section rendered empty with no console error to point at it.

Both constants now live inside the component. Recorded the trap in AGENTS.md,
since a blank snippet with a clean console gives no clue on its own.
Labelled 56s, but the file I encoded and uploaded measures 47.6s - there are
several variants of that marketing film on disk and the 1920x1080 one I selected
is the shorter cut. Every other label matches its file to the nearest second.
The hero was an 11MB export of the website-launch film. The finished master is
36.3s at 8.15 Mbps, so the page now serves a high-quality encode made from that
instead - 9MB at CRF 21, which is oversampled for a column under 900px wide.

The colour-grading film was also being derived from a 1080p variant while a
3840x2160 60fps master sat on disk. Its tile and full film are now encoded from
that master.

Both are published under versioned filenames. The first upload set
max-age=31536000, immutable, so the CDN edge kept serving the old bytes when I
replaced the objects in place - the corrected files measured identical to the
originals over HTTP until they were renamed. The component takes optional tile and
full overrides per film so a single asset can be revised this way without renaming
the rest.

Worth recording plainly: none of these films were rendered for the docs. They are
existing renders, transcoded down for the web, so each one's quality is capped by
whatever file already existed. Re-rendering from the launch projects at 4K60 would
raise that ceiling.
The guides were previewing five-second catalog snippets - a chart block standing in
for an explainer, a caption component standing in for a recut. Each now opens with a
cut from an actual film made through that workflow: the Huly launch for product
videos, a SpaceX valuation piece for explainers, one shoot cut three ways for
captions and recuts, a real pull request for PR videos, a per-listener year in
review for motion graphics, a beat-analysed track for music, and a timeline-editing
film for the custom path. Captions name what each clip is from instead of implying
it is a finished film for that page.

music-to-video had no media at all and now does, because the honest asset existed
all along: a 90-second film built from an analysed track.

slideshow still has none. Nothing on disk honestly shows a navigable deck, and a
stand-in on a page about that specific output would be a small lie.

Re-rendering these projects was tried first and rejected. Fresh renders regressed:
variables-launch lost its centre creator clip and rendered white where footage
should be, and the pull-request and cloud films came out two to three seconds short.
The projects reference media that has moved since they were made, so the existing
exports are the better source until each project's paths are repaired.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant