Changelog
What changed, and when.
Every release of Zeku, newest first. RSS feed
0.1.31 Theme settings in the theme's own groups
Settings > Site follows the groups and order your theme gives its settings and shows its advanced settings when you ask, new files take their names the way your collection names its own, and links on sites written in Obsidian are ones Obsidian follows.
- Settings in your theme’s groups. Settings > Site now lists a theme’s settings under the headings and in the order its
config.settings.yamlgives them, as the Astro Theme Settings plugin for Obsidian does. Before, every setting sat in one long list. - Advanced settings. Settings a theme marks as advanced, such as Coffer’s notes URL segment and font loading, show when you turn on Show advanced settings at the bottom of the form. Every setting a theme lists now shows, including a few Zeku used to hide, like the host your site deploys to and its analytics code.
- File names. New names a file the way the collection names its own. In a collection named by title, as Coffer’s notes and Obsidian’s notes are, a new note is
My first note.md, without a title field unless the schema needs one, so Obsidian shows it by its name. Name new files by title on a collection’s card in Settings > Content changes it. - Links on sites written in Obsidian. Zeku counts wikilinks when it works out how your pages link to each other, so on a site written in Obsidian it writes links Obsidian follows, like
[text](posts/my-post.md), instead of page addresses Obsidian can’t resolve. - Coffer’s covers. Coffer finds a note’s pictures by name, as Obsidian does, wherever they are in the vault. The dashboard now shows those covers, and the build check no longer reports them as missing.
- Theme versions. Theme updates read your theme’s version where the theme’s own updater reads it, so a site on the latest version no longer hears that the version it has is out.
- Axis’s color theme. Axis’s color theme setting is now called Color theme, so it no longer shares a name with the row that says which theme your site is built on.
- Settings in your theme’s groups. Settings > Site now lists a theme’s settings under the headings and in the order its
0.1.30 Folders of pages, and theme updates from Settings
A course and its lessons, or any page that holds other pages, shows on the dashboard as a section you can step into, New writes where you are, and sites on Axis, Coffer, or Astro Modular can update their theme from Settings.
- Folders of pages. A page that keeps other pages in its folder, like a course and its lessons, now shows on the dashboard as a section. Its card says how many pages are inside, clicking that steps in, and a trail at the top takes you back up. Search and the filters still find every page, however deep. Before, every page in the collection sat in one pile.
- New writes where you are. Inside a section, New creates the page there, so inside a course it makes a lesson. Its Section menu reaches any folder at any depth, and it shows the address the page will have on your site before you create it. New entry here in the file tree writes inside that folder, and New page inside on a card starts pages inside a page that has none yet.
- Any theme. Zeku finds sections from your folders, never from their names, so a Starlight site’s groups show as folders too. To list a collection’s pages together as before, turn off Show folders of pages as sections on its card in Settings > Content.
- Theme updates. On a site built on Axis, Coffer, or Astro Modular, Settings > Site checks once a day for a new version of the theme and updates it. You see what changes before anything is written. Your posts, settings, and edits to theme files carry across, Zeku installs and builds the site, and the update is committed only if the build passes. Undo update puts everything back until you publish. See Theme updates.
- Coffer’s publish flag. Coffer publishes a note only once it says
publish: true, and Zeku now reads it the same way: a note without it is a draft, switching a note to published writespublish: true, and a new note starts as a draft. The setting named after a collection’s draft field, such as Without publish, a page is, sets this for any collection in Settings > Content.
0.1.29 Images you can move, and grids that match your theme
Select a picture to delete, cut, or move it, step onto a line of pictures with the arrow keys, and see a paragraph of images as the same grid your theme draws.
- A line of pictures shows just the pictures. Several images on one line used to show their alt text as an underlined sentence, with the pictures stacked underneath. Now the line shows only the pictures, side by side the way your site’s paragraph shows them.
- Click a picture to select it. Delete or Backspace removes it, Ctrl+X and Ctrl+V move it, and Alt+↑ and Alt+↓ shift it a line at a time. Enter or typing starts a new line below it.
- The arrow keys reach images. Moving the cursor onto a line of images shows its Markdown, with the pictures still on screen below it, so you can edit, cut, or paste it like any other line. The cursor used to jump over images entirely.
- The code button opens the right picture.
</>on a picture, or a double-click, goes to that picture’s own Markdown. On a line of several images it used to go to the last one. - Image grids. On a theme that shows a paragraph of two or more images as a grid, such as Astro Modular or Axis, Zeku draws the same grid, with the columns, breakpoints, and cropping read from your theme’s own stylesheet. Image grids in Settings > Content shows what Zeku found, and corrects it.
- Fixed: shortly after a note opened, an image’s resize handle,
</>button, and clicks could stop responding.
0.1.28 Mermaid diagrams drawn by Pele
Zeku now draws Mermaid diagrams with Pele, the renderer Obsidian uses, so they appear with the page, follow your theme, and fit the editor as its width changes.
- Diagrams drawn by Pele. Zeku draws Mermaid diagrams with Pele, the renderer Obsidian uses. Diagrams appear with the rest of the page instead of a moment after it, take their colors and fonts from your theme, switch between light and dark instantly, and lay out again when the editor gets wider or narrower.
- Mistakes are easier to find. A diagram that can’t be drawn says what’s wrong above its code, where it used to stop at “Parse error on line 3:” with nothing after it.
- Links in diagrams. A link in a diagram opens in your browser.
- Your site’s renderer. Mermaid drawn by in Settings > Content recognizes a site that draws its diagrams with Pele. A site that draws with merman, as Firefly does, still gets merman’s rules for labels, so its charts read the same in Zeku as on the page.
- A smaller download. The Windows installer is about 10% smaller.
0.1.27 Search Settings, and a find bar that keeps up
Settings has a search box, Ctrl+F jumps to matches as you type, links you're editing stay put, and notes come back scrolled exactly where you left them.
- Search Settings. Start typing as soon as Settings opens, or press Ctrl+F there. Matching settings from every section show in place, ready to change. A section, group, or collection name, such as SEO or Posts, shows everything in it.
- The modified date field is a setting you can see. Each collection in Settings > Content now shows its Modified date field next to its date field, the field Stamp modified on save fills in, with the stamp switch right under it. Clear the field and nothing is stamped for that collection.
- A new find bar. Ctrl+F jumps to the nearest match with every letter you type and shows how many there are, such as 3 of 12. Enter and Shift+Enter step through them, Alt+Enter selects them all, and Esc leaves the match selected. Ctrl+H (⌥⌘F on a Mac) opens it with replace. Both keys can be changed in Settings > Hotkeys.
- Link to an entry asks first. Run from the command palette, it inserted a link to your first page before you could type anything. It now opens the list and waits.
- Editing links. Clicking inside a link whose Markdown is showing places the cursor instead of following the link. Ctrl-click still follows it.
- Notes come back where you left them. Going back to a note, switching tabs, or returning from the dashboard puts it at the same spot, rather than wherever its cursor was. A note you open for the first time starts at the top, instead of near the bottom after a long note.
- No more blinking tab dot. The dot that came and went with every autosave is gone. A tab shows a mark only when its last save actually failed.
- No false “changed in two places”. A file whose attributes or timestamps changed, from a virus scanner, a sync client, or a read-only file made writable again, raised a conflict over edits nobody else made. Zeku now asks only when the file’s text really changed.
0.1.26 Embed code that plays, and arrow keys that land where you expect
YouTube, Vimeo, Spotify, and X embed code renders in the editor the way it does on your site, the arrow keys reach an embed's code, and a long-standing bug that made the cursor skip lines below code blocks is fixed.
- Embed code works as pasted. YouTube’s embed code written across several lines, or wrapped in a
<div>to make it responsive, now plays in the editor instead of leaving a blank gap. X’s Embed post code shows the post’s card, the same as on your site. Embed code inside a code block stays code. - The arrow keys reach embeds, tables, diagrams, and math. ↑ and ↓ used to jump over a rendered embed, table, Mermaid diagram, or math block, so its source could only be reached with the mouse. They now stop on its source, the way Obsidian does. Clicking just outside a player opens its code too, and clicking inside the player still plays it.
- No more skipped lines below code blocks. On a page with two or more code blocks, the arrow keys could skip a line below them, and a click could put the cursor on the line under the one you clicked. Each code block threw the editor’s measurements off by a few pixels, and they added up.
- Settings > Content is simpler. It’s six groups that start closed, apart from Collections, and each collection opens to the settings people actually change, with the rest under More.
- New tab is a command of its own on Ctrl+T, so you can give the key to something else. On a Mac, ⇧⌘] and ⇧⌘[ are now commands you can change too.
- Windows: the installer no longer makes a desktop shortcut unless you tick the box, and installing with winget doesn’t make one either.
- Linux: a Zeku started by another Zeku, such as a second window, handed git the AppImage’s own libraries, and pulling failed with a “symbol lookup error”. Git now runs with your system’s libraries.
- Embed code works as pasted. YouTube’s embed code written across several lines, or wrapped in a
0.1.25 Cards that show whole covers and the fields you pick
A collection's dashboard cards can show each cover whole instead of cropping it, and can show more of its frontmatter fields, drawn the way the frontmatter panel draws them, on one line or wrapped in full.
- Cover fit in each collection’s card in Settings > Content chooses between Crop to fill, as before, and Show whole image, which fits the whole picture inside the card’s cover with a plain border around it. A theme with tall covers, like book covers or portraits, had them cut down to a strip unless the window was huge.
- Card fields in the same place adds frontmatter fields to a collection’s cards, in the order you list them, each labelled with its name. Add a field lists the collection’s own fields to pick from. A value shows the way the frontmatter panel shows it, a checkbox, a date, a list of items, a thumbnail for a picture, or an object’s own fields, rather than as raw text. Fields a card shows already, like the title and tags, are left out.
- Wrap field text lets those values wrap onto more lines, for an address, a path or a long title. Off, each stays on one line with an ellipsis. There’s no character limit, so a wrapped value always shows in full.
- All three are kept in the project’s
.zeku/config.json, so they follow the project to other computers. - Settings no longer scrolls sideways in the SEO ranges and zen padding rows, where two inputs beside a label were wider than the window.
0.1.24 The founding price, in the app
The reminder after a trial and Settings > License now say the founding license is $19 until October 31, then $39.
- The reminder that appears once a trial is over, and the Buy a license row in Settings > License, say the founding license is $19 until October 31, then $39. Only this website said so before, so nobody using Zeku had a way to know the price was about to change. The line goes away on its own after October 31.
0.1.23 Fixes from re-running every theme
Every theme in the table was run again on 0.1.22, and what that turned up is fixed here. On Windows, a dashboard of very large covers no longer freezes the window, drafts marked with a word, like status draft, are read as drafts, more themes' pages get their right addresses, a new page keeps a required field whose choices live in another file, and the cursor no longer stays tall after an image goes missing.
- On Windows, a dashboard of very large covers no longer stops the window from answering. revista-3’s covers are film scans of up to 95 megapixels, and its cards drew each one at full size, so the window froze for seconds at a time while they were on screen, and a collection’s SEO audit there took up to three minutes. Covers and the thumbnails beside image fields are now drawn from small copies made in the background, and that audit takes under a second.
- A theme that marks drafts with a word, like open-blog-revolution’s
status: draftandstatus: published, has its drafts read and written the way its site reads them: a post is published only at the published word, a post without the field counts as the schema’s default, and New starts a post at the published word. Zeku read only true-or-false draft fields, so a new post there was a draft with no page. A draft has in Settings > Content gains a word option, with Draft word and Published word to set the words. - Pages at the top of a content folder, which 0.1.22 made a collection of their own, are at the site root unless a route says otherwise, as Markdown pages at the top of
src/pagesare. astro-big-doc’s new pages got/content/addresses that answered 404. - A route that gets its pages from a helper reading two collections is tied to the one the helper is named for, and a route that hands everything it is given to a component of the project’s own reads as rendering what that component renders. DesignPhotographyPortfolio’s work pages do both, passing each work to a detail component through a
getWorksthat reads the photo credits before the works, and they got/works/addresses the site does not have. - On a site that has never run
astro sync, or runs Astro 4, a required field whose choices come from a list in another file, like danielcgilibert’scategory: z.enum(CATEGORIES), stays in the schema Zeku reads, so a new post starts with it, marked as required, for you to fill in. It was left out with nothing to say the post needed one, and Astro failed every blog page over the one new post. - The cursor beside an image, a diagram or an embed that changes size on its own is redrawn at the new size. After an image file went missing, the cursor stayed as tall as the image’s loading placeholder, and on a short page a click on a line below it could land on the wrong line.
0.1.22 Tested against 100 more Astro themes
Zeku was run against the next 100 most popular Astro themes, and everything it found is fixed here. New pages start with the layout, author and fields their collection uses, sites that keep posts outside src/content or in folders their config leaves out open with every post, the site preview starts from a start script, and Update field types no longer breaks a running preview.
- New pages in
src/pagesstart with the layout their collection’s pages use. A Markdown page there looks like the rest of the site only when it names a layout, and new pages on Creek, Odyssey, NeonMint and astro-design-system came out bare. The layout is written relative to the new page, and New page layout in Settings > Content changes it, or leaves it out when cleared. - A required reference that every page gives the same entry, like a blog’s one author, starts there on a new page, and so does a list of them, like 8-BitQuest’s
authors: ["admin"](pacamara, breeze, astro-i18n-starter). New left the field empty, so a new page failed the schema, or had no address, until you filled it in. - A required field that most pages set to their own slug starts as the new page’s slug, like astro-engineering-blog’s
id, andz.string().array()is read as a list, so a new post’s tags pass nimbus-narratives’ schema. - Sites that keep posts in folders their content config doesn’t declare open with every post. On Astro 5 and earlier, a config with no loaders still gets a collection for each folder of Markdown it leaves out (ekmas/minimal, astro-minimal). A config whose collections Zeku can’t read, like CelestialDocs’, which builds them in a loop, is read from its folders, and a content folder with no collections at all, like astro-photography-portfolio’s single
about.md, opens to a dashboard instead of nothing. - When every collection loads from outside
src/content, Zeku opens the folder that holds them, like shokax’ssrc/postsandsrc/moments. It opened the nearly emptysrc/contentbeside them, with every collection hidden. - More routes are followed to the collection they serve: a helper imported through tsconfig’s
baseUrlas a bare path likesrc/utils(flo-bit’s blog template), and a default import of a function its module exports by name. A site under abaseset in another file gets it in its addresses, and the preview opens there. A page per group, built fromnew Set(...)and rendering no entry, like bytekai’s bookmark types, is a list rather than the entries’ route, so bookmarks no longer get addresses that answer 404. prefixDefaultLocale: truein astro.config’s i18n settings puts the default language’s code in front of its pages’ addresses, as Astro does, for collections kept in language folders (build-blog-astro).- A loader pattern with a plain group, like open-blog-revolution’s
**/*.(md|mdx), matches its alternatives. Zeku read the brackets literally, so the dashboard listed none of the posts and New warned that a new one wouldn’t be on the site. - A shorthand
generateIdin a loader counts as a custom id (Polyglow), so the build check no longer takes nine translated About pages for one. - The site preview starts on a site with no
devscript, from the script that runsastro dev, like astro-minimal-starter’sstart. - Update field types stops the preview’s dev server while
astro syncruns, and starts it again after. A sync beside a dev server that hadn’t served a page yet left every page answering an error until a restart, as on 8-BitQuest’s Cloudflare adapter. - Frontmatter closed by
---with a space after it is read, as Astro reads it (bytekai’s bookmarks), and a list of lists, like horizon’s rows of gallery images, opens in the frontmatter editor one item per line instead of being flagged as the wrong type. - A field holding a section of the page, like lotus’s docs
hero, is never taken for the cover, so a pasted cover no longer goes into it as text the build refuses. - Markdown detection reads integrations kept in the theme’s own files, like reimu’s copy of astro-mermaid, and the packages such a file wraps, like astro-charm’s, so diagrams and
:::blocks those sites render are no longer underlined. - In MDX, a component’s name inside inline code, as in Starlight’s “Wrap
<Steps>around your ordered list items”, no longer stops the real closing tag from matching (flexoki).
- New pages in
0.1.21 Tested against 100 Astro themes
Zeku was run against the 103 most popular Astro themes, check by check, and everything it found is fixed here. Sites in more than one language get the right addresses, sites without content collections open where their Markdown is, new pages pass schemas Astro never wrote out, and the site preview starts on sites that listen on 127.0.0.1.
- Zeku now reads routes that start with a
[locale]or[lang]folder. A site that serves its default language without a prefix and the others under their code, like AnvilWiki, gets/bosses/frostbound-monarch/and/ja/bosses/frostbound-monarch/instead of an/en/on every English page. A site that puts every language in its addresses, like astro-theme-cody and astro-i18n-starter, gets the default language’s code too, and a page kept in no language folder counts as the default language’s. Default locale in URLs too in Settings > Content sets this for a collection. - More multilingual sites get the right addresses: a
slugthat starts with a language folder (stardrive), a route that takes a language folder off each id in its code (velocity), a default language named in another file through a spread (ThoughtLite), a[...locale]route that reads the language from the folder (ThoughtLite), and a site with one language folder and i18n turned off (Astro Rocket). A folder that only shares a name with a route, like Litos’sposts/posts/, is no longer taken for a language, and a home page made once per language, like ThoughtLite’s, is no longer taken for the page of every note it lists. - New asks for the language when every post sits in a language folder, even when each post is a folder of its own, and starts on the site’s default language. astro-i18n-starter keeps its posts at
en/first-post/index.mdx, and a new one used to go outside every language folder, where the site gave it no page. - Zeku follows more of the code a route gets its pages from: a helper reached through a tsconfig alias for one file, like
@/utils, or through an index file that only re-exports it (Astro Theme Resume), a helper whose collection is a parameter’s default (astro-theme-vitesse), and a filter that keeps-index.mdoff the pages, written as a lookahead,/^(?!-)/, or a negated match,!entry.id.match(/^-/)(Bookworm Light, Pinwheel, Bigspring, Astrogon). A route that takes/-indexoff each id, like Astrogon’s docs, serves a folder’s-index.mdat the folder. A check the route runs first and throws away, like Astro Rocket’sassertNoSlugCollisions(), no longer decides which collection the route serves. - A collection no page on the site serves has no address. Blogster’s projects, which no route reads, and astro-portfolio’s projects, listed on its home page and nowhere else, used to get addresses that were never there. Cards say Not a page, and URL in Settings > Content gives a collection one.
- Sites without content collections open where their Markdown is. Markdown pages in
src/pagesare opened there, even beside asrc/contentthat holds only data (astro-design-system, NeonMint), every folder of Markdown there is a collection whatever its name (astro-design-system’scomponents), and pages at the root of the folder are one too, so a site that’s a singlesrc/pages/index.md, like astro-resume, opens to its dashboard. Each page’s address follows its path undersrc/pages, as Astro’s file routing does, whateverslugit sets (Creek, Odyssey). A site whose content config loads its posts from a folder of their own stays there (Blahg), asrc/datathat holds only code is passed over for the Markdown (simple-blog-astro), and a folder like.vscodeis never offered as a collection. - The site preview starts on sites whose dev server listens on
127.0.0.1, as every site with the Keystatic integration does (DataNova, Bloomfolio). Zeku waited for an address it never saw, then stopped a server that was already serving pages. And when the dev script starts another tool that prints an address first, like TinaCMS’s API on port 4001 (tina-astro-starter), the preview opens Astro’s address, not that one. - The site preview runs the package manager your computer has when a site ships lockfiles for two, like terminal-portfolio’s
bun.lockbesidepackage-lock.json. It stopped at “bun was not found on PATH” with npm installed. ApackageManagerinpackage.jsonstill decides first. - The site preview and Update field types run in a site that’s one folder of a workspace and has its packages installed at the repo root (starlight-theme-obsidian). Zeku said the dependencies were missing.
- New entries pass more schemas. On Astro 4, or a site that has never run
astro sync, Zeku reads the fields fromcontent.config.tsitself, so a new page has every field the schema requires (astro-ink, Stablo, Play). A site with no content config at all gets the fields its pages already carry (Blogster). A required field the route names pages by starts as the page’s slug (Charca’s blog template, vhAstro). Fields a theme’s own loader fills in are left out (Mizuki), and a collection whose loader reads only.mdxgets an.mdxpage (astro-i18n-starter). - New creates entries in a collection folder that holds the collection’s own
index.md, like RyuChan’s About page. It used to refuse, saying the folder was already an entry. - Date fields are found by their type when their name isn’t one Zeku knows (Blahg’s
added), as start dates when a collection has no other (startDate,dateStart), and by their values when the schema calls them text, like aria’sdateFormatted: Mar 23, 2025, which now shows on cards and goes into new pages. - An image pasted into an image field shaped like
{ src, alt }goes in as that shape even before any page has filled the field, read from the schema (astro-theme-vitesse, astro-docs-template). It went in as plain text, which the build refused. When the shape’s path is plain text rather thanimage(), the image is saved inpublic/images, since the browser reads that path as it is written, and the description goes into the alt key whatever it’s called, like sendit’simage_alt. - A cover path written from the project root, like terminal-portfolio’s
/public/images/sample-image.svg, is read as the file inpublic/images, and a pasted cover is saved there and written the same way. Zeku saved it inpublic/public/images, and the missing image stopped every blog page. - Starlight’s own
bannerandherofields are never taken for a page’s cover (starlight-theme-rapide). A pasted cover went into the banner as text, which the build refused. - Images written through a tsconfig alias, like AstroPaper’s
@/assets/images/AstroPaper-v5.png, show in the editor, and a cover field the schema calls text gets a thumbnail (AstroWind, Fuwari, Astroplate). - Markdown detection reads plugin lists your config names but keeps in another file, like
import { remarkPlugins } from './plugins'(AntfuStyle, Litos), and a highlight plugin that reads==text==as one part of a larger pattern (Momo), so callouts, math and highlights those sites render are no longer underlined. - In MDX posts, lowercase HTML like
<sub>,<sup>and<mark>draws the way it does in Markdown (Astro Micro, starlight-theme-obsidian), and a component used inside a line of text, like Starlight’s<Badge text="New" />, shows as a small chip, Badge New, instead of its source (starlight-theme-rapide). - Custom elements like erudite’s
<dim-span>show as the text inside them, tables draw inline HTML and<br>, and an embed with a protocol-relative address, like Fuwari’s Bilibili player, loads. - Mermaid diagrams on a site that draws them with merman, like Firefly, follow merman’s rules, so its charts render the way the site’s do. Mermaid drawn by in Settings > Content corrects the detection.
- Two collections that load from the same folder by pattern both keep their pages (Astroplate’s sections, Multiterm), and a cover field that’s really a page section, like Astroplate’s homepage
banner, uses the image inside it. - A collection whose entries a loader fetches, or loads from outside the content folder, starts hidden on the dashboard, and its card in Settings > Content says where its entries come from (AntfuStyle).
- A tag listed twice on one post no longer leaves the project stuck on Loading project (Astro Theme Resume). A card that fails to draw is replaced by its title instead of taking the dashboard with it.
- Zeku now reads routes that start with a
0.1.20 Tested against twelve popular themes
New entries pass your theme's schema, URLs follow the routes it builds, and images, dates and the site preview behave the way each theme expects, after testing Zeku against AstroWind, AstroPaper, Fuwari, Firefly, Cactus, ScrewFast, Astroplate, Pure, Erudite, Retypeset and Astro's own starters.
- New entries start with the fields your collection maps plus whatever its schema requires, each in a form the schema accepts. Empty optional values such as
timezone: ""orheroImage: ""used to fail the build or crash the page on AstroPaper, Pure, Cactus and ScrewFast. - New entries also start with the fields most of the collection’s entries already have, like
keywordorupdated, each with a value that means the same as leaving it out. Settings > Content has a New entry fields setting per collection to change the list. - The build check flags more of what the build rejects: an empty required image, text in an object field, a missing value where the schema doesn’t take an empty one, a date written as text where the schema wants a date, or the reverse, and an empty field whose schema takes either of two types but neither empty, like AstroPaper’s
ogImage. The frontmatter editor flags the same empty values the build check does. - Date on publish, Stamp modified date on save, and the date picker write each date in the form its field’s schema reads. An empty date field offers a time only when your date format has one, so it no longer writes
2026-10-04T10:30among posts dated2026-10-04. - URLs follow the routes your theme builds: routes that get their entries from a helper function (Cactus), an optional locale segment and a per-post slug field such as
abbrlink(Retypeset), locale folders likeblog/fr/served at/fr/blog/(ScrewFast), no trailing slash (Astroplate), posts at the root (AstroWind), and folders kept where the route keeps them (AstroPaper). Cards, Copy live URL and the site preview agree. - Copy live URL and Open on the live site work when your config gets
sitefrom another file, as AstroPaper, Cactus, Retypeset, Astroplate and AstroWind do. Where Zeku still can’t read it, or reads it wrong, Settings > Content has Live site address, which can include the path a site is served under, and Live page addresses for the formbuild.formatgives them. - Settings > Content can set a collection’s URL, whether it keeps folders in URLs, its locale field, locale folders and default locale, and which entries are not pages.
- The site preview and Update field types use the package manager your
package.jsonnames, then the one your lockfile belongs to, and Settings > Content has a Package manager setting for a computer that doesn’t have that one, like a Bun theme on a computer with only pnpm. - The site preview waits as long as your dev server is still working, so a first start that installs packages or runs
astro checkis no longer stopped at 45 seconds, and the first page after a cold start no longer lands on a 404. A failed start shows its own error instead of another project’s log. - New starts in the collection on screen, every time, and a project opens on its blog-like collection, or the one you choose under Opens on in Settings > Content.
- Links you add with
[[,[text](or Link to an entry take the form your pages already use: the page’s address, or a path to its file likeposts/my-post/index.md, which Vault CMS sites use and Obsidian follows. Settings > Content has a Links to pages setting, and the link picker starts on your site’s form instead of a choice remembered across every site. - Opening the folder a collection lives in, such as AstroWind’s
src/data/post, shows that collection’s dashboard instead of an empty editor. - Fields from a schema built on a shared base, a spread or
.extend()are read whole,z.optional(image())counts as an image field, a typedcollectionsdeclaration is read too, and a loader base built from a constant, like AstroPaper’s, keeps its glob pattern. - A page that sets its own
slug:shows and edits it in the slug row instead of renaming the file. Editing the slug of a collection’s home page no longer renames the collection’s folder; the row isn’t offered there. Anindex.mdwhose folder holds other posts can’t be renamed by its slug either, since they would move with it, and renaming a folder yourcontent.config.tsloads a collection from asks first. - Renaming a post writes the old slug to
redirectsonly on sites that keep redirects, and otherwise says the old address will stop working. Redirects on rename in Settings > Content decides it yourself, for a site that reads the field without declaring it. - An image pasted into a post follows the theme’s own links: AstroPaper’s
assets/folders, and the rest of the site’s images when the collection has none yet, so Astroplate’s go topublic/images/. A link only counts towardpublic/when the file is really there, and a link written from the content folder’s root into the post’s own folder, like Obsidian’sposts/my-post/photo.png, counts as beside the post instead of pulling new images into that one post’s folder. - Image fields shaped as objects, like
coverImage: { src, alt }, take a pasted or dropped image, and an image pasted into a nested field lands there: Starlight’sherogetsimage: { file }insrc/assets/, the shape its schema takes. - Covers show for paths that climb out of the content folder, such as
../../assets/images/cover.png, for paths through a tsconfig alias, like ScrewFast’s@/images/blog/post-1.avif, and for images inside an object field, like ScrewFast’s productmain.imgCard, which the Image field setting also accepts. - Collections kept in locale folders, like ScrewFast’s blog, pair their translations by those folders, so the Translations tab sees the French copy and Start translation puts a new one beside it. A started translation gets its own copy of the images beside the original, and its other relative paths still reach the same files, instead of failing the build.
- New warns before creating a page the collection doesn’t load, and says which files it does: Astroplate’s CtaSection loads only
call-to-action.md. It shows the name it will really write, and Create anyway still makes the page if Zeku has read the pattern wrong. - Dashboard dates show the date as it’s written in the file, so they’re no longer a day early west of UTC, and a collection without a date field shows no date instead of the file’s modified time.
- Starlight’s sidebar view stays on its docs collection, and its draft filter appears before any page uses
draft. - Text you’re still typing in a frontmatter field is kept when you switch tabs, close a tab, open the dashboard, save, publish, change editor mode or close the window, when you scroll a long post far enough that the frontmatter leaves the screen, and when the project reloads or another program changes the page underneath you. Ctrl+S keeps your cursor in the field you were typing in, number and date fields included. Ctrl+A, Ctrl+Home and Ctrl+End stay inside the field instead of jumping into the post, and a click or Tab into the next field after an edit lands there.
- Suggestions in a frontmatter field highlight nothing until you move into them with the arrow keys, so Enter keeps what you typed instead of taking another page’s title, and a new tag stays the tag you typed. A field with fixed choices, like an enum or a reference, still lists them when you click in.
- The slug row’s address updates as soon as a field that moves the page changes, like Retypeset’s
lang, and after you rename the post’s folder. - Draft fields are found by any of their usual names, such as
isDraftorpublished, and read the right way round, sopublished: falseis a draft. Draft field and A draft has on a collection’s card in Settings > Content set them for any theme. - Switching projects right after an edit saves it first. It used to be refused, reported as a deleted page and offered back as unsaved work the next time.
- On Windows, renaming or deleting a post kept in a folder no longer fails with “Access is denied” while the site preview runs. The dev server holds open the folders of the posts it has shown, so Zeku stops it, makes the change, and starts it again. When another program holds the folder, Zeku says so.
- The SEO audit measures a title the way a browser tab shows it, and Page title in Settings > Content corrects that form for a theme that writes titles another way.
- Confirmations, like moving a post to the Recycle Bin, are Zeku’s own dialog on every platform instead of the system’s. Restore defaults and changing a field to a type its value doesn’t fit now ask first, which they didn’t.
- With a file open that isn’t a page, like astro.config or an image, the site preview stays on the last page instead of showing a 404.
- Closing the command palette, or answering one of Zeku’s questions, puts the cursor back where it was, so typing carries on without a click.
- Enum fields list every allowed value when you click into them.
- Markdown detection reads what a plugin’s code does rather than its name, so Fuwari’s callouts aren’t underlined and
[[text]](url)isn’t taken for a wikilink. Tags likev1.0.0aren’t marked invalid.
- New entries start with the fields your collection maps plus whatever its schema requires, each in a form the schema accepts. Empty optional values such as
0.1.19 Images go where your theme keeps them
Pasted and dropped images follow the folders and paths your posts already use, alt text goes to whatever field your theme keeps it in, and Settings > Content can set all of it.
- An image pasted or dropped into a post goes where the collection’s other images are, read the way Astro reads a Markdown path, relative to the post: an
imagesfolder beside each post, a shared folder such assrc/assets, orpublic/for links like/images/photo.png. Zeku used to read most of those paths from the root of the content folder, so the image landed in the wrong folder with a link your site couldn’t load. - When you paste or drop an image into a frontmatter field, or set a cover from Insert image, the description goes into your collection’s alt text field under whatever name your theme gives it:
heroImageAlt,heroAlt,coverAlt,imageAlt,altTextoralt, in camelCase, snake_case or kebab-case. Zeku 0.1.18 only looked for the image field’s own name plusAlt. - Settings > Content has an Image alt text field for each collection, for a theme that names it something else. Clear it to stop writing alt text to a field.
- Each collection also has a Frontmatter image folder for images pasted or dropped into its frontmatter, such as
src/assets/blog,public/images, or./imagesbeside each post, and a Frontmatter image path:cover.png,./cover.png,, or through your tsconfig alias,~/assets/cover.png. Left on their defaults, both keep following the collection’s other images. - Frontmatter images written through a tsconfig alias, like
~/assets/images/cover.pngor@/images/blog/cover.avif, are copied too: a new image goes into the folder the alias points to and gets the same form. - A cover field Zeku didn’t know by name, like
cardImage, is now found when your schema builds it withimage(). - An image pasted or dropped into a post is named after its description, as Vault CMS’s Image Manager does, instead of
pasted-2026-10-03-12345.png. - Cancel in the image description prompt cancels the image. It used to add the image anyway.
- Clicking into an empty text field and out again no longer rewrites
""as an empty value, which a schema can reject.
- An image pasted or dropped into a post goes where the collection’s other images are, read the way Astro reads a Markdown path, relative to the post: an
0.1.18 Describe images pasted into frontmatter
An image pasted into a frontmatter field asks for a description, as Vault CMS does, and lands in the folder where that field's other images live.
- Pasting or dropping an image into a frontmatter field asks you to describe it, as Vault CMS’s Image Manager does. The file is named after the description, and when your collection keeps alt text beside the image, like
heroImageAltorimageAlt, the description fills it too. - The image goes where that field’s other images already are:
src/assetsfor aheroImagewritten../../assets/cover.png, animagesfolder beside each post for./images/cover.png, or beside the post. - Paths are always written as relative paths, site paths from
public/, or Markdown images, the forms an Astro site reads. Zeku 0.1.17 wrote[[cover.png]]into a field whose other values were wikilinks; it doesn’t anymore. - Zeku no longer writes wikilinks anywhere. Typing
[[still finds a page, and picking one writes a Markdown link to its URL. The link picker’s Wikilink format and the wikilink version of Copy heading link are gone.
- Pasting or dropping an image into a frontmatter field asks you to describe it, as Vault CMS’s Image Manager does. The file is named after the description, and when your collection keeps alt text beside the image, like
0.1.17 Paste images into frontmatter
Paste an image into a frontmatter field, or drop one onto it, and Zeku saves it and writes its path the way your site reads it.
- Paste an image into a frontmatter field, such as
imageorcover, or drop an image file onto one, and Zeku saves it where your site keeps images and writes its path as the field’s value. A list field, like a gallery, gets the image as a new item. - The path takes the form your collection already uses for that field, so
cover.png,./cover.png, and/images/cover.pngfrompublic/all keep working. A pasted screenshot is named after the post, a large photo shrinks on the way in, and Zeku asks for alt text when the collection keeps it beside the image, likeimageAlt.
- Paste an image into a frontmatter field, such as
0.1.16 Build errors before you publish, translations, and data collections
Zeku checks your pages the way Astro's build does. Plus word goals, fields that know your site, a Translations tab, a form for your data collections, and more of Starlight.
Everything the roadmap had under Next, and a build check, in one release.
Writing
- Set a word goal for a page by clicking the word count, or with Set word goal in the command palette. The status bar shows your progress, like 412 / 1,000 words, and a check once you get there. Each page keeps its own goal, even through a rename.
- A Line height setting, beside Line width in Settings, sets the space between lines in the editor.
- The word count’s tooltip gives the page’s reading time.
- New commands from Obsidian: Toggle task checkbox (Ctrl+Enter) makes a line a task, then checks and unchecks it. Fold frontmatter is Ctrl+Alt+P, and Insert image into frontmatter is Ctrl+Shift+’. Toggle reading view, Show entry in file tree, and Move entry to Trash are in the command palette.
- Hide the tab bar in Settings, or with Ctrl+Alt+S, as in Vault CMS.
Frontmatter
- Reference fields suggest the ids the other collection really has: the slug field or the slugified path for a page, and for authors or categories kept in JSON, YAML, or TOML, the ids in the file. An id that names nothing gets a dotted underline, instead of failing the build later.
- Lists of references get the same suggestions, one id per item.
- Image fields show a thumbnail of the picture they point at, flag a path with no image, and suggest the pictures near the page. Aliases like
~/assetsfrom your tsconfig work too. - A value your schema would reject gets a dotted underline and a tooltip saying why, like a number where it wants text, or a description longer than
.max(160), which shows as you type. - New pages no longer start with empty values your schema rejects, like a blank optional date or image. Those fields are left for you to add.
Links
- Type
[text](#to link to a heading on the same page, and a link to a heading that isn’t there gets the broken-link underline. - Copy live URL and Open on the live site, in the command palette, use your astro.config’s
siteto give you the page’s full address, ending in.htmlwhen your site builds withbuild.format: 'file'.
Your site
- Zeku checks your pages against your schema the way Astro’s build does. A page the build would reject gets a Build error label on the dashboard, and Publish tells you before you push: a required field that’s missing, a number where the schema wants text, a value outside an enum or a limit, or an image that isn’t there. A reference to a missing entry, or two pages with the same id, gets a Build warning, since the build may get past it. A filter beside the item count shows just those pages, and when your content config changed since field types were last read, the dashboard offers to update them.
- A new Translations tab lists the page you have open in each of your site’s languages. It shows the ones that are missing, marks a translation whose original changed since, and starts a missing one from a copy of the original.
- Data collections, like a list of authors in a JSON or YAML file, get their own button on the dashboard, with a form built from your schema. Saving changes only the values you edited, so comments, formatting, and line endings stay as they were.
- Zeku reads each collection’s
patternthe way Astro does, so a file your site skips, like one in a subfolder under*.mdor one an exclusion like!archive/**names, isn’t listed, audited, or given a URL. - Starting a translation of a Starlight page with a
sluggives the copy the same slug in its language, so Starlight pairs the two. - Set the commit message Publish suggests in Settings, with
{{date}},{{numFiles}}, and{{files}}, the same tokens as obsidian-git.
Starlight
- Asides with a custom title or icon, like
:::tip[Title]{icon="heart"}, render with the icon your site shows. Caution is orange and danger is red, as in Starlight. - Starlight’s components, like Aside, Card, Tabs, and Steps, are in the MDX insert menu, and so are Astro’s Image and Picture on every site.
- The dashboard shows each page’s sidebar label and badge, and marks pages hidden from the sidebar.
- Starlight’s own frontmatter fields are known before you run
astro sync, and Update field types (astro sync) in the command palette runs it for you.
Fixes
- Site preview starts on sites that use npm. It ran
npm dev, which npm doesn’t have, instead ofnpm run dev. - Zeku remembers the window’s size and position, and whether it was maximized, between launches. A window opened with New window keeps the size and lets your system place it, so it doesn’t open on top of the first.
- Renaming a page back to an earlier slug no longer leaves a redirect from the page to itself.
- New Starlight pages no longer start with empty
hero,banner, orsidebarfields afterastro sync, which failed Starlight’s schema. - A page whose frontmatter runs past 8 KB, like a page-builder theme’s home page, shows its title, draft state, and fields again.
- On sites without Obsidian callouts, aside icons drew as plain squares.
astro.config.mtsandcontent.config.mtsare recognized.
0.1.15 Alt text and lighter photos
Zeku asks for a description when you paste or drop an image, and shrinks large photos on the way in.
The last of the roadmap’s Now items: images that come in ready for the web.
Images
- When you paste or drop an image, Zeku asks you to describe it, and the description becomes the image’s alt text. Zeku fills in a guess from the file name when the name describes the picture, and leaves it empty for names a camera made up, such as
IMG_2034.jpg. Dropping several images at once takes the guesses without asking. - Photos wider than 2400 pixels shrink on the way in, which keeps your repo small and removes location data from photos. Astro still sizes images for the page when it builds, so nothing on your site gets smaller than it should.
- Both are in Settings, Usability: turn the question off, or choose another width, or turn shrinking off.
- When you paste or drop an image, Zeku asks you to describe it, and the description becomes the image’s alt text. Zeku fills in a guess from the file name when the name describes the picture, and leaves it empty for names a camera made up, such as
0.1.14 Find and replace, and links as you type
Change a word, a name, or a URL in every post at once, pick pages while you type a link, and catch links to pages that no longer exist.
Two of the roadmap’s Now items, done.
Find and replace across the site
- Ctrl+Shift+F, or ⇧⌘F on a Mac, changes a word, a name, or a URL in every post and page. Each match shows its line with the old text struck through and the new text highlighted, and a checkbox leaves any match, or a whole post, alone.
- Match case, whole words, and regular expressions with
$1groups, plus an option to include frontmatter such as titles and tags. - Zeku saves your work first, skips a post that changed after the preview or whose frontmatter would break, and Undo puts everything back.
Links
- Type
[text](and Zeku lists your pages. Pick one to fill in its URL. - Type
[[for the same list. On a site with a wikilink plugin you get a wikilink, and on any other site you get a normal link to the page’s URL, so it works when you publish. - A link to a page your site doesn’t have, such as a post you renamed or deleted, gets a dotted underline, and Publish warns you before one goes live.
0.1.13 A preview that matches your site
Zeku reads your site's Markdown settings and plugins, renders only what your site renders, and warns before a private comment is published.
Most Astro sites render less Markdown than Zeku does. Since Astro 7, a new site renders none of the extensions Obsidian users rely on, and a theme adds back whichever ones it has plugins for. Zeku now reads which ones your site has.
Your site’s Markdown
- Every time you open a project, Zeku reads your
astro.config: the Markdown processor, the features it turns on, and each remark and rehype plugin. It knows the common plugins by name, reads the rest fromnode_modules, and reads a theme’s own plugin files to see which syntax they handle. Nothing runs. - Syntax your site won’t render isn’t rendered in Zeku either. A callout on a site with no callout plugin looks like the plain quote your site will show, with a dotted underline under
[!note]. Hover over any underlined syntax to see what your site does with it instead. - Settings, Content lists what Zeku found for callouts, highlights, comments, wikilinks, embeds, math, admonitions, Mermaid diagrams, and heading ids, with the plugin behind each. If Zeku has one wrong, correct it there. The correction is saved in the project, so it follows the repo to any computer.
Comments
- Text between
%%marks is a comment, as in Obsidian: faded while you edit, hidden in reading view. - On a site that doesn’t remove comments, Zeku keeps them visible in reading view, underlines each one, and Publish warns you before a post with a comment in it goes live.
Also
- Toggling typewriter mode shows a short notice saying whether it’s on or off.
- The documentation now lives at docs.zeku.dev. Settings, About links to it, and so does Open documentation in the command palette.
- Every time you open a project, Zeku reads your
0.1.12 Typewriter mode, and links that work on any Astro site
Typewriter mode arrives with focus options, and Zeku now follows Astro's own rules for URLs, links, and images.
A writing feature, and a round of fixes from reading Astro 7’s documentation end to end.
Writing
- Typewriter mode keeps the line you are writing at one height on the screen. Settings, Usability has the options: how far down the line sits, whether the paragraph, sentence, or line stays in focus while the rest fades, how faded it gets, a highlight or underline on the line, recentering when you click, and running only in zen mode. Toggle it with Ctrl+Shift+T, or ⇧⌘T on a Mac.
Astro
- Page URLs follow Astro’s own rule. A
slugin the frontmatter wins, and otherwise each part of the path is slugified, soMy Post.mdis/blog/my-post/in Zeku, as it is on your site. - Link to an entry (Ctrl+Shift+K) writes the page’s URL by default, which works on every Astro site. File path and wikilink are still there for sites whose plugins handle them.
- Renaming a post keeps links to its URL working:
/blog/old/becomes/blog/new/. It used to become a file path that most Astro sites cannot serve. - An image pasted into a collection that has no images yet is linked relative to the post, as
./image.png, the form Astro builds without plugins. - Reference fields are recognized from the schema alone, lists of references stay lists, and an object that holds an image is no longer mistaken for an image field. A date that defaults to “now” gets today’s date in new posts, not the moment the schema was last generated.
0.1.11 One title bar on Linux
Zeku draws its own title bar and window buttons on Linux, as it does on Windows.
A fix from the first day of Zeku on Linux.
Linux
- Zeku draws its own title bar and window buttons, as on Windows. On desktops that draw no title bar themselves, GTK used to add a second bar above Zeku’s, light or dark depending on a guess made at launch.
- Settings, Features, System title bar puts your desktop’s own title bar back, for anyone who prefers it.
0.1.10 Zeku for Linux
Zeku is on Linux in beta, Pull from remote has a shortcut, and Settings can search its hotkeys.
Zeku is out on its third platform.
Linux
- Zeku for Linux is here, in beta, for x86_64 computers with glibc 2.35 or later, such as Ubuntu 22.04, Debian 12, Fedora 36 or current Arch. Run
curl -fsSL https://zeku.dev/install.sh | bashto install it for your account, with no sudo, or download the AppImage, .deb or .rpm from the download page. The command and the AppImage update themselves. - Zeku runs natively on Wayland, at the same size as every other window on the desktop.
- Zen mode is Ctrl+Shift+Z, as on Windows. Redo stays on Ctrl+Y.
- Dialogs are solid, with nothing showing through them.
Everywhere
- Pull from remote has a shortcut: Ctrl+Shift+P, or ⇧⌘P on a Mac.
- Settings, Hotkeys has a search box. Type part of a command’s name, or of its keys, to find it.
- Zeku for Linux is here, in beta, for x86_64 computers with glibc 2.35 or later, such as Ubuntu 22.04, Debian 12, Fedora 36 or current Arch. Run
0.1.9 Linux in final testing
The file tree speaks Mac on the Mac, and Zeku's Linux packages are in their last round of testing.
A small release that gets Zeku ready for its third platform.
macOS
- Five file tree menu items said Recycle Bin and Explorer on every platform. On the Mac they now say Trash and Finder, like the rest of Zeku.
Linux
- Zeku for Linux is built and in final testing: an AppImage that updates itself, .deb and .rpm packages, and the same one-command install as the Mac. It arrives in the next few days.
0.1.8 Clearer when something is missing
The Mac wordmark returns beside the sidebar toggle, Zeku finds Node and pnpm on more Macs, and Pull explains a refused account.
Small fixes from the first days on the Mac.
macOS
- The zeku wordmark is back, right after the sidebar toggle, and only while the sidebar is open, the way it works on Windows. Settings, Hide zeku branding works on the Mac again.
- Zeku finds Node and pnpm on more Macs: it waits longer for a slow shell to share its PATH, and it checks the Node version nvm uses by default.
- When Node or pnpm is missing, the message says so plainly, with a command to install them. The site preview needs them; writing and publishing never did.
Sync
- When GitHub refuses the account git signs in with, Pull says the account does not have access to the repository, instead of reporting a failed sign-in.
0.1.7 Pull without publishing
Bring in changes from another computer with one click, Publish saves your open posts first, and the Mac app looks more at home.
For writing on more than one computer.
Sync
- When your site has new commits from another computer, Zeku shows how many and offers Pull. It is in the Publish dialog, the status bar, and the command palette as Pull from remote.
- Pull keeps your unsaved writing safe. If your changes and the incoming ones collide, nothing is changed, and Zeku says which files conflict.
- Publish saves your open posts first, so what you just typed is always what goes out.
macOS
- The sidebar toggle sits beside the window buttons, the way Mac apps place it, and stays there when the sidebar is closed.
- Accent swatches are perfectly centered.
- Dialogs dim the app behind them instead of hiding it.
0.1.6 Quiet updates and a safer Publish
Updates install without an installer window, Settings shows your version, and Publish flags anything outside your content folder.
Small things that make Zeku calmer to live with.
Updates
- Updates install quietly. There is no installer window: Zeku saves your work, installs, and reopens itself. This starts with the update after 0.1.6, because the version doing the updating decides how it installs.
- Settings has an About section with the version you are running and a Check for updates button. The About Zeku command opens it.
Publishing
- Publish marks every change outside your content folder, and anything in Obsidian’s settings, in its own group, with a warning when any are included.
- Leave them out with one click, and only your posts and pages are committed.
Fixes
- “Dependencies missing” shows once instead of twice when you open a project without its packages installed.
- A callout’s title no longer disappears after you edit its first line.
macOS beta
- Zeku now runs on macOS 10.15 Catalina and later as a universal app, for Apple Silicon and Intel, with native window controls and ⌘ shortcuts.
- It is a beta, so reports are welcome at hello@zeku.dev. The app is not notarized by Apple yet, and the download page walks you through the first launch.
0.1.5 New posts land where they belong
New entry puts a new post in the collection's own folder instead of a subfolder such as attachments.
A fix for creating posts.
Writing
- New entry puts a new post in the collection’s own folder. It used to file it under the first subfolder, such as
attachments, which gave the post the wrong URL. - A folder only counts as a section when it holds posts of its own, so image folders and folder-based posts no longer show up as places to file a new entry.
- When a collection has both, New entry offers Top level alongside its sections.
- New entry puts a new post in the collection’s own folder. It used to file it under the first subfolder, such as
0.1.4 Trust-based licensing
Nothing ever locks. After the trial Zeku keeps working with a small reminder, and you can manage the computers on your license.
Licensing now works on trust.
Licensing
- Nothing locks, ever. After the 14-day trial, Zeku keeps working and shows a small reminder to buy. A license hides it.
- An activated license works for good, offline too. There is no check-in deadline.
- Settings, then License, lists the computers using your license with their names. Remove an old one there, even from a new computer when you hit the limit.
Publishing
- Publishing is never gated by the license.
0.1.3 Lifetime updates
Every license now includes lifetime updates, and the command palette no longer lists itself.
A small release that gets licensing ready.
Licensing
- Every license now includes free updates for life. There is no update window and nothing to renew.
- This version can activate licenses bought at zeku.dev.
Fixes
- The command palette no longer shows “Command palette” in its own list or under Recently used.
0.1.2 A cleaner first run
The welcome is one line, the color scheme follows your system by default, and the installer shows the Zeku icon.
A small polish release for the first few minutes with Zeku.
First run
- The welcome step is a single headline, “Welcome to Zeku”, with a shorter line under it.
- The color scheme now defaults to System, so Zeku opens light or dark to match Windows. Before, the window forced dark, which kept System from ever choosing light.
- The last step reads “All set.”
Installer
- The installer carries the Zeku icon instead of the generic Windows one.
0.1.1 Starlight fixes
The Starlight sidebar order, page addresses, and heading anchors now match what Starlight builds, and frontmatter edits touch only the line you changed.
A small release focused on Starlight sites, plus safer frontmatter writes.
Starlight
- The Starlight sidebar sort in the dashboard now matches Starlight: frontmatter order first, then slug. Manual groups and link items land in their groups.
- Starlight page addresses no longer carry a stray
/docs/prefix, so site preview, the slug display, and Copy URL all point at the right page.
Writing
- The outline shows headings as plain text, and heading anchors match the ones Astro generates.
- Frontmatter edits change only the line you edited, and keep your comments and number formats.
Images
- Stock photo search now needs your own provider key. The shared proxy is gone.
0.1.0 First public release
Zeku opens your Astro project, reads its content collections, and lets you write, preview, audit, and publish without leaving the app.
The first public build of Zeku, for Windows 10 and 11, with a 14-day free trial.
Opens your project
- Point Zeku at an Astro repo and it finds the content folder on its own.
- Every collection your
content.config.tsdeclares shows up, including collections whose folder is nested or named differently from the collection. - Field types come from the schemas
astro syncwrites, with a fallback that reads your config directly. - Folders that are not Astro projects open too, as plain markdown.
Writing
- Live preview editing: formatting renders as you type, and the syntax shows only where your cursor is.
- Callouts, Starlight admonitions, tables, footnotes, KaTeX math, mermaid diagrams, and Expressive Code blocks.
- YouTube, Vimeo, X, Bluesky, CodePen, Spotify, and GitHub Gist embeds render inline.
- Spellcheck that runs locally, with your own word list.
- Zen mode, folding, multiple cursors, outline, tags, and links panels.
Frontmatter
- A frontmatter editor that knows your schema: enum suggestions,
reference()lookups, date pickers, checkboxes, and required-field markers. - Keys your schema does not know keep working.
- Dates are written in the format you choose.
MDX and images
- A component builder (Ctrl+/) that finds your components, fills in props, and adds the import.
- Drag, drop, or paste images and they land in the right assets folder with a clean name.
- Stock photo search for Unsplash, Pexels, and Pixabay, with your own free API key.
Preview, audit, publish
- Site preview runs your project’s own
astro devbeside the editor. - SEO audit per page and per collection, with thresholds you set.
- Publish shows what changed, takes a commit message, pulls, and pushes.
- Dashboard with cards or list views, filters, bulk actions, and Starlight sidebar ordering.
Safety
- Autosave, crash recovery outside your repo, and outside-edit detection.
- Deleted files go to the Recycle Bin, never straight to nowhere.
- Zeku never reads or writes
.obsidian, so Obsidian and Vault CMS can share the same folder.