Skip to content

Releases: austinginder/minn-admin

v0.8.0

Choose a tag to compare

@austinginder austinginder released this 06 Jul 15:14

The delight release. Horizon 2 of the editor roadmap lands: revision diffs, an outline panel, focus mode, and an internal link picker, plus two new view modes and a real keyboard-shortcut story. Around the editor, the whole app picked up a shared context-menu language (content rows, media, comments, tables), Minn grew its own image editor, and the System page now surfaces the silent-rot trio every developer checks first.

Added

  • Revision diffs: the History card opens a side-by-side diff of a revision against your current content (unsaved edits included) with word-level change marks, instead of a raw preview. Unrelated paragraphs render as a removal plus an addition, not one fully-marked change; identical revisions say so; Restore is unchanged.
  • Outline panel: headings as a clickable table of contents in the editor sidebar. It updates live while you type, indents by depth, sticks in view on long posts, and clicking a heading scrolls to it with a highlight that rides the scroll.
  • Focus mode (⌘⇧D): fades everything but the paragraph you are writing, with typewriter scroll and the nav and sidebar tucked away. Persists per browser; never touches saved markup.
  • Outline mode (⌘⇧O): just the writing and the outline. Hides the nav and every sidebar card except the Outline. The two view modes are mutually exclusive and live in the ⌘K palette.
  • Internal link picker: type a post title into the link popover (⌘K with text selected) and pick from your own content; URLs still paste straight through.
  • Image editor: rotate and crop right in the media preview, saved as a new copy through core's own image-editing endpoint. All pixel work happens server-side; originals are never touched.
  • Context menus everywhere: right-click a content row for quick status changes, view/preview, a block-editor escape, and trash; a media item for preview, copy URL, edit image, and delete; a comment for its moderation verbs; a table cell for targeted row and column operations.
  • Keyboard shortcuts: ⌘. shows or hides the navigation, ⌘⏎ publishes or updates, ⌘S saves, and the help dialog now documents the whole set.
  • Audit-log adapters: WP Activity Log, Activity Log (Aryo), and Stream join Simple History, so all four major audit plugins read natively in Minn.
  • System page additions: an autoloaded-options breakdown with the top offenders and a health check, cron health (overdue events flagged), expired-transient bloat, and a clickable version badge that opens the full changelog.
  • Themed date-time picker: scheduling gets a Minn-styled calendar with a lenient time field and an explicit Done, replacing the unstyleable native control.
  • Menu drag handles: drag to reorder menu items; children travel with their parent. The indent buttons stay for nesting.
  • Extensions cards: real wp.org plugin icons (linked to the plugin's directory page) and author lines linked to the author's site.

Improved

  • Content lists sort by publish date, so scheduled posts lead with the dates they go out. Rows grow a hover actions button; the big Overview stat cards navigate to their views; sites without comments show a Users count instead of an eternal zero.
  • Sidebar cards collapse from their titles and remember your layout; the role pickers in Users and the profile are searchable comboboxes; the WordPress and PHP marks on the System page are the real brand icons.
  • Deactivating Minn from Extensions asks properly and lands you on a readable notice before the classic dashboard, instead of a native confirm and an instant redirect.
  • Every block-config popover (island, table, image, code) now opens beside the block instead of on top of the content it configures, and the code block's settings chip is persistent like table and image chips.

Fixed

  • The block inspector can now edit the text of core paragraph and heading children inside wrapper blocks (the report-card case), and no longer injects empty attributes into children it merely displayed.
  • Applying a link deep in a long post no longer scrolls to the top; the same fix covers image drops, slash commands, and focus-mode toggles.
  • Toggling a plugin no longer scrolls the Extensions list to the top (the tab bar's reveal was yanking every scroll ancestor).
  • A code block as the last block no longer traps the caret; a click-to-continue paragraph always follows terminal blocks, tables, and embeds.
  • The activity feed decodes entities, labels untitled drafts, and no longer hides never-edited drafts; the version badge shows the full version.

v0.7.1

Choose a tag to compare

@austinginder austinginder released this 06 Jul 01:41

Fixed

  • System page 500 on managed hosts: the System endpoint called disk_free_space() / disk_total_space() unguarded — hosts like Kinsta remove them from the web PHP via disable_functions, which turns the call into a fatal error (@ doesn't save you, and the CLI on the same box reports nothing disabled). Both are now function_exists()-guarded, as is php_uname() a few lines below — the next fatal waiting on hardened hosts. Disk usage degrades to "Unknown" where the host hides it.

v0.7.0

Choose a tag to compare

@austinginder austinginder released this 06 Jul 01:23

Beyond writing. Two big moves this cycle: coexist with page builders instead of pretending they don't exist, and give developers a real System page. Plus the trust work that closes Horizon 1 of the editor roadmap — a writer never loses work.

Added

  • Page-builder coexistence: Minn detects pages built with Divi, Elementor, Brizy, Beaver Builder, Etch, Bricks or WPBakery and gets out of their way. A builder chip marks them in the content list; opening one shows a read-only preview with an Edit in ⟨builder⟩ button to the builder's own chrome-free surface (no wp-admin screen), while title, status, URL, SEO and the sidebar still save from Minn. Builders that keep their content in postmeta (Elementor, Beaver, Brizy, Bricks) or shortcodes (WPBakery, legacy Divi) fence the editor so a stray Minn edit can't silently break their canvas; block-native builders (Etch, Divi 5) stay editable through islands. Third parties register via the minn_admin_page_builders filter.
  • New page in a builder: The + New menu lists every active builder — pick one and Minn creates a prepared draft and hands the tab straight to the builder's editor.
  • Paste cleanup: Pasting from Word, Google Docs or any web page is sanitized to Minn's safe block subset — Word's mso-list paragraphs rebuild into real nested lists, Docs style-spans map to bold/italic/strike/code, javascript: hrefs and vendor styling never pass, and a single ⌘Z reverts a whole paste. Multi-line plain text becomes real paragraphs; a lone URL still becomes an embed. Classic mode is sanitized too.
  • Inline media flow: Paste a screenshot or drag an image file into the editor and it uploads to the media library at the caret — an instant preview, then an undo-safe swap to a real attachment (a true Gutenberg image block). The serializers skip in-flight uploads so an autosave can never store a blob: URL. Every editable image now carries a typable caption ("Write a caption…").
  • Conflict safety: Post locking rides WordPress's own _edit_lock, so Minn, the classic editor and Gutenberg all honor each other. Opening a post someone else is editing shows a takeover dialog; being taken over drops you to read-only with a "take back" banner. A localStorage crash net snapshots every edit within ~1.2s — even before the first autosave — and offers recovery on the next open, so a crashed browser loses nothing.
  • Undo for structural deletions: Deleting an embed, gallery, table row/column or whole table shows a "Removed — Undo" toast. (These are direct-DOM operations outside the browser's undo stack, so ⌘Z can't reach them — see the undo-completeness investigation.) Restoring re-inserts the block and its saved markup intact.
  • Editor sidebar — the publish essentials: Editable permalink/slug, per-post Discussion (allow comments / pingbacks), full Visibility (Public / Password protected / Private) and Sticky for posts — everything writers used to open wp-admin for. All through WordPress's native REST fields, with the sticky/password mutual exclusion and "private is a status, not a field" edge cases handled so an autosave never accidentally publishes a draft.
  • System page: A developer diagnostics surface under Manage — a health strip (PHP version, HTTPS, persistent object cache, memory, OPcache, debug-in-production, uploads writable) over cards for WordPress, PHP, the database (with a largest-tables breakdown) and the server, plus one-click Copy report as markdown. Deliberately not WordPress-y — dense with the facts a developer actually wants.
  • Debug tools: On the System page, live toggle switches for WP_DEBUG, WP_DEBUG_LOG, WP_DEBUG_DISPLAY, SCRIPT_DEBUG and SAVEQUERIES that safely rewrite wp-config.php — whitelist-only, syntax-validated before writing, backed up, and shown only when wp-config is writable and file mods aren't disabled (constants defined elsewhere are read-only). The debug.log path is clickable and opens a large overlay showing the tail with Refresh / Copy / Clear.
  • Installed extensions manifest: The System page lists every plugin (active first, inactive dimmed), must-use plugin and theme with versions — folded into the Copy report too.
  • Extensions filters & search: The Extensions view gains All / Active / Inactive / Updates status filters and a search box.
  • Test coverage: New repo-citizen Playwright suites for paste cleanup, conflict safety, the crash net, inline media, the editor sidebar, the System page and structural-deletion undo — each verifying saved content, not just the DOM.

Improved

  • One consistent grammar for list-view toolbars: filters and search on the left, a single primary action on the right, and the item/page count moved down to the pager where it belongs. Trash became a slice tab rather than an action button.
  • The page-builder chip moved to the slug line so its placement is consistent regardless of the builder's name length, leaving the Status column a clean column of pills.
  • Content-list and + New row markers are proper SVG icons now (the page glyph read as broken).

Fixed

  • The Extensions on/off switch reflects the real plugin state immediately. Concurrent loadPlugins() fetches could replace the cache after a render had bound the toggle handlers to the older array, so the switch appeared frozen even though the plugin had toggled server-side.
  • A late editor re-render could revert unsaved edits before a save (surfaced under server load) — the editor now adopts the live DOM whenever there are unsaved changes.
  • Etch's edit URL renders its app at the site root (?etch=magic&post_id=N); a permalink-based URL yielded a silent blank page.
  • Toasts animate straight up from the bottom instead of flashing in sideways — the keyframe was dropping the horizontal-centering transform mid-animation.
  • A first-block island's ⚙ chip is no longer clipped at the top of the editor (overflow-x: hidden was forcing vertical clipping to auto).

v0.6.0

Choose a tag to compare

@austinginder austinginder released this 05 Jul 13:14

v0.6.0 - July 5, 2026

The editor release. Everything here is aimed at one goal: writing in Minn beats writing in the block editor — see the new editor roadmap.

Added

  • Markdown typing conventions: the full set — `code`, **bold**, *italic*, __bold__/_italic_ (word-boundary, so snake_case survives), ~~strike~~, [text](url); block prefixes on space — #######, -/*/+, 1., > — plus ``` → code block and --- → divider. Wraps go through the undo stack so ⌘Z restores the literal text, with guards so spaced math stars and `array0` prose never convert.
  • Inline code: a </> toolbar toggle and the backtick markdown rule, plus a boundary escape — typing at a code chip's edge lands outside the chip (contenteditable offers no such caret position; Chrome would extend the code forever).
  • Link popover + ⌘K: click any link to edit its URL, open it, or unlink. The toolbar button and ⌘K-with-a-selection create links; ⌘K still opens the command palette everywhere else.
  • Table controls: every editable table carries a persistent ⚙ chip opening a popover — add row above/below, add column left/right, delete either (all relative to the caret cell), make the first row a header (content-preserving both directions), delete table. Tables wear the same dashed cutout as block islands, with editor-side gridlines and a shaded header row.
  • Image controls: images get the island-style cutout and their own persistent ⚙ chip into the existing alt/caption/replace popover. Removing an image is dialog-free and ⌘Z restores it.
  • Status-aware autosave: 15s-idle / 60s-max instead of every keystroke. Drafts save in place; published, scheduled and private posts are never written by autosave — edits back up to a WordPress autosave revision (like Gutenberg) and apply only on Update. Save draft button, ⌘S, an unsaved-changes indicator, flush-on-navigate and a browser unload warning.
  • Backup restore: opening a post with a newer autosave revision (a crash, an abandoned session) shows a banner offering Restore / Dismiss. REST saves now refresh the post's oEmbed caches — core only does that from the classic editor, so stale embed failures used to stick forever.
  • Text alignment: center/right toolbar toggles, and aligned paragraphs/headings now round-trip as editable content instead of becoming read-only islands. Ordered-list start/reversed/type round-trip too, and core/spacer height edits regenerate the block properly.
  • Front-end styles in previews: island previews load the site's real block and theme CSS — collected server-side, scoped client-side so the admin chrome and the typing surface keep Minn's own look. An anchor/stats-dashboard island now looks like the published page.
  • In-place embed & gallery editing: the inspector offers Change URL… / Replace images…, rebuilding the block through the same templates that create them. The misleading generic attribute fields are gone (editing url in the comment never touched the URL living in the saved HTML). Embed islands now render the real embed in the editor.
  • Word count · reading time: a fixed bottom-right pill, always visible while scrolling, recounted live (including when island previews finish rendering).
  • SEO editor panel: Yoast SEO or Rank Math — SEO title, meta description and focus keyword in the editor sidebar, via a dedicated minn_seo REST field (edit-context only, per-post capability checks). Completes the extension-api plan.
  • Gravity Forms, readable: the entry detail is now a document — answers under the form's real field labels in form order (choice labels resolved, composite names assembled, multiline preserved), then a Submission section (formatted date, clickable source, IP, user), and an open-in-GF link. A new Forms view lists forms with entry counts and status, offers activate/deactivate and edit-in-GF. Deliberately not a form builder.
  • x.com embeds: WordPress 7.0's trusted oEmbed providers cover twitter.com but not x.com, so tweets were stripped as untrusted — Minn registers the x.com provider until core catches up.
  • Browser test harness: self-contained Playwright suites in tests/ (markdown rules, autosave semantics) plus a CLAUDE.md agent guide. Suites create and delete their own fixtures over REST and gate on zero console errors.

Improved

  • SVG icons across the editor toolbar and slash menu (the app's lucide-style set), plus new strikethrough, bulleted/numbered list and clear-formatting buttons.
  • The editor toolbar is sticky, and block-type buttons toggle — pressing Quote or H2 again returns to a paragraph. (Repeat presses used to be silent no-ops that still pushed junk undo entries, which made ⌘Z look broken.)
  • The slash menu filters as you type — /co narrows to Code; a second / (a literal path) dismisses it.
  • Table and image chips highlight together with their cutouts on hover, track scrolling, and are always visible — no hover hunting.
  • Surface framework: collections can declare a second manage view, sectioned detail routes, conditional (when) and link (href) actions — all generic, first used by Gravity Forms.

Fixed

  • Backspace in the paragraph after an embed no longer destroys the embed (Chrome treats an adjacent island as one deletable atom — and merged the neighbors too). Empty blocks delete alone; deleting into an island arms it red and a deliberate second press removes it.
  • Images insert at the caret instead of the top of the document — clicking in the media picker destroyed the editor selection.
  • Alignment now previews inside the editor; the word count is no longer stale until the first keystroke.
  • Serialized content stays clean: no nbsp litter around inline elements, <strike> stored as <s>, lists never nest inside paragraphs, hover styles and image-delete husks never reach the database.
  • Gravity Forms surface now appears for administrators whose role has gform_full_access but not the granular caps (gated through GF's own capability resolver).

v0.5.0

Choose a tag to compare

@austinginder austinginder released this 04 Jul 23:06

Added

  • Taxonomies manager: The Post Types view gains a Taxonomies tab — every registered taxonomy with its attachments, term counts and owner, editable through the same storage adapters as post types (ACF acf-taxonomy definitions via ACF's own API, Custom Post Type UI's option, or Minn's own store). Create (hierarchical or flat, choose the backend), re-attach to any post types, or remove — terms always stay in the database, and ACF deletions trash recoverably. Core and code-registered taxonomies are read-only. The Post Types modal's taxonomy checkboxes are now dynamic — every assignable taxonomy, not just Categories/Tags.

  • Create redirects (and search them): The Redirects surface gains an Add redirect button — a form for source, target and HTTP status that writes through Redirection's own API — plus a filter box that searches by source URL server-side. Both come from two new generic surface capabilities (create and search), so any adapter can opt in.

  • Tidier surface tables: Columns take an explicit width and a num format (right-aligned, tabular); text cells truncate to one line with an ellipsis instead of wrapping long URLs to three rows, and empty/zero timestamps read "—" rather than "Invalid Date". Redirects now fit source, monospace target, code, hits and last-hit cleanly on one row.

  • More redirect plugins: Drop-in adapters for Safe Redirect Manager and Simple 301 Redirects — list, search, create and delete, each shimmed over the plugin's own storage (SRM's srm_* functions; the 301_redirects option) since neither exposes REST.

  • Image controls: Clicking an image in the editor opens a popover — alt text, caption (created, updated or removed, wrapping bare images in the standard figure), Replace via the media picker, and Remove. Replacing keeps the block honest: the {"id":…} attribute and wp-image-N class follow the new attachment, and stale srcset/sizes/dimensions are dropped.

  • Video & audio blocks: core/video and core/audio join the editable set via attribute passthrough — no longer islands.

  • Query Monitor support: With QM active, Minn's pages get the full Query Monitor experience — a floating summary chip (time · memory · query time · query count) that opens the real QM panel, covering the Minn document request. The integration is a bundled adapter plus minn_admin_template_footer, the one hook Minn's standalone document now fires (deliberately not wp_footer — no third-party injection). Capability checks stay QM's own: users without view_query_monitor get zero QM bytes.

  • Attribute passthrough for simple blocks: Images, tables, quotes, separators, verse and preformatted blocks that carry attributes ({"id":…,"sizeSlug":…} images, styled tables/quotes/separators) are now fully editable instead of islanded — the comment attributes are parked on the element and re-emitted byte-faithfully on save, with Gutenberg's comment-safe escaping. The class-derived hasFixedLayout respects explicitly-written false (newer Gutenberg defaults tables to fixed). Only non-text-flow blocks participate, so contenteditable splits can never duplicate attributes. Cosmetic note: void elements serialize as <img …> rather than <img …/> (HTML-equivalent).

  • Activity chart drill-down: The Overview's activity bars are clickable — a modal lists the events behind the bar (posts and pages published, comments received in that day or week), each row linking to the editor or the Comments view. The overview endpoint now stamps each chart bucket with its GMT bounds, and a new overview/activity endpoint returns the events for a window.

  • Trash: The Content view gains a Trash toggle — see trashed posts, pages and custom post types, restore them (a new posts/{id}/restore endpoint; core REST has no untrash) or delete them permanently, singly or in bulk. Authors see only their own trashed items, matching wp-admin.

  • Menus: A full navigation manager for classic themes (block themes keep the site editor, matching wp-admin) — every menu as a tab, items in their real hierarchy with reorder/indent/outdent controls, inline label and URL editing, add pages/posts via a searchable picker or custom links, theme-location assignment via combobox, and create/rename/delete menus. All through core's wp/v2/menus, menu-items and menu-locations REST — reordering renumbers the whole tree and writes only the items whose order or parent actually changed.

  • Widgets: Classic widget areas as cards — reorder within an area, move between areas, delete, and edit block, text and HTML widgets in place (other widget types keep their settings and can still be arranged). Adding drops in a block widget and opens the editor. Widgets are created and then assigned to their area in a second request — creating straight into a sidebar gets silently swept to inactive by the same request's retrieve_widgets() pass (core #53657 territory).

  • Page attributes in the editor: Pages (and hierarchical post types) get a Page attributes card — a parent picker showing the page tree with the post's own descendants excluded, a template combobox (a new templates endpoint exposes the theme's classic Template Name: templates, which core REST validates against but never lists), and a menu order field. Everything rides the normal autosave. The card appears only when the post type actually supports something: posts see nothing unless the theme registers post templates.

  • New menu: The + New button opens a Post / Page choice (page authors only — everyone else goes straight to a new post), and the ⌘K palette gains "Create new page". New pages get the full Page attributes card before first save, so parent and template can be set as you write.

  • Embeds: Paste a lone YouTube / Vimeo / TikTok / Spotify / X link (any of fifteen core oEmbed hosts) into an empty block and it becomes a core/embed island; the slash menu gains an Embed command that takes any URL. The markup is Gutenberg-byte-faithful (verified with a parse_blocks/serialize_blocks identity round-trip), so the block opens natively in the block editor. URLs inside sentences still paste as plain text, and classic-mode content keeps relying on WP's own autoembed.

  • Galleries: A Gallery slash command opens the media picker in multi-select — pick images in order (or upload straight into the selection) and insert a modern nested-image core/gallery as an island, rendered in place. Editing an existing gallery still hands off to the block editor; creating one no longer does.

  • Core WordPress updates: When a core update is on offer, Extensions leads with an update banner — one click runs the same Core_Upgrader path as wp-admin (maintenance mode, rollback protection), then triggers the database migration step over loopback. Update notifications now land on Extensions instead of bouncing to wp-admin. Gated on update_core.

  • Minn as the default admin: A new General setting — after signing in, users who can use Minn land at /minn-admin/ instead of the wp-admin dashboard. Explicit redirect_to deep links (a plugin page, a specific post) still go where they intended, users without edit_posts keep core behavior, and classic wp-admin stays fully reachable.

  • Comment replies: Answer comments without leaving Minn — a Reply box on every pending and approved comment, posting as you. Replying to a pending comment approves it, matching wp-admin.

  • Media search & filters: The library gains a search box and type tabs (Images / Video / Audio / Docs) — server-side via the media endpoint's own search and media_type params, so it scales past the 48-per-page window.

  • Excerpt: Posts (and CPTs with excerpt support) get an Excerpt field in the editor's Settings card, riding the normal autosave.

  • Your profile: The sidebar account area (and a new ⌘K entry) opens your own profile for any role — display name, email and password, with the role shown read-only when you can't change it. Non-admins finally get a way to update their password without wp-admin; the page reloads after a self password change since the session token (and REST nonce) rotates. A self display-name edit updates the sidebar immediately.

Improved

  • Real pagination: Every list view — Content, Media, Comments, Orders, Users and all adapter surfaces — replaces the append-only "Load more" button with numbered pagination (‹ 1 … 4 5 6 … 20 ›) plus a "page X of Y" count, jumping back to the top on page change. Content's type tabs now filter server-side (each tab is its own query instead of a client-side sieve over merged pages), which also makes them accurate on large sites. The wp.org install dialogs keep "Load more", where appending suits browsing.
  • Editor says what it's editing: The topbar pill reads "New page" / "Post · Published" instead of a bare status, and the title placeholder follows suit ("Untitled page") — a blank new page and a blank new post are no longer indistinguishable.
  • Add-plugin dialog: wp.org search results paginate — a "Load more" row appends the next page (with the running count of 2,500-odd results) instead of stopping at twelve, keeping your scroll position instead of snapping back to the top. Plugin-name cleanup handles more tagline junk: attached colons ("UpdraftPlus: WP Backup & Migration Plugin"), sentence periods ("CleanTalk Anti-Spam. Spam Firewall…"), comma lists ("SmartCrawl SEO checker, analyzer & optimizer") and "by Vendor" suffixes — the vendor only comes off when a multi-word name remains, so "Login by Auth0" survives while "GEO Plugin by Squirrly SEO" trims. The untouched full name stays as the row's tooltip, and the same cleanup already runs across the Extensions list.
  • Swappable overview chart: When an analytics adapter provides traffic, the chart no longer hides the Activity view — a ⇄ button in the chart header swaps between Traffic and Activity (with ...
Read more

v0.4.1

Choose a tag to compare

@austinginder austinginder released this 04 Jul 15:21

Fixed

  • Per-plugin updates deactivated active plugins: The single-plugin update endpoint used Plugin_Upgrader::upgrade(), whose core behavior deactivates an active plugin before swapping files and leaves reactivation to the caller — so updating an active plugin from Minn (including Minn itself) stranded it deactivated. Now uses bulk_upgrade() for a single file, the same path core's own AJAX updater uses, which preserves active state — plus a reactivation safety net. "Update all" was never affected.
  • Plugin description punctuation: dropped the em dash ("Fast, focused and beautiful. Served at /minn-admin/.").

v0.4.0

Choose a tag to compare

@austinginder austinginder released this 04 Jul 14:59

Added

  • Block inspector: Complex blocks (islands) are no longer opaque. Every island's chip is now a ⚙ button that opens an inspector popover: the block's attribute schema is fetched from wp/v2/block-types, a form is generated from it (strings, numbers, booleans, enums), and edits rewrite the attributes JSON in the block comment — Gutenberg-escaped, spliced back verbatim, byte-safety model unchanged. Works one level deep too: nested self-closing children (e.g. Anchor Blocks conversation messages) each get their own form section. Attributes stored in saved HTML (source-backed) are correctly left alone.
  • Add, remove & reorder children: When an island has the standard InnerBlocks shape (wrapper HTML + block children), each child section in the inspector gains ↑ ↓ × controls and a "+ Add" button — insert a new message/card/row with schema defaults, reorder, or delete, then Apply. Typed-but-unapplied values survive the re-renders; islands with real HTML interleaved between children keep attribute editing but lock structure changes.
  • minn_admin_block_forms filter: Plugin authors can refine the inspector's generated forms — per-attribute labels, controls (text · textarea · select · number · checkbox), option lists, hiding, and field order — plus wrapperText patterns that surface editable text living in an InnerBlocks wrapper's saved HTML (replaced in place only when changed, so untouched wrappers stay byte-identical). The convention: ship the integration inside your own plugin — the filter is a no-op without Minn. Anchor Blocks is the reference (app/MinnAdmin.php), covering all 13 of its blocks including a user/assistant Role select and the editable conversation header.
  • Code block config chip: Editable code blocks get the same ⚙ affordance islands have — hover (or place the caret) and a floating chip shows the current language; click it for a popover with the syntax-highlighting picker. Lives outside the editable document, so it can never leak into saved content.
  • Insert custom blocks from /: Blocks that declare an insert template via minn_admin_block_forms appear in the slash menu — inserted as a configurable island with a real server-rendered preview and the inspector opened immediately. Anchor Blocks offers Conversation, Timeline, Callout, Stats Dashboard and Bar Chart; templates are verified byte-identical through core's own parse_blocks/serialize_blocks round-trip. Blocks-mode only, and the slash menu now scrolls when it grows.
  • Remove a block from the inspector: Every island's inspector now has a Remove action (with confirm) — including blocks that aren't registered on the site, where it's the only action. Previously the only way to delete an island was selecting the card and pressing backspace.
  • Post Types manager: A new Post Types view (Manage → Post Types) lists every registered post type — labels, slug, item counts, REST availability, and who manages it — and edits definitions through whichever manager owns them: ACF post types (written via ACF's own internal API, so they stay first-class in ACF's UI), Custom Post Type UI (its option, its shape), or Minn's own lightweight store when no manager plugin is active. Create (choosing the storage backend when several are available), edit labels/visibility/supports/taxonomies, or remove a definition — content is always preserved, and ACF deletions trash (recoverable) rather than delete. Code-registered types are shown read-only. Rewrites flush automatically and the Content view's type tabs update immediately.
  • AnalyticsWP traffic adapter: The Overview chart gains a fifth analytics provider — daily visitors (distinct sessions) and pageviews aggregated from AnalyticsWP's events table with the same site-timezone bucketing its own dashboard uses.
  • Real island previews: Islands render their actual content in the editor via a new minn-admin/v1/render-blocks endpoint (server-side do_blocks, edit_posts) — dynamic blocks and nested dynamic children show what the site will show instead of an empty "Dynamic block" card. Previews refresh live after inspector edits. Best-effort: a misbehaving render callback never breaks the editor.
  • Code block language attribute: core/code blocks carrying {"language":…} in the block comment (the attr dialect) are now fully editable instead of islanded — the existing toolbar language picker reads and writes the attribute, and serialization preserves the incoming dialect (attr stays attr, class stays class). markup added to the language list.
  • Site icon: Settings → General can now set the site icon — drag & drop an image, choose from the media library, or remove it, with a live preview.
  • More settings: Membership (anyone can register) and New user default role (General); Convert emoticons (Writing); Moderate all comments, Registered-users-only commenting and Show avatars (Discussion) — exposed over wp/v2/settings via register_setting, with role writes validated server-side.

Improved

  • Upload from the image picker: The Insert-image / featured-image picker gains a drag & drop zone (with click-to-browse) — drop an image and it uploads and is used immediately, instead of dead-ending when the library is empty.
  • Searchable selects: New user default role, Default post category, and the Homepage/Posts-page pickers are now themed, searchable comboboxes — click to browse with the current choice highlighted, type to filter, and the display shows friendly labels while the real value is what saves. Unlike native selects, the option panel matches Minn's theme on every OS.
  • Timezone autocomplete: The Settings timezone field is now a proper combobox instead of a 400-option select — click to browse the full list (current zone highlighted), type to filter ("new york" finds America/New_York — spaces match underscores), arrow keys + Enter to pick. The option panel is anchored in-flow below the input, so it never drifts around the page the way the native datalist popup does, and free-typed input is validated against real zone ids before saving.

Fixed

  • Stale Overview after plugin changes: Activating, deactivating, installing or deleting a plugin now clears the Overview cache (and the post-type caches) — switching analytics plugins immediately switches the Traffic chart's provider instead of showing the old one until a hard reload.

v0.3.0

Choose a tag to compare

@austinginder austinginder released this 04 Jul 11:47

Added

  • User role filter: The Users view gains role tabs (All plus every registered role), filtering server-side via wp/v2/users?roles=.
  • HTML email preview: The Email Log (Gravity SMTP) detail now renders the real HTML message in a sandboxed iframe — the email as it actually looks — in a wider modal, with Open raw (opens the message in a new tab) and Resend (re-dispatches to the original recipients) actions.
  • Category & tag filters: The Content list gains category and tag dropdowns (post taxonomies), and the editor sidebar gains a Tags box — add existing or brand-new tags inline (with suggestions), remove with a click — alongside the existing categories picker.
  • Order status changes: The order detail modal can set an order's status (processing, completed, on-hold, …) straight from Minn via wc/v3, no longer read-only.
  • Media editing: The media overlay is larger and lets you edit an image's title and alt text in place instead of bouncing to wp-admin.
  • Content bulk actions: Select rows in Content to bulk-change status or move to trash. Shift-click a checkbox to select a whole range; Esc clears the selection.
  • Redirect editing: The Redirects (Redirection) detail modal can now edit a redirect's source URL, target URL and HTTP status in place — via a small generic "editable fields" capability on the surface API that other adapters can opt into.
  • Permalink settings: The Settings → Permalinks stub is now real. Core leaves permalink_structure out of wp/v2/settings, so Minn exposes its own minn-admin/v1/permalinks endpoint (GET/POST, manage_options): structure presets or a custom structure with tag validation, category/tag bases, the same normalization as options-permalink.php (including the /index.php prefix when URL rewriting is unavailable), and an automatic rewrite flush. If a save flips the site between pretty and plain permalinks, the app reloads itself at its new home (/minn-admin/?minn_admin=1).

Improved

  • Toolbars stay put: Switching a user role (or a content category/tag filter) no longer blanks the whole view — the toolbar stays in place and only the table dims while the new data loads.
  • Scrolling tabs: Tab strips with many entries (all the user roles on a big site) now scroll horizontally on one line instead of wrapping and clipping.
  • Phone layout: A real mobile breakpoint. The topbar compacts to the essentials, toolbars wrap (tab strip on its own scrollable row, full-width search), the Content/Orders/Users tables drop secondary columns instead of clipping, plugin surface tables scroll sideways, the settings nav becomes a scrollable row, and the app height tracks mobile Safari's collapsing URL bar. Touch niceties: visible media prev/next arrows, larger checkboxes, and inputs sized so iOS doesn't zoom on focus.

Fixed

  • Resend sends to every recipient: Resend in the Email Log now extracts the full To list from the event record (scoped to the to collection, so cc/bcc addresses are never promoted into the To header). Previously it reused the truncated display string and silently dropped recipients beyond the first two.
  • Open raw shows source, not a live page: The Email Log's raw view opens the message as plain text. Opening it as HTML would have run any scripts in the logged email with the app's own origin.

v0.2.0

Choose a tag to compare

@austinginder austinginder released this 04 Jul 02:47

Minn Admin 0.2.0 — the daily-driver release. The headline: AI Access — generate a revocable application password for your AI agent and hand it a site-tailored REST guide, so configuration work stays out of the admin entirely. Plus a real Traffic chart with four analytics adapters, safe inline editing around complex blocks, plugin/theme installs, and adapters for Simple History and Redirection.

Added

  • Code block languages: A language picker (PHP, JS, HTML, CSS, bash, JSON, Python, SQL) appears in the editor toolbar whenever the caret is inside a code block. The choice is stored as a Prism-style language-* class on the <code> element — portable and theme-highlighter compatible — and drives language-aware syntax highlighting, including PHP $variables and <?php tags.
  • Dark code surfaces: Code blocks in the editor and previews always render on a dark surface with a fixed highlight palette, so syntax colors are equally readable in light and dark themes.
  • Theme installs: An "Add theme" flow on the Themes tab with a WordPress.org search picker (screenshot cards, install and activate in place) and zip upload via drag-and-drop or file picker.
  • Redirects: A bundled Redirection adapter lists redirects (source, target, status code, hits, last access) straight from its redirection/v1 API, with enable, disable and delete actions via its bulk endpoints.
  • Activity Log: A bundled Simple History adapter surfaces the audit log as a native Minn view — events with who/level/when columns, Warnings and Errors tabs, and detail modals — visibility following Simple History's own view capability.
  • Plugin installs: An "Add plugin" modal on Extensions with a WordPress.org search picker (server-side proxy — the app never talks to external hosts), install/activate in place, and zip upload via drag-and-drop or file picker.
  • AI Access: Your account now manages application passwords — create a revocable credential for an AI agent (shown once, with copy-password and copy-curl buttons) and revoke any credential — plus a generated agent guide: a markdown REST reference tailored to what's installed on the site (core routes, WooCommerce, Gravity Forms, ACF, Minn extras), ready to hand to a coding agent.
  • Notifications: Individual notifications mark read on click and navigate to the thing they're about (comments → moderation, updates → Extensions, new users → Users).
  • Featured images: A Featured image card in the editor sidebar with a thumbnail preview, set/replace via the media picker, and remove. Saves through the normal post save and autosave.
  • Tables, verse and citations in the editor: Tables are now editable inline (insert a 2×2 via the / menu, edit cells directly; hasFixedLayout round-trips), verse and preformatted blocks keep their block type on save instead of becoming code blocks, and quote citations (<cite>) are preserved.
  • Theme management: Extensions gains a Themes tab with screenshots, active/update badges, activate (with confirmation), per-theme update, and delete for inactive themes.
  • Traffic on the Overview: A new minn_admin_traffic filter lets analytics plugins power the Overview chart. When a provider is active, the Activity chart becomes a real Traffic chart (visitors per day/week with a source badge) and a Visitors stat card with a period-over-period delta leads the dashboard. Ships with adapters for Koko Analytics, WP Statistics, Burst Statistics and Independent Analytics, each reading the plugin's local tables directly; sites without an analytics plugin keep the Activity chart. Traffic bars stack pageviews behind visitors, and hovering any bar shows a Koko-style card with the date, visitors and pageviews (or event count on the Activity chart).
  • About Minn: A help icon in the topbar (and ⌘K entry) opens the philosophy page — what Minn is for, the AI-agent configuration model, and the no-lock-in guarantees — with links to the docs.

Fixed

  • Plugin names are cleaned of keyword-stuffed suffixes everywhere ("Rank Math SEO", not "Rank Math SEO – AI SEO Tools to Dominate SEO Rankings") and HTML entities are decoded in wp.org search results; full names remain available on hover.
  • Slash-menu inserts (table, divider, image) land at the top level of the document instead of nested inside the current block's wrapper, and wrapper divs created by contenteditable are serialized as their real child blocks instead of raw HTML.
  • Stat cards flow into a single row regardless of count, and activity entries with invalid modified dates are skipped.
  • Panels and modals no longer replay their entrance animation on every re-render — the notification panel opened with a double flash and flashed on tab switches, and the plugin-search modal flashed on each keystroke.
  • Line breaks inside code blocks (entered as <br> by the browser) are preserved when saving.
  • Classic-content saves now strip syntax-highlight decoration from code blocks before writing to the database.
  • Elementor's internal post types (templates, floating elements) no longer appear as Content tabs.

v0.1.0

Choose a tag to compare

@austinginder austinginder released this 04 Jul 00:01

Added

  • Minn Admin app: A reimagined WordPress admin served at /minn-admin/ — a standalone single-page app that talks to the WordPress REST API and lives alongside the classic wp-admin.
  • Overview: Real stat cards (posts, pages, comments, media storage), an activity chart with 7d/30d/90d ranges, and a recent-activity feed.
  • Content: Combined posts, pages and custom post types with status pills, author and modified columns, title search, and Load-more pagination.
  • Media: Grid and list library views with real thumbnails, an Upload button, and drag-and-drop uploads from anywhere in the app. Clicking a file opens a preview overlay (image/video/audio playback, metadata, copy URL, open, delete). Arrow keys and on-screen buttons step through the library inside the preview. The Upload button reveals a drag-and-drop zone with a file picker.
  • Orders: WooCommerce orders view (when WooCommerce is active) with monthly summary cards, status tabs, and an order detail overlay with line items.
  • Users: Searchable user directory with roles and registration dates, plus full user management — create users (with password generator), edit name/email/role, set new passwords, and delete with content reassignment. Each user's active login sessions are listed (browser, IP, sign-in time) with per-session sign-out and "Sign out everywhere".
  • Plugin surfaces: A declarative extension API (minn_admin_surfaces filter) that renders third-party plugin data with Minn's generic list/tabs/detail/action primitives — no JavaScript required from the integrating plugin. Ships with two bundled adapters: Gravity Forms (entries per form, field-label resolution, trash action) and Gravity SMTP (email log via a custom-table REST shim). See docs/for-plugin-authors.md.
  • Editor panels: A second extension class for per-post fields (minn_admin_editor_panels filter) rendered in the editor sidebar with native inputs and autosave. Ships with an ACF / ACF Pro adapter: field groups with "Show in REST API" appear as editable panels (text, textarea, number, select, radio, true/false…), with advanced field types deferring to wp-admin.
  • Clean URLs: Path-based routing (/minn-admin/content instead of #/content) with pretty permalinks, including deep links, back/forward support, and automatic migration of legacy hash links. Falls back to hash routing on plain permalinks.
  • Comments: Moderation view with Pending/Approved/Spam/Trash tabs and approve, spam, trash, restore and delete actions, plus a pending-count badge in the sidebar.
  • Extensions: Activate/deactivate plugins with a switch, update badges, and one-click "Update all". Inactive plugins can be deleted from the card. Plugins with updates get a per-plugin "Update → x.y" button.
  • Settings: General, Writing, Reading and Discussion sections backed by the core settings endpoint, plus a built-in maintenance mode. General includes a timezone picker, date/time formats and week start.
  • Editor: Distraction-free, block-aware writing surface. New posts save native Gutenberg block markup; complex blocks render as atomic read-only islands preserved byte-for-byte on save, so text stays editable around any layout; classic posts stay classic. Autosave, one-click publish, slash commands (type / for headings, quotes, code, lists, images, dividers), code blocks get dependency-free syntax highlighting, image insertion from the media library, editable categories, and post scheduling with a date/time picker. A Publish-panel link previews drafts or views published posts on the frontend, and a History card lists recent revisions with preview and one-click restore. Posts and pages can be moved to trash from the editor. See docs/editor-direction.md for the hybrid-editor rationale.
  • Command palette: ⌘K / Ctrl-K everywhere, with navigation and actions.
  • Notifications: Pending comments, plugin/core updates and new users with per-user unread tracking.
  • Themes: Dark and light, persisted per browser. Bundled variable fonts (Hanken Grotesk, JetBrains Mono) — no external font requests.
  • Self-updater: Update checks against the GitHub manifest with install from GitHub Releases.