SignPath Foundation's OSS program requires the attribution notice, and a
route to the code signing policy, on a project's home page and
download/release pages. Worktrunk had both only on the policy page
itself — nothing on the README or the docs landing page. This puts the
notice in the install section's Windows block, beside the artifacts it
actually describes:
> Free code signing provided by [SignPath.io](https://signpath.io/),
certificate by [SignPath Foundation](https://signpath.org/) —
[policy](https://worktrunk.dev/code-signing/).
The edit is one line in `docs/content/worktrunk.md`; the README's
Install→Further reading block is generated from it, so it propagates
there and to both skill mirrors.
The policy page leaves the docs navigation in the same change, so this
is the single place it's linked from. `hide_from_nav = true` in a page's
`[extra]` skips it in all three loops over `docs_section.pages`: the
desktop TOC (`macros.html`), the mobile menu (`base.html`), and the
prev/next flow nav (`page.html`). The page stays published and reachable
at `/code-signing/` — unlisted, not removed.
In the nav loops the skip wraps the whole per-page body, so a hidden
page can't emit a stray group heading. In the prev/next loop it guards
only the *candidate* assignments — the current-page test stays
unguarded, because viewing a hidden page directly must still flip
`found_current` or its own neighbours compute against the wrong page.
Verified both directions: FAQ ends at `← Tips & Patterns` with no
forward link, and the policy page keeps `← FAQ` back out into the docs.
<details><summary>Why this came up, and the placement tradeoff</summary>
Found while debugging why the `release-signing` signing policy shows
INVALID in the SignPath console. That turned out to be unrelated and not
fixable here — its certificate ("Release certificate 2026", subject
`CN=SignPath Foundation`, on SignPath's HSM) is in `CSR PENDING` with no
validity dates, awaiting CA issuance. The policy's own configuration is
complete and correct. Worktrunk currently signs with the test
certificate, which is VALID.
The attribution gap was the one thing found on our side. Whether it
bears on the pending review is unknown — the console exposes no
application status.
On placement: the notice sits inside the collapsed `<details>`, so it
isn't visible until a reader expands "Windows & other". That's
deliberate — the signing is Windows-specific and the notice reads better
next to it than in the page chrome — but it is the least prominent
placement that still counts as a link, and the terms ask for the notice
*on* the home and download pages. Worth knowing if placement is ever
queried during review.
</details>
> _This was written by Claude Code on behalf of max-sixty_
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
The home page (`/`) and `/worktrunk/` serve identical content (the index
template renders `worktrunk.content` directly), but each declared its
own
canonical URL. Google saw two competing pages and wasn't indexing either
as
the home page result.
- Set canonical + og:url on `/worktrunk/` to point to `/`
- Fix home page og:title/twitter:title — was just "Worktrunk", now uses
the
full tagline from `config.extra.site_description`
- Align `worktrunk.md` description with `site_description`
> _This was written by Claude Code on behalf of @max-sixty_
Co-authored-by: Claude <noreply@anthropic.com>
## Summary
- Add per-page `<meta name="description">` to all doc pages — command
pages auto-generated from CLI `about`/`long_about` via new
`--help-description` flag, non-command pages manually written
- Add `<link rel="canonical">` URLs and JSON-LD structured data (WebSite
+ SoftwareApplication) on the homepage
- Add custom `sitemap.xml` template with `<lastmod>` dates and
descriptive homepage `<title>`
- Extract shared `extract_about_and_subtitle()` helper, eliminating
duplicated subtitle logic between `handle_help_description` and
`combine_command_docs`
- Fix broken anchor in faq.md (`#picker-summaries` →
`#branch-summaries-experimental`)
## Test plan
- [x] Full test suite passes (2713 tests via `wt hook pre-merge --yes`)
- [x] All lints clean (pre-commit, clippy, cargo fmt)
- [x] Doc sync test confirms auto-generated descriptions match CLI help
- [x] Zola build succeeds with all template changes
> _This was written by Claude Code on behalf of @max-sixty_
---------
Co-authored-by: Claude <noreply@anthropic.com>
## Summary
- Migrate from static CSS syntax highlighting to Zola's giallo engine
with custom `worktrunk-light.json` theme
- Replace hardcoded `syntax-light.css` / `syntax-dark.css` with
theme-based class generation
- Design a warm "sunlit workshop" palette: amber commands, gold strings,
chartreuse quoted strings, rusty constants
- Add CSS sibling selector to differentiate quoted from bare strings
(giallo tokenizes both as `z-string`)
## Test plan
- [ ] Verify syntax colors on `/switch/` (bash: commands, flags,
strings, quoted strings)
- [ ] Verify TOML blocks on `/config/` (section headers, keys, values)
- [ ] Verify dark mode is unaffected (quoted string CSS rule scoped to
`prefers-color-scheme: light`)
- [ ] Check all tests pass (`cargo test`)
> _This was written by Claude Code on behalf of @max-sixty_
---------
Co-authored-by: Claude <noreply@anthropic.com>
Google recommends favicons of at least 48x48 pixels for proper display
in search results. The previous 32x32 favicon was below this threshold.
Changes:
- Add favicon-48.png (48x48) as primary favicon
- Add apple-touch-icon.png (180x180) for iOS home screen
- Update base.html to include sizes attributes for browser selection
Co-authored-by: Claude <noreply@anthropic.com>
Move code block wrapper creation from deferred JavaScript to a synchronous
inline script at the end of <body>. This ensures the DOM structure is
finalized before the browser's first paint, eliminating the visible "jump"
when code blocks were wrapped after initial render.
Split into two phases:
1. Inline sync script wraps <pre> in .code-block-wrapper before first paint
2. Deferred code-copy.js adds copy buttons to existing wrappers
Co-authored-by: Claude <noreply@anthropic.com>
* Redesign social cards with horizontal layout
- New horizontal layout: logo left, text right
- Warm radial glow emanating from logo
- Refined typography: 88px title with tight tracking, 28px tagline
- Darker title color (#1a1817) for better hierarchy
- Move generated PNGs to assets repo (same pattern as demos)
- Add build script with automatic font downloading
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix deploy workflow to include social cards
The assets repo now has both demos/ and social/ directories.
Co-Authored-By: Claude <noreply@anthropic.com>
* Simplify assets structure: single path copy
Restructured worktrunk-assets repo to have all content under assets/
so deploy workflow can use a single `cp -r` command.
Co-Authored-By: Claude <noreply@anthropic.com>
* Address review feedback
- Fix typo: "ONGs" → "PNGs"
- Fix stale comment: "Google Fonts" → "GitHub releases"
- Add -f flag to curl for better error handling
- Document purpose of each social card size
Co-Authored-By: Claude <noreply@anthropic.com>
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Fix asset URL in README for restructured repo
The worktrunk-assets repo was restructured from demos/ to assets/.
Update the URL transform in readme_sync.rs to match.
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix README demo links after assets repo restructure
- Update wt-core.gif URL from demos/ to assets/ path
- Add PNGs exception to typos config (was incorrectly flagged)
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Hide demo images until they finish loading to prevent broken-image icon
flash. Add JavaScript to detect load completion and visibility toggle via
CSS class. Update demo figure styles to support dynamic visibility and
maintain aspect ratio during scroll.
The 1Password browser extension rewrites code blocks with `language-*`
classes, replacing Zola's syntect-generated spans with its own Prism tokens.
This breaks all syntax highlighting colors.
Fix: Add `data-1p-ignore` attribute to code blocks via MutationObserver,
which tells 1Password to skip processing these elements.
Also fix CSS to let syntax highlighting colors apply by removing hardcoded
color from code blocks and using `color: inherit` for `.content pre code`.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude <noreply@anthropic.com>
- Add `insert_anchor_links = "heading"` to Zola markdown config for automatic heading anchors
- Style anchor links with hover effects: h2 underlines intensify, h3/h4 shift to accent color
- Add `scroll-margin-top` to content area to account for sticky header when scrolling to anchors
- Wrap homepage and page title headings with anchor links for deep linking
- Add new test fixtures: `repo_with_remote_and_feature`, `repo_with_alternate_primary`, `repo_with_multi_commit_feature`, and `add_feature()` shorthand
- Consolidate help tests from individual functions to parameterized rstest
- Update directives and merge/push tests to use new fixture helpers
- Update snapshot tests with corrected commit messages from new fixture usage
- Add Contributing section to README with star, feedback, feature request,
and share links
- Add social icon buttons to docs footer (GitHub, Crates.io, X, Reddit,
LinkedIn) replacing redundant text links
- Move FAQ "How can I contribute?" section to bottom of page
- Update share links to point to worktrunk.dev instead of GitHub
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude <noreply@anthropic.com>
Custom "warm workbench" theme now self-contained without Juice inheritance. Eliminates theme extension complexity and provides complete control over documentation site design.
Key changes:
- Removed docs/themes/juice submodule and all Juice template inheritance
- Rewrote base.html as standalone template with full HTML structure
- Migrated all Juice CSS variables and utilities into custom.scss
- Updated config.toml to remove theme reference and rename juice_* config keys
- Consolidated template structure: page.html and index.html now extend base.html directly
- Removed lychee exclusion for Juice theme README (no longer applicable)
- Moved normalize.css from theme to docs/static for direct control
The theme is now fully self-hosted with no external dependencies, making it easier to maintain and extend.
Add social-card.png (1200x630) to support OpenGraph and Twitter Card
previews. Uncomment and activate the og:image, og:image:width,
og:image:height, and twitter:image meta tags. Change Twitter Card type
from "summary" to "summary_large_image" to display the social card.
Details now live in base.html next to the JS fix.
CLAUDE.md just references it. Fixed outdated comments
that incorrectly claimed lvh was stable on Firefox iOS.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
The `--vh-full` CSS variable and its JavaScript polyfill are no longer needed.
Modern browsers including iOS Safari 17+ support `lvh` (large viewport height)
natively and correctly. Using `100lvh` directly eliminates the polyfill overhead
and simplifies the codebase while maintaining stable viewport behavior on iOS.
Remove -webkit-fill-available workarounds that caused layout thrashing.
The polyfill now captures viewport height once at load and only updates
on actual device rotation (orientationchange), eliminating the jank from
continuous resize/scroll event handling. CSS fallback to 100lvh remains
stable on modern browsers.
Replace svh/lvh with -webkit-fill-available on iOS WebKit browsers, which
provides stable viewport height against browser chrome animation without
relying on broken minimumViewportInset/maximumViewportInset APIs.
Enhanced the viewport height polyfill to track the minimum of innerHeight,
clientHeight, and visualViewport.height across resize, orientationchange, and
visualViewport events. This captures the smallest available space to approximate
the "small viewport" used by Safari when browser chrome is fully visible.
Applied -webkit-fill-available to html, body, .hero, and .mobile-menu elements
within the iOS WebKit @supports block. Used SCSS string interpolation to bypass
calc() parsing and preserve the full expression for browser evaluation.
Firefox iOS incorrectly implements svh as dvh, causing scroll jank
when browser chrome appears/disappears. lvh (large viewport height)
should be stable.
Also simplify JS and remove --safe-area-top workaround that didn't help.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Replace direct env(safe-area-inset-top) calls with a JS-locked CSS variable
(--safe-area-top) to prevent scroll jank on Firefox iOS and Chrome iOS when
browser chrome appears/disappears during scrolling.
The env() value fluctuates during toolbar animation, causing layout shifts.
By reading the computed safe area inset once on page load and caching it in
a CSS variable, we provide a stable value throughout the viewport lifecycle.
Updates all usages in header, hero section, mobile menu, and media queries
to use the locked variable with env() as fallback.
Apply --vh-full variable consistently across layout components that depend
on stable viewport measurements. The TOC sticky max-height and hero image
max-height now use calc(var(--vh-full, 100svh) * ratio) to respect the
JS-computed value that accounts for browser chrome on iOS.
Expand iOS detection to all devices for testing, use visualViewport.height
as primary measurement source, and add pageshow/orientationchange handlers
to re-sync viewport height on bfcache restore and orientation changes.
Firefox and Chrome on iOS incorrectly implement svh as dvh, causing layout
shifts when browser chrome appears/disappears during scroll. This adds a
JavaScript fix that sets a custom CSS variable (--vh-full) from
window.innerHeight on these browsers, providing a stable viewport height
value. All svh-based calculations now use this variable with svh as fallback
for other browsers.
Updates both body and .hero min-height/height, .mobile-menu height, and
mobile .hero height to use the stable value. Comments expanded to reference
the Firefox iOS issue and explain the workaround.
The theme already includes _variables.html at line 12 of juice/templates/index.html,
and Zola resolves it to our custom templates/_variables.html. Removing the duplicate
include eliminates the redundant file load.
Replaces the multi-variant workflow with a single gemimg call that
generates one logo, then processes it into three sizes: logo.png (512px),
logo@2x.png (1024px), and favicon.png (32px). Each variant gets rounded
corners applied with appropriate radius for its size.
Updates favicon from SVG to PNG to match the generated logo style.
Updates base.html template to reference the new favicon.png.
Update viewport meta tag to use viewport-fit=cover for edge-to-edge display on notched iOS devices. Adjust header height calculations to account for safe-area-inset-top, ensuring content isn't compressed under the notch or Dynamic Island. Add solid scrim behind translucent Safari chrome to prevent sampling of scrolling content. Update mobile menu and hero section height calculations to accommodate iOS safe areas. Push header padding below notch on both desktop and mobile viewports.
Move the mobile menu button before the navigation element so it appears
on the left side of the header. Adjust margin from margin-left to
margin-right to maintain proper spacing with the new position.
Implement a responsive mobile navigation menu for the documentation site,
activated at the 768px breakpoint. Includes a hamburger toggle button in
the header, slide-out menu drawer with overlay, and keyboard/click-to-close
functionality.
- Add mobile menu toggle button with animated icon swap
- Create slide-out menu drawer with documentation navigation
- Add semi-transparent overlay that closes menu on click
- Implement keyboard (Escape) and link-click menu close handlers
- Auto-close menu on viewport resize to desktop sizes
- Add mobile-specific styling for nav items and table of contents
- Load mobile-menu.js script for interaction handling
- Adjust z-index layering for menu drawer (200) and overlay (199)
Enable View Transitions API for same-origin navigation with 50ms animation duration. Add instant.page for prefetching to improve perceived performance. Respect prefers-reduced-motion by disabling transition animations for users who prefer reduced motion.
Implements a floating copy button that appears on code block hover, with special handling to strip shell prompts from terminal blocks before copying.
New files:
- code-copy.js: Attaches copy buttons to all code blocks, strips leading `$ ` from bash/shell/terminal blocks, shows checkmark feedback for 2 seconds after successful copy
Style updates:
- .code-copy-btn: Positioned absolutely in top-right, hidden by default with opacity transition, styled to match design system colors
- .content pre:hover .code-copy-btn: Reveals button on code block hover
- Button includes copied state with accent color highlight
Code blocks now feature a distinctive left accent border with subtle shadows
and hover effects for better visual hierarchy. Terminal output styling updated
with improved line-height calculations and gutter spacing.
Typography improved by adding Inter and Plus Jakarta Sans fonts for better
readability and visual distinction between body and heading text.
Hero section enhanced with warm radial gradient background, glowing logo effect
with hover animation, and floating "explore more" button animation. Dark mode
adjustments ensure consistent visual experience across color schemes.
Add responsive logo preloading with device pixel ratio media queries to serve high-DPI variants on appropriate devices. Include preload directives for syntax highlighting stylesheets and custom CSS to reduce render-blocking. Add explicit dimensions, decoding hints, and fetchpriority attributes to logo images for better perceived performance and Core Web Vitals.
This commit introduces a new script `dev/generate-logo.sh` along with its prompt `dev/logo-prompt.json` to create logo variants.
It updates the documentation to:
- Reference the new PNG logo files instead of the old SVG.
- Include `logo-variant-*.png` in the `.gitignore`.
- Update the favicon to use the new logo's style.
- Adjust CSS for logo display and hero image.
The default Juice header includes the full navigation menu in the
header, which is already present in the sidebar. This commit
customizes the header to only include a logo and a simplified
menu with "Get Started", "Tips", and "GitHub" links.
Also removes `juice_exclude_menu` since we are manually defining
the header.
Implement a custom "warm workbench" theme for the Worktrunk documentation,
built on the Juice Zola theme. Key features:
- Warm color palette with WCAG AA compliant contrast ratios
- Sticky header and TOC with definitional CSS variable positioning
- Smooth scroll behavior for anchor links and hero buttons
- Logo preload to prevent flash on navigation
- Scrollbar-gutter: stable to prevent layout shift
- Responsive breakpoints with variable overrides
- IntersectionObserver intercept to disable conflicting scroll-spy
The layout system uses CSS custom properties (--wt-header-height,
--wt-main-padding-top) so all dependent calculations stay in sync
automatically, preventing visual jumps when the TOC transitions to
sticky mode.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude <noreply@anthropic.com>
Add a meta description to the base HTML template for better search engine indexing.
Introduce a `robots.txt` file to manage web crawler access and provide a sitemap link.
* Refactor: Standardize user messages for improved clarity
This commit introduces a set of refinements to user-facing messages across the application. The goal is to ensure consistency in tone, terminology, and presentation, making interactions more intuitive and understandable for users.
* feat: Add a documentation site for Worktrunk
This commit adds the initial scaffolding for the Worktrunk documentation site, built with Zola and a customized Juice theme.
The site includes:
- Basic configuration (`config.toml`)
- Custom SASS styling (`custom.scss`)
- Custom SVG logos and favicons
- Overridden Zola templates (`base.html`, `index.html`, `page.html`)
- Markdown content for:
- Quick Start
- Concepts
- Configuration
- Commands Reference
- Advanced Features
- FAQ
The content is an initial auto-generated draft and requires review for accuracy and completeness before being considered production-ready. A `CLAUDE.md` file is included to highlight this and list necessary verification steps.
* feat: Add GitHub Pages deployment workflows
Build Zola docs site and deploy to worktrunk.dev on push to main.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>