source: Klonkt/CHANGELOG.md@ dd568e7

main
Last change on this file since dd568e7 was dd568e7, checked in by Robin <roboburr@…>, 7 weeks ago

Feature: OAuth C2S outbox POST — apps can drive the account (phase 1 done)

Second half of AP Client-to-Server: a bearer-authenticated POST to
/ap/users/:slug/outbox accepts activities and translates them onto the existing
delivery machinery (deliverReply / sendInteraction / followActor /
deliverCreate) rather than reimplementing federation.

  • ingestOutboxActivity(site, user, activity) dispatches Create(Note) (reply -> resolveRemoteNote + deliverReply; top-level -> a sanitized microblog post + deliverCreate), Like, Announce (+upsertBoostedNote), Follow, and Undo of Like/Announce/Follow. A bare Note is wrapped in a Create per AP section 6. Client "source" (plain) is preferred over "content" (HTML) for replies; top-level content is HtmlSanitizerService.sanitize()d. Unhandled verbs return a clear 400 rather than a silent no-op.
  • Route: bearer via OAuthService.verifyBearer; the token is scoped to one site, so a slug mismatch is 403 and a readonly account is 403; no token is 401 with WWW-Authenticate. 201+Location for created objects, 202 for side-effect verbs. Declared after apJson (shared with the inbox handler) to avoid a TDZ on the const.

Verified live end to end against a running server with a real OAuth token:
top-level Note -> 201 + Location, stored published + sanitized (script stripped)
+ served as a valid Note at /ap/notes/<id>; Like/Follow -> 202; unresolvable
reply -> honest 502; no-token 401, wrong-site 403, unsupported type 400. 7 new
unit tests for the deterministic dispatch paths (80 green).

Ivory and other Mastodon-API clients are NOT supported by this: they speak
Mastodon's REST API (/api/v1/apps, /api/v1/instance, secret-based OAuth), not AP
C2S. That's a separate track (klonkt-demo-mastapi). Delete/Update of arbitrary
objects deferred (klonkt-demo-c2sdel). Beads: klonkt-demo-1w4.

Co-Authored-By: Claude Opus 4.8 <noreply@…>

  • Property mode set to 100644
File size: 19.5 KB
Line 
1# Changelog — Klonkt
2
3All notable changes to Klonkt. Newest at the top.
4Versions follow [SemVer](https://semver.org/).
5
6## [Unreleased]
7
8### Added
9- **App access via OAuth 2.0 (ActivityPub Client-to-Server, phase 1).** Klonkt
10 now speaks the standard AP C2S auth handshake so native and web clients (the
11 Shaer apps first) can connect: dynamic client registration (RFC 7591), a
12 PKCE authorization-code flow with a consent screen that picks which of your
13 sites the app may post as, and bearer tokens (stored hashed, single-use
14 codes). The actor document advertises the OAuth and uploadMedia endpoints and
15 `/.well-known/oauth-authorization-server` (RFC 8414) exposes the metadata, so
16 clients discover everything instead of hardcoding paths. Public clients + PKCE
17 only, no client secrets.
18- **The outbox accepts posts from apps (C2S, phase 1 complete).** A
19 bearer-authenticated `POST` to `/ap/users/:slug/outbox` now drives your account
20 from a client: publish a note, reply, like, boost, follow, and undo any of
21 those. Activities are translated onto the same delivery machinery the web UI
22 uses; a bare Note is wrapped in a Create per the spec; content is sanitized;
23 the token is scoped to one site so it can't post as another. Note: this is
24 ActivityPub C2S, which the Shaer apps speak. Mastodon clients (Ivory etc.) use
25 Mastodon's own API and are not supported by this.
26
27### Fixed
28- **Visitors can reply to the site owner's own comments.** The "reply via the
29 fediverse" button only appeared on comments from others; the site's own
30 comments in a thread offered visitors nothing, so you could not respond to
31 the author from your own instance.
32
33## [1.5.0] · 2026-07-18
34
35### Added
36- **Messages: your replies and notifications on one page.** A single Messages
37 tab replaces Replies and Notifications. One stream with filter chips (All,
38 Conversations, Activity, Sent): your own sent replies join the conversation
39 (with edit and delete), likes and boosts on the same post group into one line,
40 private replies carry a lock badge, and items new since your last visit get a
41 dot. The interact bookmarklet moved along. Old /fediverse and /notifications
42 links redirect to /messages.
43- **Connect: your following and followers on one page.** A single Connect tab
44 replaces the separate Following and Followers pages, showing each connection's
45 direction (following →, follower ←, mutual ↔) and, for accounts you deliver to,
46 when they were last reached. Accounts you can no longer reach move to a
47 collapsed "Unreachable" section for cleanup. Old /following and /followers
48 links redirect to /connect.
49- **Moderate incoming replies on your own posts.** As the site owner you can now
50 remove a reply from your thread (it stays removed: re-delivery and
51 thread-filling are blocked by a tombstone) and report it to its author's
52 server, straight from the thread. This also works for private replies, which
53 cannot be handled via the fediverse interact flow.
54
55### Fixed
56- **A boosted video post keeps its video in the Circle.** Boosting a video-only
57 post (Loops.video) stored it without its media, so the Circle showed a bare
58 text tile instead of a video thumbnail; re-boosting could even wipe the video
59 from an already-cached copy. Boosts now carry the full typed media, and a
60 refresh never erases cached media.
61- **The interact page title follows your language.** "Interacteer via de
62 fediverse" was hardcoded Dutch in the browser tab, even on an English site.
63- **The Apple Music icon looks like the Apple logo again.** The old icon was a
64 garbled shape.
65- **Statistics columns no longer jump around in the 30 and 90 day views.**
66 Columns without a date label collapsed slightly; every column now keeps its
67 label line.
68- **Private replies no longer show on the public post page.** A followers-only
69 or direct (DM) reply to your post was rendered in the public thread for
70 everyone. Incoming replies now record their fediverse addressing; the public
71 thread only shows public and unlisted replies. Private ones still reach you in
72 notifications, with the post they belong to.
73- **Bare video/audio embeds no longer overflow their column.** A `.webm` /
74 `.mp4` / `.mp3` player now fits the content width like the iframe embeds do;
75 the width rule previously covered only `iframe`.
76
77## [1.4.0] · 2026-07-14
78
79### Added
80- **Followers list with delivery health.** A new Fediverse tab shows who follows
81 you and when each account was last reached, so dead accounts stand out and you
82 can remove them after a check.
83- **Bare media links play inline.** A plain `.webm`, `.mp4` or `.mp3` link now
84 renders a native player instead of a dead link.
85- **Hashtags, links and mentions are clickable on your site too.** `#tags`, URLs
86 and `@mentions` in a post become links on the site itself, not only on the
87 federated copy. Mentions are resolved once when you save, so pages stay fast.
88
89### Fixed
90- **Replies, comment deletes and reply edits always arrive.** They used to be
91 dropped when a server was briefly unreachable; they now go through the retry
92 queue like posts do.
93- **Video thumbnails for more videos.** Covers from videos with their metadata at
94 the end of the file (Loops.video, phone exports) now get a thumbnail instead of
95 none.
96- **A video-only cover shows a poster on the post page.** It no longer renders
97 blank in the Solo view.
98- **The installed app no longer shows old data on a shaky start.** A cold launch
99 on a poor connection refreshes instead of showing a stale page.
100- **The Updates page follows your branch.** On the stable branch you no longer
101 see main's changes flagged as "latest".
102
103## [1.3.5] — 2026-07-04
104
105### Fixed
106- **Polls keep their cover art when boosted.** A poll with music or an embed was
107 federating without its cover, so a boosted poll showed a blank tile; the cover
108 now travels with it.
109- **The Android app's Updates page shows what's actually installable.** It read
110 the newest release branch, which could be ahead of the phone build for a short
111 while — pressing update then reinstalled the same version. It now reads the
112 version of the phone bundle itself.
113
114## [1.3.4] — 2026-07-04
115
116### Fixed
117- **Boosts that lost their cover get it back automatically.** Posts you boosted
118 before the cover fix were cached without their artwork; they are refreshed
119 once on the next restart. If a post's home server is briefly unreachable at
120 that moment, it is retried on the next restarts instead of being skipped for
121 good. Boosting a post again now also refreshes its cached copy (cover,
122 content) — from the feed as well as the interact page.
123
124## [1.3.3] — 2026-07-03
125
126### Fixed
127- **Boosted music posts keep their cover.** When you boosted a track from
128 someone you don't follow, the cover art went missing; it now shows, just like
129 for people you do follow.
130
131## [1.3.2] — 2026-07-02
132
133### Fixed
134- **The Updates page now works in the Android app.** It now shows the newest
135 available version, and the update button downloads and installs it right on
136 your phone (your posts and settings are kept).
137
138## [1.3.1] — 2026-07-02
139
140### Fixed
141- **Music keeps playing in the background on Android.** When a track ended while
142 your phone was locked or the app was in the background, the next track would
143 start and stop again after a second. The player now feeds the whole queue as
144 one continuous stream, so auto-advancing to the next track no longer counts
145 as "new" playback that the browser is allowed to pause.
146
147## [1.3.0] — 2026-07-02
148
149### Added
150- **Choose a light or dark share card.** The auto-generated share image follows your site theme;
151 under Admin → SEO you can now force it light or dark.
152- **A mention is now a notification.** When someone on the fediverse mentions you in a post —
153 even one that isn't a reply to you — it shows up in your fediverse notifications with a link
154 to the original.
155- **Cover art on openly shared audio.** A track shared openly on the fediverse now carries its
156 cover art (or the post cover), so audio players that support artwork show it instead of a blank tile.
157- **Report a post to the fediverse.** From a fediverse post you can now report it to the moderators
158 of its own home server, with an optional reason — and if someone reports your site, the report
159 shows up in your fediverse notifications.
160- **Set a post's language.** Choose the language you wrote a post in — on the fediverse it enables
161 timeline language filtering and the translate button.
162- **Alt text for images.** Give your cover image a description (and inline images keep their own
163 alt text) — it federates to the fediverse and lets screen readers describe the picture.
164- **Mention people in a post.** Typing `@user@server` in a post now links to their profile and
165 notifies them on the fediverse — even if they don't follow you — just like a mention in a reply.
166- **Short videos in the feed autoplay and loop.** An animated cover or a short (≤30s) clip in the
167 News feed now plays automatically and loops muted, like a GIF; longer videos keep their controls.
168- **Vote on fediverse polls.** A poll from an account you follow now shows in the News feed with its
169 options and current results, and you can cast your vote — it federates back like any Mastodon vote.
170- **Create your own polls.** A post can now carry a poll (single or multiple choice, with a set
171 duration). It federates as a real fediverse poll, so your Mastodon followers can vote from their own
172 app; the live results show on the post and the poll closes itself when the time is up.
173
174### Changed
175- **Sharing audio openly is now one-way.** Once a track is shared openly on the fediverse the file
176 has spread, so "closing" it again would be false security — the editor now locks the choice after
177 opening and warns you before you tick it.
178
179### Fixed
180- **Remote videos show a preview frame.** A video in the News feed or a Circle tile (e.g. from
181 Loops or PeerTube) used to appear as a black box until you pressed play; it now shows a real
182 poster frame. (Longer videos keep their player controls by design — only clips under 30 seconds
183 autoplay like a GIF.)
184- **Mentions, hashtags and links inside brackets now work.** A mention like `(@user@server)`, a
185 `(#hashtag)` or a bracketed URL federated as plain text — and the mentioned person was never
186 notified. They now link (and notify) like their unbracketed forms.
187- **Plain web addresses become links on the fediverse.** A bare URL typed in a post or reply now
188 federates as a clickable link instead of plain text.
189
190## [1.2.0] — 2026-07-01
191
192### Added
193- **PeerTube videos in the feed.** A PeerTube link in a post now shows an inline player in the News
194 feed, like YouTube, Spotify and SoundCloud already did.
195- **Light share images.** Sites whose default theme is Light now get a matching light Open Graph card
196 when a page is shared, instead of always a dark one.
197- **Leave your own visits out of the stats.** As the admin you can now exclude your own IP address
198 from your site statistics, for a truer picture of real visitors.
199- **Right-click "Save" is turned off on covers, images and videos** — a light bit of friction so the
200 artwork isn't one click from being saved (it's friction, not protection).
201
202### Fixed
203- **Animated video covers now render correctly everywhere.** In the Circle and the grid they could
204 show up as a broken image or a blank tile; they now display as a proper looping video that fills the
205 square, centred. Right-clicking a cover gives the normal link menu instead of the browser's video controls.
206- **Following someone no longer gets stuck.** A follow whose first delivery fails (the other server
207 briefly unreachable) is now retried automatically with backoff, instead of staying on "pending" forever.
208- **Boosted posts show their real text** in the Circle, instead of a "RE: <link>" prefix.
209- **Hardened fediverse handling** — stricter signature checks on incoming activity, blocks now also
210 cover a boost of a blocked author, and pinned-post syncing no longer races when you save several times quickly.
211
212## [1.1.0] — 2026-06-30
213
214### Added
215- **Animated covers play smoothly everywhere.** Upload an animated WebP as a cover and Klonkt also
216 makes a muted, looping video of it. iOS Safari — where animated WebP is janky — gets the smooth
217 video, every other browser keeps the crisp WebP, and on the fediverse the cover federates as a
218 video that plays in Mastodon and its apps. Shown on the post, the grid, the feed and related posts.
219- **Media library (Admin → Media).** See every uploaded image, where each one is used, copy its URL,
220 and clean up unused files in one click — including the leftover video/poster of an animated cover.
221 Images, Audio and Playlists now share one tab bar.
222- **Share button** at the bottom of every post (native share sheet, or copy link).
223- **Replace a track's audio file** without re-creating the track.
224- **Music on the fediverse (first step).** Audio posts now carry schema.org *MusicRecording* /
225 *MusicAlbum* data, and a per-post toggle can share a hosted track as a real fediverse audio
226 attachment that plays in followers' feeds.
227
228### Changed
229- **Cleaner embeds on Mastodon.** A post with a YouTube/Spotify/SoundCloud link now lets Mastodon
230 show its player card; link-only tracks share their streaming links. The cover still shows in other
231 Klonkt feeds. (On your own site nothing changes — the player and cover render as before.)
232- **Circles stay in sync the fediverse way** — edits and missed posts catch up automatically via
233 standard ActivityPub, so a Circle no longer drifts out of date.
234- **Everything Klonkt federates is now valid AS2 / JSON-LD**, guarded by a test, so stricter servers
235 accept it.
236- The track list is sorted **newest-first**.
237
238### Fixed
239- **Animated WebP covers are no longer frozen to a single frame** (the crop editor and the thumbnailer
240 left them static).
241- **Link-only tracks** (Spotify/YouTube, no uploaded file) can be inserted into a post again.
242- **Link previews** (og:image / Twitter card) now use absolute image URLs, so they show on Signal,
243 WhatsApp and other scrapers.
244- Several **fediverse delivery fixes**: covers/links no longer turn into a black tile on Mastodon,
245 raw audio files don't clutter a post that already has a player, and dead links from a renamed
246 remote post heal themselves.
247- The **mobile feed** loads full-resolution covers; long titles wrap instead of overflowing.
248- **Self-hosting updates** are more reliable: re-running the installer keeps your channel, and the
249 updater no longer restarts or claims an update when you're already up to date.
250
251## [1.0.0] — 2026-06-30
252
253### Added
254- **Klonkt is now on the fediverse (ActivityPub).** Your site is a real fediverse
255 account: people on Mastodon — or another Klonkt — can follow you, and your posts
256 reach their feeds. You can follow accounts and read their posts in a **News** feed,
257 get **notifications**, and **like, boost and reply** to posts. Incoming activity is
258 verified, so fake replies, likes and followers are rejected.
259- **Anyone can reply, like or boost your posts from the fediverse** — visitors interact
260 from their own account (they just enter their server); no account on your site needed.
261- **Circles**: follow other Klonkt sites and show each other's public posts in your
262 Circle — decentralised, with no central platform.
263- **Sensitive (NSFW) posts** with your own content-warning text: blurred with
264 click-to-reveal across the site, and shown as a content warning on the fediverse.
265- **Block** an account or an entire domain you'd rather not hear from.
266- Search now also finds **tracks** (by title, artist and album), playable straight from
267 the results with a link to the post they appear in — and post search matches as you type.
268- **Live theme preview** in Admin → site settings: accent, theme and palette update
269 instantly, before you save.
270- Uploaded images are automatically optimised to **WebP** for faster pages.
271- A roomier **mobile writing experience**: tap to open a distraction-free fullscreen
272 editor, with the formatting toolbar staying in view above the keyboard.
273- **Long posts collapse in the News feed** with a *read more* toggle, so a long post no
274 longer fills the whole screen — tap to expand or collapse it.
275- **See everyone in a Circle**: when a Circle has more than five sites, the member count
276 opens a popup that lists them all, so a big Circle no longer hides its members.
277
278### Changed
279- **Palettes revised to 8**: the neutral **Klonkt** (gold accent) is the new default,
280 plus seven full-colour themes — Forest, Ocean, Teal, Lilac, Sunset, Candy and Amber.
281- **Your profile federates more completely**: the links on your profile, the date you
282 joined and the accounts you follow now travel along to other servers, so your profile
283 looks complete when someone views it from Mastodon or elsewhere.
284- **Cover images and avatars are sharper** — resized on the server instead of being
285 squeezed by the browser.
286
287### Removed
288- **Hub mode** — Klonkt is now **solo or Circles**; you build a collective or label
289 through **Circles** (federated, standalone sites).
290- **Native comments and Google login** — replies, likes and boosts now run entirely
291 through the fediverse.
292- **Local favourites (♥)** — replaced by the ⭐ fediverse like.
293
294### Fixed
295- **Hashtags and mentions now work in every language and script** (e.g. Japanese, Cyrillic,
296 Arabic), both on your site and when federating — not just the Latin alphabet.
297- **Switching a site to solo (federation off) works again.** Turning the fediverse off could
298 make the whole site return “page not found” instead of just disabling federation; it now
299 cleanly switches federation off while the rest of the site keeps working. (Self-hosters:
300 update to pick up the fix.)
301- The Fediverse and Notifications items now disappear from the menu when federation is off,
302 instead of lingering.
303- The mini-player jumps and scrolls to the track that's playing — also from an album or
304 playlist — and keeps it highlighted.
305- Empty album/playlist covers now fall back to the first track's cover.
306- A profile photo that broke in the header after the WebP switch now repairs itself.
307- Many **mobile post-editor** fixes: reliable scrolling, a formatting toolbar that stays
308 put, no page jumps when you tap a button, and a Save bar that sits just above the keyboard.
309- **Boosts now reach the original poster** — their server registers the boost and notifies
310 them, just like a boost from Mastodon — and a boost is retried if a server is briefly
311 unreachable instead of being sent once and forgotten.
312- **Unfollowing an account now takes effect on the other server** (it could previously fail
313 to register, leaving you still following on their side).
314
315## [1.0.0-beta.2] — 2026-06-19
316
317First release where we actively track the version (shown in the footer — click it for
318this page).
319
320### Added
321- Release tracking: the version number in the footer links to this changelog page.
322- Eight premium features (Patreon-gated): newsletter/mailing list, download-for-email,
323 release scheduling + fan-only previews, EPK/press kit, pro statistics, link-in-bio +
324 click stats, embeddable player, and show agenda + notify-me.
325- Newsletter signup field in the footer (on/off in Admin → Settings).
326- SMTP settings configurable in Admin → Settings (no more config-file edit needed), with
327 a test-mail button.
328
329### Changed
330- Tidier settings forms (stacked labels, full-width inputs).
331- EPK/press kit shows the top 10 most-listened tracks.
332- Nicer 404 page (mobile-friendly) and clearer login error messages.
333
334### Fixed
335- The site-wide audio player wasn't loading any tracks.
336- Button text became unreadable on hover.
337- Date pickers now follow the theme.
338- Back/forward navigation no longer shows a doubled header.
Note: See TracBrowser for help on using the repository browser.