0.7.0 (2026-09-29)¶
A release focused on the editor and on the project's foundations: the file and folder explorer is fully redesigned, switching diagrams no longer flashes, the frontend gets a lightweight non-root production image, and the backend is aligned with its layered architecture.
⬆️ Upgrade notes¶
deploy/external-mongodbscenario: the frontend now runs as a static site served by Nginx (production image) instead of the Vite development server. It still listens on port5173and uses the same variables (VITE_API_URL,VITE_SENTRY_DSN,VITE_APP_ENV), which are now read when the container starts: changing them only needs a container recreate, not a rebuild. To upgrade, rebuild the image (docker compose up -d --build). The container no longer mounts the frontend source code.- The
deploy/local-fullscenario is unchanged: it keeps the development server with hot reload.
✨ Features¶
File and folder explorer¶
- Per-diagram action menu (
⋯button or right-click): rename, duplicate, move to a folder, move to another project and delete. The tree used to offer delete only. - Inline rename with
F2or double-click, for diagrams and folders. - Move to a folder without dragging, from the menu. Also works on mobile and with the keyboard.
- Folder menu: new diagram in the folder, rename and delete. Empty folders show a "New diagram here" shortcut.
- Pin the panel with the pushpin, the same one as the description panel: it stays open on outside clicks and across reloads.
Ctrl/Cmd+Btoggles the explorer (inside the description editor it keeps its bold function).- The explorer pushes the content instead of covering it: code, preview and the status bar (save state, zoom, date and time) always stay visible.
- Adjustable width between 200 and 480 px, by dragging the edge or with the keyboard; double-click resets it. The width is remembered.
- Expanded folders remembered per project.
- Easier to scan: folders first, a badge per diagram type (MMD, PUML, D2, DBML, DRAW), full title on hover, and a result counter while searching ("3 of 24 diagrams").
- Visible drop zone to move a diagram out of its folder while dragging.
- Keyboard navigation: arrows to move and to open or close folders,
Home/End, a single Tab stop, andShift+F10to open the row menu.
Editor¶
- Smooth diagram switching: opening another diagram from the explorer covers the workspace with a centered "Loading diagram…" indicator and reveals it all at once, with a fade, once the new diagram is drawn. The whole editor no longer disappears, and parts no longer load out of step.
- Language selector with the collapsed sidebar: the flag stays visible and opens the language menu.
Deployment¶
- Frontend production image: a static site served by Nginx as a non-root user, with security headers, gzip, asset caching and a healthcheck. 68 MB versus 951 MB for the development image.
- Runtime configuration: the API URL and Sentry are injected when the container starts, so one image serves every environment. Works with DigitalOcean App Platform (Static Site).
🔒 Security¶
- The AI diagram fixer checks that the diagram belongs to the user and answers
403otherwise. - Non-root frontend in production (
nginx-unprivileged) with security headers. A Content-Security-Policy example (csp.conf.example) ships disabled by default, to enable per deployment.
🐛 Fixes¶
- Dragging a diagram onto a folder could leave it at the root: dropping sent two parallel requests (folder and root) and either one could win. The folder highlight while hovering never showed either.
- Explorer search hid results inside collapsed folders, and emptied folders that matched by name.
- The editor re-rendered entirely every second because of the status-bar clock, which hurt typing smoothness. Date and time now also follow the interface language.
- Creating, moving, renaming or deleting from the explorer reloaded the whole editor behind the loading screen. Changes now show instantly and, if they fail, roll back with a notice.
- The preview went blank for a moment on every redraw, including while typing code.
- With the sidebar collapsed and the explorer pinned, the sidebar tooltips were hidden, so there was no way to tell what each option was.
- With the side panels open, the status bar wrapped onto two lines.
- A token for an account that had been deleted caused a 500 error on protected routes; it now answers
401. - Editor error notice: it couldn't be closed, had no dark mode and never went away on its own.
♻️ Refactors¶
- Backend aligned with its layered architecture across all 14 modules: services depend on interfaces rather than concrete repositories, no longer touch the database or the Stripe SDK directly (everything goes through
IPaymentProvider), and business logic moved out of the routes. - Authentication dependencies unified in
app/api/deps.pyinstead of per-module copies. - AI clients share a public
complete()method across all 5 providers. - Bulk deletes instead of one-by-one loops (projects and folders).
📝 Docs¶
INSTALL.mdanddeploy/README.mddocument the frontend production image, runtime configuration and the App Platform Static Site variant.- Docstrings completed across every backend file touched.
🌐 Translations¶
- Strings that were hardcoded in Spanish are now translated (Spanish and English): the new-folder modal, "Saved … ago", pin/unpin panel, explorer error messages, the language selector title and the diagram loading indicator.
🧪 Tests¶
- Regression tests for the
401on deleted accounts and for the active shared-link and active-plan queries. - Full suite: 266 tests, 51.73% coverage (45% gate).
🔧 Internal¶
ruffclean across the backend and 28 fewermypyerrors (238 versus 266).