HugoKit

0.3.0

0.3.0 keeps every publish and protected file write tied to the site and files you chose – and adds a deliberate way to order content without rewriting the rest of its front matter.

New

  • Editable section landing pages: based on user feedback, root, nested and deeply nested _index.* branch-bundle pages now appear in Content with an explicit section label and open in the same Preview, Raw and structured front matter editor as other pages. Leaf-bundle index.* files remain a distinct page type
  • Custom order: based on user feedback, choose one content section, then drag pages or use the row buttons to arrange it. HugoKit validates the complete section, writes predictable front matter weights only to changed pages, and captures them as one undoable snapshot. If any page cannot be edited safely, the whole reorder stops; if a disk write fails partway through, touched files are restored
  • Front matter weight editing: when a page already has a weight, the structured editor now shows and edits it directly without adding the field to unweighted pages
  • Existing tags and categories at a click: the + buttons beside Tags and Categories open the values already used across the site as selectable pills. Larger collections are searchable, selected values disappear from the picker, and manual entry still works

Improved

  • Build trends survive a restart: each site’s recent successful and failed builds are saved with the site, keep the latest 50 entries and start empty for sites created before build trends existed
  • Editors stop before overwriting external work: Content and Configuration remember a file’s identity, timestamp and bytes when you open it. If another editor changes the file, HugoKit writes nothing and offers Reload File, Compare or Save Copy instead. Structured configuration edits keep their surgical local candidate when you compare or save a copy
  • Front matter keeps text as text: values that look like YAML booleans, numbers, dates or comments are quoted when edited, while line endings and untouched front matter stay intact
  • Template previews stay local: links, redirects and new windows remain in the preview only for its exact localhost origin. External web links open in the system browser, while other local ports and custom schemes are blocked
  • Site creation completes atomically: Blank and HugoKit Starter sites are built in private staging and appear in the selected folder only after Hugo, template installation and all scaffold writes succeed. GitHub Pages baseURL edits now preserve TOML comments and unknown keys and create a recovery snapshot
  • FTP credentials and snapshots have deliberate lifecycles: a tested FTP password is only saved when you finish the wizard, and it remains attached to its deploy target rather than a mutable endpoint. Removing a target, site or all local settings now tells you exactly what remains; passwords and snapshots stay by default, while a separate purge choice removes them together.
  • Preflight validates the published artifact: local preflight, manual builds and FTP or Built site branch publishing now share target-specific Hugo arguments, an isolated .hugokit/build/<target-id> destination and one per-project build gate. Local deploys consume the validated artifact directly, so the user’s public/ folder stays untouched and preflight cannot approve a different build from the one that ships. GitHub Actions continues to build its artifact remotely.
  • Explicit GitHub Pages publishing: each target now chooses GitHub Actions or Built site branch. Actions pushes the full project with a HugoKit-managed workflow; Built site branch builds locally and replaces only gh-pages without pushing the source branch. Existing Local Build + Full Project targets pause for an explicit choice instead of silently falling back
  • Workflow status stays with its publish: after an Actions push, HugoKit matches the exact commit SHA, target branch and managed workflow path before accepting a run. It pins that run ID for status and jobs, and reports a separate timeout when no matching run appears
  • FTP sync stays with its endpoint: manifests now include protocol, canonical host, port, username and remote root, so two targets that share a host and path cannot reuse each other’s sync state. Delete failures remain pending for the next publish, while already missing remote files are treated as success
  • Publish stays with its starting site: the site, project, targets and run identity are captured before preflight and carried through build, credentials, history, Git status, notifications and target health, even if you select another site while it runs
  • Cancellation has exact ownership: every publish target owns its own Hugo, FTP/SFTP and Git child-process handles under the immutable run identity, so parallel targets cannot replace each other’s process state
  • External servers remain externally owned: when HugoKit finds a server started in Terminal or another tool, site removal, factory reset and quitting release HugoKit’s monitoring without stopping that process. Choosing Stop or Restart in HugoKit clearly identifies the external server and asks for confirmation before termination
  • GitHub credentials stay on GitHub: push and pull attach the token only to the canonical github.com HTTPS host, reject other hosts and do not follow redirects to somewhere else
  • Git locks stay owned: HugoKit no longer deletes .git/index.lock and retries merely because Git mentions a lock. A running Git operation in Terminal, Xcode or another Git app is left untouched, and HugoKit stops with a clear explanation.
  • Protected writes fail closed: HugoKit resolves symlinks before a guarded write and rejects the whole operation if any destination escapes the site’s canonical root
  • Exact preflight snapshots: an auto-fix now carries the full project-relative path for every file it will touch, so its preview, snapshot and applied change describe the same set
  • Preflight from the site menu: Preflight Check now has a named item in the site’s ⋯ menu as well as its existing keyboard shortcut
  • Front matter stays intact during reordering: YAML and TOML keep their line endings, body, comments, unknown fields and existing weight-line formatting. New TOML root weights are placed before tables instead of accidentally becoming table values
  • Complete content scans: Custom order accounts for every built-in Hugo content format and deep section path, so an unsupported page cannot remain hidden while the visible subset receives new weights
  • Native-feeling reordering: drag from anywhere on a page row, keep the full-row preview and place it at the insertion line above or below another row. Dragging uses the same deterministic command path as the accessible up/down buttons
  • Ascending or descending sorting: Date, Title and Custom order share an explicit ASC/DESC control. Dates switch between oldest and newest first, titles between A–Z and Z–A, while undated pages stay at the bottom. Custom reordering in either direction writes normalized weights that return in the same visible sequence after a rescan
  • Faster large sections: content discovery traverses each directory once, reuses parsed front matter and keeps scanning work off the main actor. A fixed 500-page benchmark now guards scan, sort and batch-write budgets
  • Stable asynchronous refreshes: a late content scan is ignored after cancellation or a site switch instead of replacing the current site’s rows
  • Section-safe custom ordering: section landing pages stay outside their child section’s draggable rows, scanner race checks, snapshots and weight write-set, so their bytes and any section-level weight remain unchanged during reorder

Fixed

  • Switching sites while a publish is waiting no longer lets the run continue with the newly selected site’s project, destination or post-publish state
  • Cancelling a publish no longer resets the UI to idle or reports CancellationError as a deploy failure. All live children in the run—including descendants of command wrappers—are stopped, target and run status end as cancelled, and no success or failure notification is sent
  • Existing-server detection no longer misses the same project merely because one copy of its folder URL has a trailing slash
  • Content scans no longer follow symlinked files or folders outside the content root
  • Auto-fixes for nested config and template files no longer reduce the path to a basename or snapshot a lookalike file at the site root
  • Ambiguous, quoted or duplicate root weight keys no longer risk receiving a second semantic weight during batch reorder
  • A visible drag preview can no longer take the old provider-only path that failed to deliver an accepted drop on macOS; custom order now uses typed SwiftUI drag destinations
  • Tags and categories cannot be added twice merely by using different letter casing

Notes

  • Requirements: macOS 26 (Tahoe) or later