Repository navigation
devdrivr v0.1.100
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.jsonanddevdrivr-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