• v2.0.0-rc2 ab78e1a299

    v2.0.0-rc2
    All checks were successful
    release / rpm (push) Successful in 15m7s
    release / appimage (push) Successful in 5m37s
    build / check (push) Successful in 7m20s
    Pre-release

    Ghost released this 2026-09-22 17:38:43 +00:00 | 87 commits to master since this release

    Version history becomes per profile: two profiles holding the same domain
    shared one installation-wide history, so a restore in one account could write
    the other's records over it. A record edit or a bulk delete confirmed after
    switching zones also acted on the zone that was selected by then.

    Added in 2.0.0-rc2

    • Every profile now has its own version history. Two profiles holding the
      same domain shared a single history, so restoring the oldest version of
      example.com in one account could write another account's records over it.
      The old repository is opened read only and listed under Earlier shared
      history
      with Restore disabled and the reason beside it, rather than being
      merged or deleted.
    • An account summary on the Settings page: the profile, the account email,
      how many domains it holds, how many of those are verified, and how many record
      sets are cached. The verified count is red when a domain is unverified,
      because deSEC stops raising the domain limit while one is, and a token without
      the manage tokens permission is now told that rather than being told the
      account has not synced yet.
    • Qt's own messages now reach the Log Console. The Wayland and X11 platform
      plugins, QSslSocket and QProcess log through a channel separate from Python's
      logging and previously reached only the terminal, which is nowhere at all for
      anyone starting this from a desktop menu.
    • A demo profile says what it is in the Log Console, as the first line there:
      the data is generated, and the live delegation and DNSSEC checks do not run,
      with every padlock derived from the stored records. "Retrieved N zones from
      API" no longer appears on a demo profile either.

    Fixed in 2.0.0-rc2

    • Help tooltips turned up anywhere on the screen under Wayland, nowhere near
      the question mark they belong to, with an opacity warning repeating on the
      console. A tooltip is an ordinary child of the window now, clamped to that
      window's own edges, which behaves identically on Wayland, on X11 and
      offscreen.
    • A one-word help tooltip was drawn as a wide slab sitting to the left of its
      icon.
      The label is sized from its own text now, capped where it always was
      so a long tooltip still wraps exactly as before.
    • A help tooltip's background was black on some pages and right on others,
      depending on whether an ancestor carried its own stylesheet. Every help icon
      uses the themed tooltip qfluentwidgets ships.
    • An apostrophe in a help tooltip was painted as '. Ampersands and
      angle brackets are still escaped.
    • Every version history entry described a change it did not contain. The
      snapshot was taken from the record list the widget was already holding, which
      is the state from before the write, and where that list matched what was
      already committed the entry was skipped in silence. The commit is taken from
      what the API returns on the refresh that follows every mutation now, keyed to
      the zone it names.
    • A zone emptied of all its records could not be recorded at all, which is
      the state a user is most likely to want back.
    • A bulk delete left no version history entry whatsoever. It files one entry
      for the batch now, naming up to three records and past that a count with a
      sample, and a batch the API refused in part records the accepted count with
      the refusals named beside it.
    • A record opened for editing while its zone was still loading was saved into
      the wrong zone.
      Rows are dropped the moment the selection changes, an answer
      for a zone already left is discarded, and every row carries the zone it was
      built for.
    • A bulk delete confirmed after switching zones deleted from the wrong zone.
      The confirmation is an overlay rather than a modal dialog, so the sidebar
      stays live while it is open; the zone is captured with the rows now.
    • Everything a queued mutation did afterwards followed the user rather than the
      write.
      Clicking away while the queue waited left the changed zone serving its
      old records on the next visit, spent a request re-reading a zone nothing had
      happened to, and left the history entry to be absorbed by the next change made
      there. Every mutation names the zone it wrote to, and that is the zone
      invalidated and read back.
    • Two bulk deletes running at once shared one set of counters, so the zone
      that was emptied got no history entry, the zone that was not touched got
      several, and the counts did not match the batch. Each batch owns its own state
      now, and a second is refused while one is running, said out loud in a
      notification and in the Log Console.
    • A multi-row Delete went past the API queue and its rate limiter entirely
      when it was started with the Delete key, and the toolbar button's guard
      re-enabled itself on the next change of selection. Both ways in run one
      implementation behind one guard now.
    • Saving a token could write its name and permissions onto another token's row,
      after which deleting that row deleted the wrong token.
      An API token cannot be
      recovered once deleted. The answer is matched to the row carrying the id it
      was saved for and does nothing when no row carries it, and a token's policy
      panel now carries the token it was opened for.
    • A refused policy list was displayed as a token having no policies, which in
      deSEC means unrestricted, the opposite of the truth for anyone deciding
      whether that token is safe to use. A refusal is reported as a refusal now.
    • A token whose default policy could not be created was still reported as
      created
      , which leaves an unrestricted token with write access to every zone.
      That failure is reported now, stays on screen until it is dismissed, and says
      what state the token is in and what to do about it.
    • Leaving Search and Replace mid-search froze the window for two seconds and
      then carried on searching
      , with its callbacks still live, so one landing
      afterwards started a fresh search on a page nobody was looking at. Import and
      export instead terminated their thread, which for an import can be between two
      writes; all three cancel between items now and report what was actually
      written, and a cancelled merge import is no longer reported as nothing
      written.
    • Text on the Queue page was unreadable on the light theme. It used one set
      of colours for both themes where every other module pairs them, and it reuses
      the record editor's pairs now, each checked against the contrast floor that
      applies where it is drawn. Links stay blue rather than taking the new red
      accent, and one pair serves the About page and both drawers.
    • Toasts in the profile window cut their own message in half. Two wrapping
      mechanisms were fighting and nothing recomputed the height, so only a one-line
      message was ever safe. A bar sizes itself to its text first now, caps its
      width only when that does not fit, and breaks a long unbroken profile name
      across lines instead of pushing out past both edges of the window.
    • The raw body of a failed API response was printed in the log, where a JSON
      error object reads as line noise to someone looking for what went wrong. The
      line names the subsystem, what was attempted and the cause, a 404 names the
      URL that was not found, and the body moved to a debug line.
    • A zone created or delegated by a wizard waited up to ten minutes to be
      checked.
      All three wizard modes ask for the check that the plain Add Zone
      path has always asked for now, and a new zone is registered rather than merely
      enqueued, so its verdict is not discarded for being about a zone the checker
      has not heard of.
    • Nine pixels of misalignment on five pages, wherever a help button faced a
      bare caption: Tokens, Queue, History, Search and Replace, and Import and
      Export

    Technical Improvements in 2.0.0-rc2

    • Every record mutation read its zone back twice, one wasted request on every
      save, edit and delete, against a daily rate limit this application does reach.
      The signal carries its zone now, and carrying it is the promise that the
      emitter has already invalidated that zone and read it back.
    • A restore read the account on the GUI thread, and around the rate limiter
      every other call goes through. It is queued now, with the write built and
      enqueued from the read's callback, so the read still precedes the write.
    • The record selection is cleared deliberately when the zone changes, rather
      than as a side effect of the table being rebuilt, which is what Delete
      Selected had been resting on. Removed alongside it: two guards reading
      attributes that are assigned nowhere in this application, and the two methods
      under them.
    • The guard that keeps raw response bodies out of the log could not see most of
      them
      , including every queue callback in this application, which takes its
      payload as a parameter. It catches all nine variants now.
    • Geometry assertions no longer assert which fonts are installed. The ten
      text-derived comparisons allow two pixels, which is useless to a real defect
      and sufficient for a font; pixmap arithmetic is left exact.
    • 1394 tests across 46 files, up from 976 across 35
    Downloads