Checked against 0.67.0 (2026-10-04). Open items on block design are in docs/markdown-blocks.md.
A living backlog of candidate next features for Blocksatz, analyzed 2026-09-04 against the app's actual current state (not a re-statement of old plans - every item below was checked against the code before being listed as open). Not a commitment or a schedule, just a prioritized list to pick from in a future session. See CHANGELOG.md for what's already shipped.
Bilingual DE → EN workflow tested in an Ubuntu 26.04 VM against the test
blog. Full report (German, local only, not in git):
qa/2026-10-15/QA-BERICHT.md. The six P1/P2 items checked below are fixed
in [Unreleased] and re-tested in the VM (R-01 to R-17), including the
media library follow-up and AI undo in the image dialog. Still open: the
P3 list below, and the autosave preview of a published post with local
changes, which reports a missing login instead of leading to it - fixed
2026-10-16 (login with return to the preview; the step after signing in
is untested, it needs the password).
- Status from the server response - after every upload take
status,date,modified_gmtfrom the REST reply instead of the requested target (export.rs:279/312); warn when they differ. Today the header showed "Veröffentlicht" for a post WordPress kept scheduled, and "Geplant" for drafts and published posts. (P1) - Dates on publish-now / revert-draft / reschedule - "Jetzt
veröffentlichen" sends
publishwithoutdate, so a post that was once scheduled staysfuture; "Auf Entwurf zurücksetzen" keeps the date; "Termin ändern" + "Änderungen hochladen" never sends the new date. The status dropdown in the Beitrag tab changes only the local file (PublishOrKeep). (P1) - One source for image alt/caption -
media::reconcilefollows caption edits from the Markdown but never alt edits; translations inherit the original'smedia_json, so the EN post was published with a Germanaltand a German<figcaption>while the editor showed English. (P1) - Language-aware AI prompts - alt text, caption, tags, in-place
edits, evaluation and writer prompts are hard-coded German and get no
document language (
aialt.rs:64-91); add oneai_language(doc)helper. Reproduced: EN featured image → German alt text. Caption also invents narrative. (P1) - Alt-text dialog placeholder - "Übernehmen" applies "Noch kein Text
generiert …" as alt text (
aialt.rs:157,223); enable only after a result. AI buttons in the image dialog overwrite without preview. (P2) - Featured image alt text - never sent (
upload_image_filehas no metadata step); path is cleared after upload, so the field and the AI button go dead. Decide how EN gets its own alt for the shared image (lui-translations). (P1) - Via & Quelle fields -
lui_via_label/url,lui_source_label/urlare registered withshow_in_reston both blogs; add them, and keep unknown frontmatter keys instead of dropping them (document.rs:430). (P2) - RankMath group only when Rank Math is active - it is inactive on test and live; the fields are silently discarded while the upload reports success. The theme uses the excerpt as meta description. (P2)
- Category mapping DE → EN as a setting - categories are copied 1:1, the EN blog silently got a new "Spaß" category; ask before creating terms. (P2)
- "Per KI aktualisieren" keeps EN-only edits - replaced sections drop sentences added only in English, without a warning. (P2)
- Preview - draft preview is a 404 when the built-in browser isn't logged in (no hint); "Im Blog" keeps the other language after Alt+1/2. (P2)
- Credentials dialog - "Prüfen" doesn't save, "Speichern" is far away and also switches the active blog; AI key is dropped without Enter; "Blogs verwalten …" opens "Erscheinungsbild". (P2)
- Smaller items (P3): slug transliteration ö→o (WP de_DE: oe), URL-length
check assumes
/category/on DE, technical network-error toast, no confirmation when quitting during upload, right pane clipped below ~900 px, GTK context menu in English, release check doesn't mention the other language, EN featured image from a local path is uploaded as a duplicate.
Report (German, local only): qa/2026-10-15/audit2/QA-BERICHT-IMPORT.md.
Updating existing posts is safe (ID, slug, date, metadata kept); open:
- Existing EN version is not found (P1) - translating an imported
original creates a second EN post with the same
lui_source_id;create_versiononly checks for a localartikel.en.md. Look up the target blog first and link/import the existing version. - Scheduling a published post takes it offline without asking (P1) - the only way to change a published post's date is status "Geplant"; a future date unpublishes it (404). Confirm with the consequence, better a separate publish-date field.
- Media library texts overwritten by post-specific ones (P1,
regression in 0.72.0) -
media::sync_metadataalso touches images an imported post only references (importer::keep_media_ids); limit it to uploads Blocksatz made itself. - EN posts imported as German originals (P2) - importer sets no
langand ignoreslui_source_*. - AI translation drops Via & Quelle (P2) - only the template path copies them.
- Blog list shows nothing when offline (P2), no error or retry.
- Deleted EN post not noticed while DE is active (P2) -
blogsyncchecks the active blog only. - Publish date not kept or shown (P2, gap) - no "re-publish now" for published posts; the original date is lost after C3.
- Smaller (P3): backdating only via "Geplant" with a misleading toast, internal links stay on the DE URL in EN, „…“ becomes "…", language check needs 8 marker words, featured image alt text not read on import.
- Found while fixing the P2s (P3): the blog list's "in the library" mark compares post ids only; older working copies show no publish date; the list's error says "Beiträge" on the pages list too.
- A folder made for a translation keeps its English name when the original joins it (renaming would move an open file).
- Blog search finds „Ü“ only as „Ü“, not as „Ue“ (WordPress search; optional).
- A separate publish-date field instead of backdating via "Geplant".
The short list from the 0.65.0 review (2026-10-02), roughly by value. All of 0.65.0's features were tested live against linuxundich.de - import warning (all three answers), banner, autosave preview, image sizes, connection check.
-
New article dialog (0.68.0) - title, slug, text from a
.md/.txtwith its header mapped into the frontmatter, images copied in by picker or drag & drop; folder named after the slug. Seedocs/new-article-dialog.md, mockups indocs/mockups/. -
Block design gapsDone (0.66.0) - quote with citation, Media & Text, padding/border/radius/shadow, captions on audio/video/embeds/galleries, linked images; after 0.66.0 also custom colors, typography, link color, list numbering, image aspect ratio and button settings, preformatted/verse and captions with links. Math, file, spacer and icon blocks followed on 2026-10-16. Still raw on purpose: a table whose header is aligned differently from its cells (GFM aligns whole columns, as does the block editor - such a table only comes from hand-written HTML and stays verbatim without loss). -
Cover image from a local fileDone - also Media & Text. -
Write footnotes in MarkdownDone (0.66.0) -[^1]both ways, Einfügen → Fußnote. -
Translations for a second blogDone (0.67.0) - seedocs/translations.md. The library sidebar shows each language's state ("DE Veröffentlicht · EN Entwurf"), which covers the badge. Live test with a real model done 2026-10-16 in the VM (Claude Sonnet 5.5): Via & Quelle taken over, typographic quotes, no review findings. -
Flathub (deferred, 2026-10-02 - not now): sandbox narrowed to the documents folder, runtime GNOME 51, submission files generated by
build-aux/flathub/prepare.sh(see 0.66.0). The Flathub manifest builds offline on GNOME 51 and passesflatpak-builder-lint manifest;lint repostill wants screenshots in the metainfo (<screenshots>with image URLs, e.g. raw GitHub files underdata/screenshots/) - added 2026-10-16. Left: a release tag, the PR at flathub/flathub (needs the GitHub account and a decision on the timing), then the domain verification (docs/flathub-verification.md). On hold (2026-10-16): Flathub's requirements forbid AI-assisted manifests and AI-opened/-written submission PRs, ask for disclosure of AI-generated code and for a longer development history - seebuild-aux/flathub/SUBMISSION.md. Not submitted. -
Terminal font: a new editor font reaches an open terminal right away (2026-10-07).
-
Comparison dialog in the color scheme: checked live in light and dark (2026-10-07).
-
Flathub and the terminal:
--talk-name=org.freedesktop.Flatpak(host shell viaflatpak-spawn) is a sandbox escape Flathub asks to justify - state it in the submission like GNOME Builder does, or ship the terminal disabled there. Justification written inbuild-aux/flathub/SUBMISSION.md(2026-10-16).
-
Write the attachment id into exportedDone (0.65.0, see CHANGELOG.md) - uploaded images go out like the block editor's: the "large" size's URL and dimensions,wp:imageblocks."id","sizeSlug",wp-image-<id>,size-large, so WordPress addssrcset; images of a post opened from the blog keep their ids on re-upload. -
Paste an image from the clipboard.Done (see CHANGELOG.md) -Ctrl+Vnow saves a clipboard image into the article folder and inserts it, falling back to normal text paste when there's no image. -
Drag a local image file into the editor.Done (see CHANGELOG.md) - aGtk.DropTargeton the editor view accepts one or more dropped files, same insertion logic as "Bild einfügen"/clipboard paste. -
Reopen the last article on launch.Done (see CHANGELOG.md) - a plain launch (no file argument) now reopens the most recently opened/ saved article viarecentfiles::load(), instead of always starting at a blank "Unbenannt" document;Ctrl+Nstill gets to a blank one in one step. -
Find & replace in the editor.Done (see CHANGELOG.md) - a Ctrl+F bar at the bottom of the editor, backed by GtkSourceView's own SearchContext/SearchSettings. -
Done (see CHANGELOG.md) - "Tastenkürzel" in the primary menu, also reachable via Ctrl+?.Gtk.ShortcutsWindow. -
"Weiterlesen" / more-tag support.Done (see CHANGELOG.md) - a lone<!--more-->line now exports aswp:more, with a toolbar button to insert it. -
Manage existing categories/tags (rename/delete) from inside the app.Done (see CHANGELOG.md) - a "Kategorien & Tags verwalten" dialog, reachable from Artikel-Eigenschaften, lists every term with a real WP term id and lets you rename or delete it.
Local autosave / crash-recovery.Done (see CHANGELOG.md) - a debounced background snapshot now survives a crash or a forgotten save, with a restore-or-discard prompt on next launch. Superseded by the library with continuous saving (docs/gui-redesign.md, phase 1).Scheduled publishing.Done (see CHANGELOG.md) - aFuturestatus, a publish date/time field in Artikel-Eigenschaften, and a "Terminieren" button in the export dialog (refusing to export with no valid date, rather than let WordPress silently publish immediately).oEmbed / embed block support.Done (see CHANGELOG.md) - a bare URL alone on its own line exports as a realwp:embedblock.Multiple WordPress site profiles.Done (0.65.0, see CHANGELOG.md) - a list of blogs in Einstellungen → WordPress and a switcher in the sidebar footer; working copies remember their blog.Video/audio media support.Done (see CHANGELOG.md) - local video/audio files are inserted the same way as images and export as realwp:video/wp:audioblocks.Image compression/format conversion before upload.Done (see CHANGELOG.md) - an oversized PNG/JPEG is downscaled and re-encoded (opaque PNGs converting to JPEG) before upload, viagdk-pixbuf.
- The
.bsmproject-file container - a self-contained ZIP-based format (manifest + article + content + bundled media), with its own New/Open/Save/Save-As and a version-migration framework. Already explicitly deferred once before (per the original media-management spec) in favor of the simpler.md-plus-frontmatter approach this app still uses today - still valid, still a genuinely large undertaking, don't start without an explicit go-ahead. Internationalization (i18n) - infrastructure done, most strings still German.Done (see CHANGELOG.md) - essentially the whole UI is now wrapped ini18n::tr("..."), with a complete, real English translation (po/en.po, ~270 strings) proving it end to end. AI prompt content and proper nouns deliberately stay German/untranslated by design - seepo/README.md. The Flatpak build installs and finds its compiled translations too (BLOCKSATZ_LOCALEDIR).A CI pipeline.Done (see CHANGELOG.md) -.github/workflows/ci.ymlrunscargo build/test/clippyon every push/PR, in anarchlinux:latestcontainer (not Ubuntu's default runner image - its packages lag behind the fairly recent GNOME stack this app links against) so dependency versions never need separate upkeep.Distraction-free / focus writing mode.Done (see CHANGELOG.md) - Ctrl+Shift+F hides the header bar, toolbar, and right-hand pane down to just the editor text.
- Multi-window support - this app is built around one document, one site connection, and a lot of shared app-level state (chat history, cached terms, keyring-backed credentials); multi-window would touch nearly everything for a use case ("edit two articles side by side") the recent-files list and quick save/reopen already cover reasonably well.
- A plugin/extension system - over-engineering for a personal-scale tool with one active user; revisit only if that changes.
The list above is essentially cleared out, so this is a fresh pass -
grounded in actual gaps found by reading crates/gutenberg/src/lib.rs,
src/wpclient.rs, src/document.rs, and src/stats.rs, not
speculation.
Post excerpt / meta description field.Done (see CHANGELOG.md) - a new "Auszug / Meta-Beschreibung" field in Artikel-Eigenschaften sends WordPress's ownexcerptfield on export and reads it back when opening an existing post.Readability hint in the Statistik tab.Done (see CHANGELOG.md) - a German-adapted Flesch reading-ease score (Amstad's formula) plus a qualitative label, computed from average sentence length and average syllables per word.
Broken-link checker.Done (see CHANGELOG.md) - a "Links" tab in the export dialog scans every unique URL in the article (Markdown links/images plus bare-URLwp:embedlines) and HEADs each one on-demand, flagging anything outside 2xx/3xx or timing out.Gutenberg block coverage: Columns, Buttons, Gallery.Done (see CHANGELOG.md) - fenced code blocks with a special "language" tag (```columns,```buttons,```gallery) since Markdown has no native syntax for these; full round-trip both ways, and local images inside a columns/gallery block now participate in Medienverwaltung's alt-text/upload tracking like any other image.Edit WordPress Pages, not just Posts.Done (see CHANGELOG.md) -document::PostTypein the frontmatter, a "Typ" row in Artikel-Eigenschaften, and every post-level REST call parameterized by itsrest_base(posts/pages).
Revision-conflict awareness.Done (see CHANGELOG.md) - aFrontmatter.wp_content_hashbaseline (set on import and after every successful publish/update) is compared against a fresh fetch's hash right before the next update; a mismatch means the post changed on the server since, and a confirmation dialog asks before overwriting it rather than silently clobbering it.Paste rich text as Markdown.Done (see CHANGELOG.md) - Ctrl+V now also checks for atext/htmlclipboard entry (image still takes priority) and converts it to Markdown viahtmd, a real HTML5 parser (same engine as Firefox) rather than a hand-rolled one, since arbitrary pasted HTML (Google Docs, Word, a webpage) is far too varied for the hand-rolled approachcrates/gutenberg's own well-defined Gutenberg- comment scanner gets away with.SEO plugin field support (RankMath).Done (see CHANGELOG.md) - a "RankMath SEO" group in Artikel-Eigenschaften (SEO-Titel, SEO-Beschreibung, Fokus-Keyword) sends RankMath's own post meta keys on export and reads them back on import. Scoped to RankMath specifically, per the user's request - Yoast's equivalent fields use different meta key names and would need their own, separate mapping if ever wanted.
Why: same reason as the original 2026-09-04 analysis - a periodic fresh look grounded in the actual code, not a re-statement of ideas already shipped or already rejected.
The lists above are about the editor/WordPress side. This pass asked a
different question: which platform integrations is Blocksatz missing
that a GNOME/Flatpak-native app is expected to have? Checked against
data/de.linuxundich.Blocksatz.desktop,
build-aux/flatpak/de.linuxundich.Blocksatz.json, and src/i18n.rs
- not speculation.
Done (see CHANGELOG.md) -.desktopfile has noMimeType=.MimeType=text/markdown;plusGio::ApplicationFlags::HANDLES_OPENand aGio::Application::connect_openhandler, so double-clicking a.mdfile (or "Open With" → Blocksatz) in Nautilus works, loading into the already-running window rather than spawning a second one.Opened articles never reachDone (see CHANGELOG.md) - opening or saving a file now also registers it withGio::RecentManager.Gtk.RecentManager(GTK4 kept the type in thegtknamespace, notgio), alongsiderecentfiles.rs's own private list.No desktop notification for a background action finishing.Done (see CHANGELOG.md) - a newnotify.rssends aGio::Notificationwhen publishing, an image upload, or a link check finishes while the app has no focused window, gated so it doesn't double-announce something already visible in an open dialog.
Flatpak sandbox is wider than the app needs.Done - onlyxdg-documents; files from elsewhere come through the portals and are copied into the article folder.A GNOME Shell search provider.Done (see CHANGELOG.md). Implementing theorg.gnome.Shell.SearchProvider2D-Bus interface over the same datarecentfiles.rsalready tracks would let a partial article title typed into the Activities Overview jump straight to opening that file in Blocksatz - a small D-Bus service on top of existing state, not a new subsystem, and the kind of integration that makes a GNOME app feel like it belongs on the desktop rather than being "a Linux port."ADone (see CHANGELOG.md, 0.67.0) - "Blocksatz-Artikel.md" written once into the XDG templates folder; the desktop entry passes files (~/Templatesentry for Nautilus's "New Document."%F).
Adaptive/narrow-width layout via libadwaita breakpoints.Done (see CHANGELOG.md) - anAdw.Breakpointat ~700sp switches the editor+preview split from a side-by-sideGtk.Panedto a single pane at a time (anAdw.InlineViewSwitcher, matching the sidebar's own tab switcher) viaAdw.MultiLayoutView/Adw.LayoutSlot, and reverts automatically above that width. Getting this to actually fire on resize (rather than being permanently blocked by the wide layout's own minimum size) also required making theGtk.Panedand bothAdw.ViewStacks properly shrinkable/non-homogeneous, and wrapping the formatting toolbar in a horizontally-scrolling container so nothing becomes unreachable at narrow widths.
Why: the earlier 2026-09-04/2026-09-06 passes were both scoped to the editor/WordPress domain; this pass asked specifically what's missing on the "feels native on GNOME/Linux" axis instead, per the user's request.
Grounded in actual gaps found by reading document.rs, wpclient.rs,
mediapanel.rs, media.rs, and crates/gutenberg/src/lib.rs - not
speculation. The accessibility-focused work done this cycle (real
per-image alt text/captions reaching the published post, hover tooltips,
context-sensitive menus) surfaced a couple of these directly.
The featured image never gets an alt text on WordPress.Done (see CHANGELOG.md) - a new "Alt-Text für Aufmacherbild" field in Artikel-Eigenschaften, sent as the resulting attachment'salt_texton upload, the same way a body image's already was.No warning for an unusually long alt text.Done (see CHANGELOG.md) - a non-blocking warning icon/tooltip once an entry (body image, featured image, or the quick-edit dialog) passes WCAG's ~150 character guidance, matching the Statistik tab's own readability-tips pattern.No WordPressDone (see CHANGELOG.md) - aprivatepost status.Privatevariant, aComboRowentry, and a "Privat veröffentlichen" button in the export dialog, the same shape asFuture/"Terminieren".
Categories are flat - no parent/child hierarchy.Done (see CHANGELOG.md) - "Kategorien & Tags verwalten" has an "Übergeordnete Kategorie" picker and creates sub-categories (taxonomy.rs).No way to set the post author.Done (see CHANGELOG.md) - a new "Autor" dropdown in Artikel-Eigenschaften, populated from the site's real WordPress users, defaulting to "Nicht ändern" so an unset author never overrides whatever the post already has; round-trips through import/export.No way to reuse an image already in the WordPress media library.Done (see CHANGELOG.md) - a "Aus Mediathek wählen…" picker (wpclient::list_media,medialibrary.rs), reachable from the editor toolbar and the Aufmacherbild row in Medienverwaltung, lets an already-uploaded image be referenced directly instead of re-uploaded as a duplicate attachment.No control over comment status.Done (see CHANGELOG.md) - a "Kommentare" row in the "Beitrag" view (comment_status, "Nicht ändern" by default).No VG Wort length check / counting-pixel toggle.Done (see CHANGELOG.md) - researched against the real "Worthy" WordPress plugin's published source (wordpress.org/plugins/wp-worthy/) rather than guessed thresholds: a "VG-Wort-Länge" hint in the Statistik tab against Worthy's actual minimum (1800 characters) and early-warning (1600) thresholds, and a "VG-Wort-Zählmarke" toggle in Artikel-Eigenschaften to explicitly exclude an article, sent on every export as Worthy's ownwp-worthy-pixel.ignoredREST field (harmless on a site without that plugin) and read back on import.
More Gutenberg blocks via the existing fenced-block pattern.Done (see CHANGELOG.md) -```pullquoteand```detailsjoincolumns/buttons/gallery, same+++-split fenced-block mechanism, full round-trip both ways.A real preview link for an unpublished draft.Done (see CHANGELOG.md) - a "Vorschau öffnen" button in the export dialog opens WordPress's?preview=truelink in the app's own Browser tab. As suspected going in, it only actually shows the live preview if that tab's WebKit session already happens to be logged into wp-admin - there's no separate authenticated path, so an un-logged-in Browser tab just shows a login page instead, which the button's tooltip and a status message both call out up front rather than papering over it.
Why: same reason as the earlier passes - a periodic fresh look grounded in the actual code, this time prompted directly by the accessibility gaps the alt-text/caption work this cycle kept surfacing.
Quill is a native macOS WordPress editor with a very similar goal (write and publish to a self-hosted site via the REST API and an Application Password, no plugin needed). Comparing its feature set against Blocksatz's surfaced these gaps:
Pages, not just posts.Done (see above).Trash a post/page from inside the app.Done - "In den Papierkorb" in "Von WordPress öffnen".A real media library manager(not just an image picker). Done - "WordPress-Mediathek".AI: write a whole post from a prompt, in the author's own voice.Done - "KI-Artikel schreiben", with the most recent published posts as style samples.
Still open from that comparison, roughly by value:
FootnotesDone - opened posts keep theirs (0.65.0), and[^1]works both ways (0.66.0).Accordion / tabs blocksDone (0.65.0) -:::: accordion/::: item,:::: tabs/::: tabcontainers (docs/markdown-blocks.md).An update check on launchDone (see CHANGELOG.md) - once a day, not in the Flathub build.Inline image resizingDone (see CHANGELOG.md) - a drag handle in the preview writes{width=…px}.