Skip to content

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 20 Sep 11:12
d9f0b0c

0.4.0 (2026-09-20)

⚠ BREAKING CHANGES

  • cms: ADMIN_TEMPLATES, which @geekity/cms exports, now names every template under pages/, layouts/ or components/, and its users and user keys are usersList, usersNew and usersEdit.
  • cms: themeDir and GEEKITY_THEME_DIR are gone; a site's theme/ becomes themes// with a theme.json, chosen by the theme setting in content/_data/site.json.
  • cms: the site actor is gone and /ap/ is unregistered. The actorHandle, actorType and avatar settings and the site avatar upload are removed, followers move to content/_data/federation/{username}/followers.json, and the site actor's keys and followers are retired rather than migrated: a site that federated as the site actor starts again as its users. Follower, InboxActivity, the AdminStore follower methods, deliveryTargets, followersPage and delivery.updateActor changed signature; siteActor and ACTOR_CLASSES are replaced by userActor.
  • cms: the template context's author is a profile object rather than the front-matter string, so a theme printing {{ author }} must move to {{ author.name }}. author and inbox are reserved top-level paths, so a site using either as a taxonomy base or permalink prefix must move. createRenderer takes a users resolver.
  • cms: home.njk's title block and body slot change, Renderer gains frontPageSlugs and renderFrontPage, navigationPages takes a second argument, and /page/N/ under a static homepage redirects to the posts page instead of serving the listing.
  • cms: /admin/settings no longer accepts the whole-settings form; each page posts its own fields to its own URL. The settings admin template is replaced by six under admin/layouts/settings/, and mountSettings, the AVATAR_, AKISMET_ and MAIL_ names and the panels are exported from their page modules.
  • cms: AdminSection gains children and the top-level order changed; TAG_KIND.section and CATEGORY_KIND.section are now 'posts'; adding a user moved from POST /admin/users to POST /admin/users/new.
  • cms: RSS subscribers of a post born on this CMS see it once more as new. Its guid was the old {baseUrl}/ap/posts/{slug} object id and is now the permalink, marked isPermaLink="true"; a post carrying an activitypub.id keeps that guid, marked isPermaLink="false". Atom's entry id and JSON Feed's item id print the same object id rather than the permalink, which moves only a post carrying a stored id. All three formats now list categories as well as tags, and all three summarise with the description if there is one and an excerpt of the body if there is not.
  • cms: a post's ActivityStreams id is now its permalink, and the /ap/posts/{slug} route is gone. A post announced under the old id, and with no activitypub.id in its file, is a new object to its followers; its RSS guid moves with it. A post whose file names an activitypub.id keeps it. postObjectId, postObjectPath, POST_OBJECT_PATH and federatedObject left the public exports.
  • cms: postConversation, postComments, siteComments, commentCounts, commentInteractions, interactionOf and the Comment and CommentContext types are no longer exported. Use createConversation, its thread, counts and latest members, spokenIn and feedComments.
  • cms: Conversation gained a mentions group and counts.mentions, InteractionKind gained mention and repost, CommentAuthor gained a required avatar and CommentRecord a required url. Themes or embedders that construct these types or switch exhaustively on kind must change.
  • cms: DeliveryService.redeliver(activityId) is replaced by resend(slug); REDELIVER_PATH, redeliveryMessage, OutboundActivity, NewOutboundActivity and the AdminStore outbound-activity methods are removed; NewDelivery requires activityType, objectId and slug; the admin route moves from /admin/federation/redeliver to /admin/federation/resend; the ap_outbound table is dropped.
  • cms: AdminStore.countUsers, listUsers, getUser, getUserById, createUser, verifyPassword, setPassword and deleteUser are removed in favour of file-backed functions exported from the admin module; User, StoredUser, CreateUserInput and DuplicateUsernameError move with them; the users table no longer exists.
  • cms: loadActorKeyPairs takes the data directory instead of the admin store; AdminStore.listActorKeys and putActorKey and the ActorKey and NewActorKey types are removed; ACTOR_KEY_ALGORITHMS and ActorKeyAlgorithm move to the federation module; the actor_keys table no longer exists.
  • cms: seedSiteSettings, writeSiteSettings, storeSiteSettings, settingsSiteData and the SiteSettingsSource renderer option are removed; readSiteSettings takes the content directory instead of the admin store, and the settings table no longer exists.
  • cms: the theme date filter's readable, html and year formats render in the site's timezone instead of UTC; iso is unchanged.
  • cms: /feed.xml and /feed.json are gone without redirects; FEED_FILES is replaced by FEED_SEGMENTS, FeedFormat gains rss, and feedHref takes a taxonomy term instead of a tag.
  • cms: TAG_SEGMENT and CATEGORY_SEGMENT are replaced by DEFAULT_TAXONOMY_BASES; termHref, tagHref, categoryHref and feedHref take the bases as a required trailing argument, and partials/tags.njk must be imported with context.

Features

  • cms: a shipped front page with recent posts, and archive pages by month (6d7fa55)
  • cms: accept native comments with moderation, per-post switch and auto-close (9b917d7)
  • cms: add a /healthz health check that answers 503 when the site cannot serve (67c3447)
  • cms: add a media screen that lists, uploads and deletes files under content/uploads (3302381)
  • cms: add categories as a second taxonomy alongside tags (7b87811)
  • cms: advertise an rssCloud/WebSub notify server and ping it on publish (1580240)
  • cms: appearance screen that lists the site's themes and activates one (dac3d83)
  • cms: batch pending-comment notices into an hourly or daily digest (8da199f)
  • cms: check native comments and webmentions with Akismet when a key is set (a172e70)
  • cms: choose what the homepage displays, with an optional posts page (f87ebab)
  • cms: derive image variants with sharp and render uploads as responsive pictures (744823b)
  • cms: email moderators about pending comments and commenters about replies (a29dac0)
  • cms: federate posts under their permalink (323b704)
  • cms: full-text search over posts and pages (4238216)
  • cms: full-text search over posts and pages (c440807)
  • cms: give each user an edit page of their own (baee3d8)
  • cms: give every admin section children and mark the landing child (c837c14)
  • cms: give every user a profile, an archive and feeds at /author/{username}/ (6033ff3)
  • cms: highlight code on the client with a self-hosted highlight.js bundle (3997746)
  • cms: hold future-dated posts as scheduled and publish them on time (aa14180)
  • cms: honour a user's stored actor id, and serve them under it (b917173)
  • cms: import a WordPress ActivityPub actor's keys, ids and followers (ecb8612)
  • cms: keep the actor's key pairs as JWK files under data/keys (799192b)
  • cms: keep users in data/users.json and treat sessions as a cache (dbf3952)
  • cms: key every feed by the post's object id, with one set of terms and one summary (bbd992f)
  • cms: listings as an h-feed of feed items with excerpt, date and categories (c8ffdfc)
  • cms: make content/_data/site.json the source of truth for settings (6639a82)
  • cms: make every user an actor at their author URL (ba8db33)
  • cms: make tag and category bases settings defaulting to /tag/ and /category/ (c285ab8)
  • cms: manage tags and categories with rename, merge and delete (9bf6cab)
  • cms: meta tags, icons from the site avatar and a JSON-LD graph in the head (04eaab4)
  • cms: milestone M15 default theme (2abb7cb)
  • cms: milestone M16 docker distribution (e35f728)
  • cms: name a site's themes and choose one in site.json (52fc56b)
  • cms: page shell and stylesheet in the andrewshell.org design (e266156)
  • cms: post and page as the blog-post entry with a bio h-card (e7f1c33)
  • cms: publish followers and the inbox log as files under content/_data/federation (0a81e2f)
  • cms: put the site author, a summary, neighbours and recent posts on the context (9ffa962)
  • cms: reactions as facepiles and comments in the source markup (9429be8)
  • cms: read every conversation through one Conversation module (67af02c)
  • cms: rebuild the database from the files on boot and add geekity rebuild (b0961a3)
  • cms: recover a forgotten password by email (c387b99)
  • cms: remove the quick draft from the dashboard (1b740e8)
  • cms: render a site menu from a navigation setting and opted-in pages (8689ec0)
  • cms: resend the current state of a post instead of replaying a stored activity (8022695)
  • cms: seed an empty content directory with the starter site on serve when asked to (86ef55d)
  • cms: send email through a mail service with Brevo and SMTP providers (a708da8)
  • cms: send webmentions on publish and receive them into the comment thread (1ec1e04)
  • cms: serve comments feeds built from ActivityPub replies (411ce38)
  • cms: serve sitemap.xml and robots.txt (9ff6509)
  • cms: serve the WordPress ActivityPub paths behind a switch (e4752b5)
  • cms: serve WordPress feed URLs with RSS 2.0 at /feed/ (243d584)
  • cms: show fediverse replies, likes and boosts under a post (8bb757d)
  • cms: split the settings screen into six pages under Settings (44156ef)
  • cms: store dates as UTC instants and render them in the site's timezone (176ae94)
  • cms: style the comments and messages screens (ef48c10)
  • cms: subscribe to Mastodon-style relays and deliver public activities to them (9544068)
  • cms: take messages from a contact form on a page (8505b4d)
  • cms: throttle admin sign-ins and send security headers (b264819)
  • release: add a script that builds and pushes the multi-arch docker image to ghcr.io (6e7f501)

Bug Fixes

  • cms: drop the divider above the first settings heading (b791b27)
  • cms: head the notice switches with whose they are, and hide them until there is an address (22fd644)
  • cms: keep the notice switches back until the site can send mail (6e357d2)
  • cms: notice a same-size rewrite of site.json inside one clock tick (dc65434)
  • cms: notice a site.json rewrite inside one mtime tick (e09dc81)
  • cms: release a scheduled post whose moment passed while it was saved (368bdf0)
  • cms: render each editor preview into a fresh iframe (daa18d5)
  • cms: show only the chosen provider's mail credential fields (add3f08)
  • cms: stop the default theme heading the home page twice (aa4dfe3)
  • cms: write the admin's form fields out of one macro (30d3ac5)

Code Refactoring

  • cms: reorganize the admin templates into pages, layouts and components (b01c762)