Skip to content

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-mongodb scenario: the frontend now runs as a static site served by Nginx (production image) instead of the Vite development server. It still listens on port 5173 and 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-full scenario 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 F2 or 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+B toggles 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, and Shift+F10 to 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 403 otherwise.
  • 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.py instead 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.md and deploy/README.md document 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 401 on deleted accounts and for the active shared-link and active-plan queries.
  • Full suite: 266 tests, 51.73% coverage (45% gate).

🔧 Internal

  • ruff clean across the backend and 28 fewer mypy errors (238 versus 266).