# 0.3.0

> Safer publishing and file writes, custom content ordering, and a more capable front matter editor.

Source: https://hugokit.com/changelog/0.3.0/
Updated: 2026-08-01

---


<!-- INTERNAL RELEASE EVIDENCE – retained with the published note.

     Included in the 0.3.0 work and gate-confirmed as of 2026-08-01:
     - M-01 build trends are persisted with each site, tolerate older saved
       site data without a history field and keep the latest 50 entries.
       Focused suite: 18 passed, 0 failed, 0 skipped; full suite: 338 passed,
       0 failed, 0 skipped (368 runs, 35 parameter runs, 0 runtime warnings).
       The manual app build/relaunch check was waived after confirmation:
       Dashboard exposes no direct Build action, and no target was configured
       just to force one.
     - H-10 config and content editors capture file ID, modification date and
       SHA-256 at load, then fail closed before and inside a write if the file
       changed externally. Reload, Compare and Save Copy preserve the external
       version; structured config copies contain the surgical local candidate.
       Focused suite: 46 passed, 0 failed, 0 skipped; full suite: 333 passed,
       0 failed, 0 skipped (363 runs, 35 parameter runs, 0 runtime warnings),
       plus a manual disposable-fixture gate in both editors.
     - M-04–M-06 front matter strings quote ambiguous YAML values without
       changing CRLF; template previews retain only their exact localhost
       origin, while external HTTP(S) links use the system browser; new sites
       are fully created in private staging before their final atomic move, and
       Pages `baseURL` changes are snapshot-protected surgical TOML edits.
       Focused suite: 63 passed, 0 failed, 0 skipped; full suite: 325 passed,
       0 failed, 0 skipped (355 runs, 35 parameter runs, 0 runtime warnings)
     - H-09 FTP passwords remain a transient wizard value until a successful
       connection test and Done. Credentials follow the stable target ID;
       target, site and factory removal preserve credentials and snapshots by
       default and offer an explicit purge choice. Focused suite: 12 passed,
       0 failed, 0 skipped; full suite: 314 passed, 0 failed, 0 skipped
       (344 runs, 35 parameter runs, 0 runtime warnings)
     - H-08 one injected HugoExecutableResolver for onboarding, build, preflight,
       deploy and auto-fix; direct Hugo installation verifies the release
       checksum and `hugo version` before atomic replacement with rollback;
       focused suite: 7 passed, 0 failed, 0 skipped; full suite: 302 passed,
       0 failed, 0 skipped (332 runs)
     - K-02 GitHub credential host scoping
     - K-03 canonical containment and symlink exclusion
     - K-04 exact auto-fix touched sets and the Preflight Check menu item
     - K-01 immutable PublishRunContext, diagnostic-retry fix and focused
       site-pinning coverage: 209 passed, 0 failed, 0 skipped
     - C-01 Custom order correctness: complete section validation, deterministic
       weights, CRLF/TOML preservation, batch rollback and byte-identical undo;
       full gate: 223 passed, 0 failed, 0 skipped (253 runs)

     - C-02 implementation: one drag/button reducer, typed native drag/drop from
       the full row, full-row preview, directional insertion line, measured
       500-page scan/sort/write budgets, off-main-actor scans, stale-result
       guards, editable existing weight, and site-derived tag/category pill
       pickers, and a shared ASC/DESC direction for Date, Title and Custom
       order; full gate: 234 passed, 0 failed, 0 skipped (264 runs), plus
       manually confirmed drag, persistence, editor, snapshot/undo and sorting

     - C-03 full gate: root, nested and deep
       `_index.*` section landing pages have explicit page-kind identity, use
       the existing editor save pipeline, and are excluded fail-closed from the
       child pages' Custom order write-set; focused tests and build-for-testing
       passed, full suite: 237 passed, 0 failed, 0 skipped (267 runs), and the
       manual section/editor/rescan/order gate is confirmed

     - H-01 full gate: publish-time Hugo, FTP/SFTP and git
       children are owned by immutable run ID + target ID; cancellation is a
       terminal state with no success/failure notification or false history;
       wrapper descendants such as `sshpass → sftp` are terminated as well.
       Focused suite: 13 passed, 0 failed, 0 skipped; build-for-testing passed;
       full suite: 240 passed, 0 failed, 0 skipped (270 runs, 35 parameter
       runs, 0 runtime warnings). The Swift 6 main-actor default-argument
       diagnostic in ContentFilePersistence is removed while retaining its
       injectable test overload. The manual cancellation gate is confirmed

     - H-04 full gate is green:
       external Hugo servers are observed rather than lifecycle-owned; removal,
       reset and quit release them without a signal; explicit Stop requires a
       native warning and confirmation. Focused suite: 5 passed, 0 failed,
       0 skipped; build-for-testing passed; full suite: 245 passed, 0 failed,
       0 skipped (275 runs, 35 parameter runs, 0 runtime warnings). The manual
       fixture confirmed that quit/relaunch, site removal and cancelled Stop
       preserve an external PID; confirmed Stop terminates it, while removal
       terminates a separately app-owned server

     - H-02 full gate is green: every GitHub Pages target now has one explicit
       artifact strategy. GitHub Actions pushes the full project with a
       HugoKit-managed workflow; Built site branch builds in isolation and
       replaces only gh-pages without auto-committing or pushing the source
       branch. Legacy Local Build + Full Project pauses for an explicit choice;
       there is no runtime fallback or silent migration. Full suite: 268
       passed, 0 failed, 0 skipped (298 runs, 35 parameter runs, 0 runtime
       warnings), and the manual UI gate is confirmed. Remote E2E served the
       Actions marker from source 625c431 in successful run 30625677172 and the
       Built marker from gh-pages 3775cf0 while main stayed b41531c. The two
       fixture repositories were temporarily public for the Pages check because
       the GitHub plan blocks private Pages, and were verified private again

     - H-05 full gate is green: Actions status is matched to the pushed commit,
       target branch and HugoKit-managed workflow path, then pinned to one run
       ID for all later status and job reads. Older or mismatched runs cannot
       become a false success or failure; no match is a distinct timeout.
       Focused suite: 10 passed, 0 failed, 0 skipped; build-for-testing passed;
       full suite: 289 passed, 0 failed, 0 skipped (319 runs, 35 parameter
       runs, 0 runtime warnings). No remote E2E or manual publish gate was run
       for this card

     - H-07 full gate is green: FTP manifests now identify protocol, canonical
       host, port, username and remote root. Delete-denied paths remain pending
       and return in the next diff; an already missing remote file is treated
       as an idempotent success. Focused suite: 11 passed, 0 failed, 0 skipped;
       build-for-testing passed; full suite: 295 passed, 0 failed, 0 skipped
       (325 runs, 35 parameter runs, 0 runtime warnings)

     Release preparation reconciles this note with the final source commits and
     publishes the appcast only after the verified GitHub artifact is public. -->

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


---

From [HugoKit](https://hugokit.com/) – A Mac app for Hugo: run the server, preview your pages and publish your site from one window. Free, native, no terminal – built by one person for his own sites.
