Skip to content

devdrivr v0.1.100

Choose a tag to compare

@github-actions github-actions released this 12 Sep 09:53
e443a22

What's new

Your data leaves the app and comes back. Notes, Snippets, API Requests and Prompt Templates each export to a file and restore from one, from inside the tool or from Settings → Data. Every import is checked before a single row is written.

This release also carries everything from 0.1.99.

New

  • Back up any dataset from Settings → Data. Notes, Snippets, API Requests and Prompt Templates each have Export and Import. Export writes a JSON file you choose the location for. Import reads one back.
  • Notes keep their attachments. An exported notes backup carries the image and file attachments with the notes, so a restored note is complete rather than a page of broken links.
  • Settings export to a file. Export, Import and Reset to defaults sit under Settings → Data. A settings file moves your themes, editor preferences, pinned tools and window behaviour to another machine.
  • One naming convention for every backup. Files arrive as devdrivr-notes-backup.json, devdrivr-snippets-backup.json, devdrivr-api-requests-backup.json, devdrivr-prompt-templates-backup.json and devdrivr-settings-backup.json. The save dialog suggests the name; you choose where it goes.

Fixed

  • An import can no longer corrupt a dataset. Settings, API collections, snippets and prompt template imports were written to the store as they arrived. A hand-edited or truncated file became bad data you then had to find and remove. Every import is now validated first, and a bad file gives a message naming what is wrong.
  • Export no longer writes an empty file over a real backup. Snippets, API Requests and Prompt Templates load when you first open their tool. Opening Settings started that load, but left Export live while it ran. A click in that window saved an empty dataset. Each row now waits until its data is loaded.
  • Two data actions can no longer collide. Clearing a dataset reloads it from the database while an import adds to whatever it finds, so running both at once duplicated or dropped rows. One data action runs at a time.
  • A dataset that fails to load says so. The failure was discarded silently, leaving a row that looked empty rather than broken.
  • A cancelled file dialog does nothing. Closing the picker without choosing a file is no longer treated as an empty import.
  • Eight tool inputs have a name. A field labelled only by its placeholder text is announced inconsistently by a screen reader, and has no name at all once you type in it. Those fields now reference the heading already above them.

Changed

  • Settings → Data is rebuilt. The page used three destructive verbs for two behaviours, and its buttons did not line up.
    • Two verbs, and they mean something. Trash moves items to the Trash and can be undone. Delete is permanent. The rule is stated on the page.
    • The action columns line up. Export, Import and the destructive button sit in the same three columns on every row, and the row no longer shifts when you click.
    • The Storage grid is gone. It repeated four counts the rows below already showed, and left an empty box. History moved in beside the other datasets.
  • The API Client exports to a file, not the clipboard. A full API backup carries authentication values, headers, bodies and every environment variable. That is a poor fit for the clipboard. The warning before the export is unchanged, and still worth reading.

Behind this

bun run audit:rendered is a new check. It opens every tool in a real browser and inspects the resolved page — the elements as they exist after rendering, with their computed styles — rather than reading the source.

The reason it renders: a rule about what the source contains survives a text search. A rule about what a control lacks does not. A hardcoded colour stays a literal however the class is assembled, so a search finds it. Asking instead whether a button is missing a focus ring is defeated by any indirection — a shared constant, a helper call, a lookup table.

Measured on this codebase: searching the 67 hand-written buttons for a missing focus ring returned 47 results, of which zero were real. One file declared the ring as a constant. The rest were a pattern that stopped reading at the arrow inside onClick, so it never reached the styling at all.

The audit checks unnamed controls, controls named only by a placeholder, interactive elements nested inside each other, references to element ids that do not exist, duplicate ids, and — by pressing Tab through the whole app — focus rings that never become visible. It runs clean across all 31 tools and the shell.

Download the installer for your platform from the assets below.


Full changelog: devdrivr-v0.1.98...devdrivr-v0.1.100