A new landing page and login. The signed-out home page now opens with a short explanation of what Colosseum is for, next to the animated Braille Colosseum mark, and login sits on the same panel in the same place. It adapts to the instance: the first account on a fresh server, invite-only, or closed to new accounts. The password field's show and hide control is now an icon button with a tooltip.
An Explore link in the top navigation. Signed-out visitors and people who haven't finished onboarding get it on phones too, since they have no bottom bar.
Changed
Page headers show where you are as a trail of parent links above the page title, with chevrons between them, in place of the single line with slashes. The current page is the title and isn't a link. Long trails truncate, long titles wrap, and links are 44px tall on touch screens. The canvas uses the same trail, so its title is no longer a link that did what the back button already does.
1.14.2
2026-10-06
Changed
The changelog entries for 1.14.0 and 1.14.1 no longer carry pull request numbers. Those live on each version's GitHub release.
1.14.1
2026-10-06
Fixed
A channel share link now opens the channel's canvas. The shared board shows the canvas button once the canvas has something on it, and the canvas opens at /s/<token>/canvas, read-only: link holders see the blocks and the comment threads, and can't edit, comment or open version history. Revoking the link, banning whoever made it, or letting it expire closes the canvas it has open.
1.14.0
2026-10-04
Added
Share links. A private channel's manager can make "anyone with the link" URLs for the channel or for a single block in it, from the channel's manage dialog or the block modal. A channel link shows the board read-only, and every block on it opens with its comments and media; a block link shows that block alone. A channel can have as many links as you like, each with an optional label and revoked on its own. Links expire after 30 days unless set to never, which warns first. A link stops working while its creator or the channel's owner is banned. Pasted into chat, a link unfurls with the channel's or block's title and image, and share pages are kept out of search engines.
Share links over the API and MCP: create_share_link, list_share_links and revoke_share_link, or GET/POST /api/v1/channels/:id/share-links and DELETE /api/v1/share-links/:id.
Canvases. Every channel has one, at /{handle}/{channel}/canvas, opened from the canvas button beside the channel's other actions. Blocks are placed from a sidebar and arranged freely. Everyone who can add to the channel edits the canvas together, live, each with their own cursor colour; anyone who can read the channel can look at it. Readers only see the button once the canvas has something on it.
Drawing on a canvas: shapes, frames, sticky notes, text, lines and arrows that stay attached to what they connect, a pen and a highlighter, and an eraser. The properties panel sets stroke, fill, width, opacity, text and arrowheads. The Layers panel reorders, renames, groups, hides and locks. Moves snap to other elements' edges, centres and spacing. Undo and redo cover your own edits and leave other people's alone.
Pasting or dropping onto a canvas. Files, images and links become blocks in the channel, detected the same way as a link added to the board, and land where they were dropped. Copied canvas elements paste as elements.
A grid on the canvas, as dots or lines, that elements snap to. Hold cmd or ctrl to place something off the grid.
Comments on a canvas. A thread is pinned to an element, or to a spot when there's nothing under it, and moves with the element. Replies and @mentions work as they do on blocks, and a notification opens the canvas at the thread.
Version history for a canvas, for the channel's managers. A version is saved after each burst of editing, with who took part; any version can be previewed and restored, and a restore saves the canvas as it was first. Named restore points are kept forever. Automatic versions thin to one a day after a week and go after 90 days.
Changed
bun run start (and dev) now runs server.ts, which serves the app and the canvas WebSockets on one port. A self-hosted proxy has to pass WebSocket upgrades on /realtime/: Caddy, Traefik and Coolify do by default, and nginx needs the lines in the README. Migrations 0024 to 0029 run on boot. Canvas rooms live in the app process, so run one instance.
A channel's sort, type filter, search and view are kept in its URL, so a reload or a shared link opens the board the way it was left.
Adding a file refuses SVG and HEIC before it uploads, rather than after, and a failed upload says why when the server gives a reason.
1.13.0
2026-09-16
Added
Groups. A group has a handle of its own, and the channels made in it belong to the group rather than to whoever created them, so they outlive any one account. Everyone in a group can add to its channels and read its private ones; admins can also rename and delete them and manage who's in the group; the single owner can hand the group on or delete it. New groups are made from Groups in the account menu, existing channels can be moved into or out of a group from the channel's manage dialog, and a group's page is /{its handle}, the same place a person's is, with its own name, bio and avatar.
Blocks can be arranged by hand. Drag a card by its grip, or lift it with the keyboard — space, then the arrow keys — and a channel's order stops being just the order things were added. Channel owners only.
Email addresses are verified, and the auth flow's dead ends are closed: an expired reset link says so before you choose a new password, and signing in returns you to the page you were trying to reach.
**The API and MCP surface now covers most of what the app can do.** It had been channels and blocks; it is now also people, groups, rosters, comments, notifications, search and administration. Full reference in docs/api.md and docs/mcp.md, and on /developers.
A token can name itself. whoami (GET /api/v1/me) reports the account it belongs to and the block allowance create_block refuses on, so a client adding a batch can tell a quota refusal from a transient failure before it hits one. update_profile and check_handle edit the profile.
A Colosseum link is usable by a client. resolve turns a link or a bare handle into the ids everything else takes, and list_owner_channels reads channels the caller doesn't own — until now the only reachable channels were ones the caller had made or already knew the number of.
Search, over people, channels and blocks, under the caller's own visibility. Finding one link had meant listing every channel and matching client-side, which pulls most of a collection across the wire to locate it.
A channel can be read to the end. list_blocks takes an offset and returns the channel's whole total, where before a caller got the newest N and had no way to reach anything older — a sample of a large channel rather than a listing of it.
Blocks can be arranged and shared between channels over the API: reorder_block places one behind another, copy_block puts one in a second channel without taking it out of the first, nest_channel adds a channel inside another, and tags can be set on create and update.
A private channel made over the API can be opened to someone. list_members, add_member and remove_member manage a roster and leave_channel gets out of one — before, a private channel an agent created was a dead end until a person opened the browser.
Comments are reachable: list_comments, create_comment and delete_comment. An @handle mention notifies that person only if they can read the channel.
Groups over the API: creating one, renaming it, the roster and its roles, handing it on, and moving a channel between owners.
Notifications over the API: listing them with the unread count, marking one or all read, and turning email on or off per kind.
Invite codes can be minted, listed against the allowance, and revoked. API tokens can be listed and revoked, and the one making the request is marked. Minting a token over a token is deliberately not possible: revoking one that has already made others does not take it back.
Administration over the API, for self-hosters: the user list, banning, granting admin, per-user and instance-wide limits, and removing a block or channel as moderation. Not-an-admin reads as not-found, and mail credentials come back redacted.
Blocks that are files. A PDF, a video, or an image from your own machine can be added over the API by posting multipart, or by naming a URL for the server to fetch, which is how MCP adds them.
Changed
A url added over the API or MCP becomes the same block a link pasted into the browser does. A GitHub repo, a tweet, a YouTube video or channel, a Spotify item, an Instagram post and a direct image each ingest as their own type with their details fetched; anything else stays a plain link with a screenshot. The detection had lived in the web app alone, so the same link landed as a rich card or a bare one depending on who added it. Clients reading the returned type should expect it often not to be url; pass detect: false for the old behaviour.
Handles moved to a new owner table, which is what a channel now belongs to. Nothing changes for anyone using Colosseum; self-hosters get a migration that rewrites channel ownership, as the groundwork for channels that belong to a group rather than a person. It refuses to run, leaving the database untouched, if any channel is owned by an account that never finished onboarding and so has no handle — it prints how many and what to do about them.
The design system is the one DESIGN.md describes: one type scale, one destructive red, one panel recipe, one loading vocabulary, and motion on a token scale rather than improvised per component. Text surfaces cap their measure, headings scale with their container, and the board has real empty states.
Profile channel grids page instead of sending everything at once, and the command palette holds its size while you type.
Fixed
Explore no longer loses blocks. Two separate faults: a cursor read off a millisecond-precision Date skipped anything written inside the boundary millisecond, and rows sharing an instant exactly had no tie-break, so the feed either dropped them or repeated them and ordered them differently between requests. The feed now pages on a total order of time, kind and id.
A banned account's API tokens stop working. A ban took the browser away and left every token the account held fully working — reading, writing, commenting, minting invite codes into an invite-gated instance.
The add-block drawer stays above the iOS keyboard. It was sized in dvh, which follows the browser's own chrome but not the software keyboard, so the sheet kept its full height with the field being typed into underneath the keyboard.
A block card is a group holding an Open control and a drag grip, rather than a button holding another button. The grip also takes a visible focus ring and a full-size touch target, being the only way to move a block by hand.
A one-line text block no longer sits in the corner of a near-viewport surface: the block modal holds text to its measure and centres it.
Save failures are reported rather than swallowed, the unread notification count and its filter are the real numbers, and banning, granting admin and revoking a token or an invite all ask first.
Mobile navigation reaches a full-size touch target, shows which tab you are on, and carries notifications.
1.12.7
2026-09-15
Fixed
Explore no longer loses blocks written inside the same millisecond as a page boundary. The feed's cursor came off a JS Date, which holds milliseconds, while created_at in Postgres holds microseconds — so a page ending at T.123456 asked the next one for rows older than T.123, and anything written between the two belonged to neither page and showed up nowhere. A bulk upload was enough to hit it, and nothing surfaced the loss to the reader. The feed now reads its timestamps at full precision and compares the cursor without rounding it.
1.12.6
2026-09-15
Fixed
A long tweet in the block modal no longer shows a scroll bar beside it. The tweet needs a scroll box of its own, because the panel centers it and the modal's outer scroll can't reach content that overflows above the center line; that box kept the browser's bar while the modal's other scrolling surfaces hide theirs. It still scrolls by wheel and touch.
1.12.5
2026-09-14
Fixed
Explore shows a long burst of adds as one collage. The feed groups an uninterrupted run of adds by one person to one channel, but it did the grouping a page at a time, so a run of more than 24 was cut where the page ended and came out as two collages in a row. A page now reads on until the run it ends on is finished, and hands the next page a cursor past it.
1.12.4
2026-09-10
Fixed
Links added over MCP get a preview screenshot. create_block saved the block and stopped there, so a link added by an agent stayed a bare url while the same link through the REST API or the web app got a picture within seconds. update_block had the same gap when it changed a block's url.
MCP block results carry the preview field the REST API already returned, so a client can tell a capture still in flight from one that failed, and see the screenshot once it lands.
1.12.3
2026-09-05
Fixed
Sharing a channel shows what's in it. The card looked only for an image block and fell back to the Colosseum card when it found none, so a channel built out of links — which is most of them — never showed its own contents. It now uses the newest picture among the channel's recent blocks, including the captured screenshot on a link.
1.12.2
2026-09-05
Fixed
A shared Colosseum link no longer previews as the Next.js starter template. The fallback share image had been the one the project was scaffolded with, so any link without a picture of its own — a channel of links, a profile, the home page — unfurled with someone else's branding in Slack, Discord and iMessage.
1.12.1
2026-09-04
Fixed
The installed app no longer zooms. 1.12.0 lifted the zoom cap, which left the PWA pinching and panning under the thumb like a web page in an app frame. The cap is back, on iOS as well as Android.
The channel pickers' search field is 16px like every other field, so focusing it can't make the page jump on iOS.
1.12.0
2026-09-04
Added
Blocks can be arranged by hand. Drag a card by its grip, or lift it with the keyboard — space, then the arrow keys — and a channel's order stops being just the order things were added. Channel owners only, and not while a filter or search is narrowing the board.
Email addresses are confirmed, and you can change the one on your account from settings. A typo at sign-up used to be permanent: the only way back into the account was an address you didn't own.
Notifications can be read one at a time. Opening one marks it read, so the unread count means something and clearing it no longer costs you the ones you were keeping. "Mark all read" is still there.
The invite graph can be searched by handle, and names its members on tap and on keyboard focus rather than only on hover — the page used to tell touch users to hover.
Explore has an ending. A marker at the bottom, and a retry when a page fails to load, where before a failure looked exactly like reaching the end.
Changed
Pinch-zoom works again, everywhere, including on iOS where it had been deliberately overridden.
Controls reach a full-size touch target on phones — the tab bar, the notification bell, the buttons in dialogs, the tag editor — without changing how dense things are on a desktop.
Banning someone, granting admin, revoking an API token and revoking an invite all ask first. Each names what it's about to act on.
The bottom tab bar has labels, shows which tab you're on, spreads its tabs across the full width, and carries notifications.
Deleting, revoking and leaving are legible in dark mode. The red they were drawn in sat at 1.98:1 against the background.
The "Links" filter matches every kind of link — YouTube, Spotify, GitHub, tweets, Instagram — instead of only plain ones. A channel of videos filtered to Links used to come back empty.
The command palette holds its size while you type, and a command you've named outranks a block that happens to contain the word. Typing "settings" and pressing enter goes to settings.
Profiles load a page of channels at a time, so a large collection stops sending everything at once. Search and sorting still cover all of it.
The search dropdown groups its results into people, channels and columns, the way the command palette already did.
Developers and Changelog moved out of the account menu into a footer, where someone who hasn't signed up can find them.
A card keeps its title when you hover it. The title used to be replaced by the date.
Fixed
"Saved." now appears only when the save landed. A title or description edit that failed reported success, closed, and was gone on reload.
The unread count is the real number rather than however many notifications had loaded, and the Unread filter pages through all of them instead of stopping at 30.
The invite meter counts what it says it counts. Creating five codes read as "5 of 5 invites used" before anyone had accepted one.
Onboarding no longer shows a navigation bar whose every link sends you back to onboarding.
An expired password-reset link says so before you choose a new password, not after, and a successful reset lands on sign-in with a confirmation instead of on the signed-out home page.
Signing in returns you to the page you were trying to reach.
The rules for a handle are on screen while you type it, and availability is checked as you go rather than one submit at a time.
The arrow keys keep moving past the fiftieth block, and a block opened from a shared link can be browsed from where it sits.
Files can be dropped anywhere on a channel, in both grid and list view, and dragging over it shows where they'll land.
On a phone, return adds a newline instead of posting the block.
Adding a plain link confirms it, the way adding a video or a track already did. Uploading several files reports how many arrived.
Admin settings say when they've saved, and the global limits have their own save button rather than sharing one with the email settings.
Loading placeholders match the pages they stand in for, so profiles and channels stop jolting as they finish loading.
Play badges appear only where the card actually plays something.
Password managers can save and fill credentials, and passwords can be revealed while typing.
The browser's chrome follows the app's theme in dark mode, along with scrollbars, dropdown menus and autofilled fields.
1.11.3
2026-08-23
Fixed
An Instagram link Instagram refuses to serve now becomes an Instagram block carrying its handle and a link through to the post or profile, instead of a link block with a permanently empty preview. Adding one no longer warns that a screenshot couldn't be captured — there was never one to capture.
A link block with no screenshot — a site that blocks capture, a dead link — shows the site's address under a globe rather than an empty bordered strip, in the grid and on the block itself.
1.11.2
2026-08-23
Fixed
An Instagram link that can't be read — Instagram rate-limits the server it's fetched from — falls back to a link block carrying the handle, instead of a card with nothing on it at all.
1.11.1
2026-08-23
Fixed
When a pasted Instagram link comes back as a plain link block instead of a card, the reason is now recorded in the logs — Instagram rate-limiting the server it's fetched from, a timeout, or a page with no preview picture — rather than failing silently.
1.11.0
2026-08-23
Added
Instagram blocks!
Consecutive blocks to the same channel now group in explore feed.
Performance improvements.
1.10.5
2026-08-22
Fixed
The loading animation shown while an image uploads is the same size as the one a link shows while its preview is captured. The upload one was drawn at twice the scale.
1.10.4
2026-08-20
Fixed
Shared links show their preview card again. Cards pointed their image at localhost instead of the site's own address, so Slack, Discord, iMessage, and X had nothing they could load. Set BETTER_AUTH_URL to your public address — the same value you already need for sign-in to work behind a domain.
1.10.3
2026-08-20
Fixed
Spotify blocks no longer show white corners around the player. Spotify rounds its own player and paints white behind the corners, which showed through as four white wedges against a dark background.
1.10.2
2026-08-19
Fixed
A link added from the quick-add drawer becomes the same kind of block as one pasted into the channel, so a GitHub, YouTube, Spotify, or tweet link added that way stops arriving as a plain link with a screenshot.
1.10.1
2026-08-19
Changed
Release notes are written for the people using Colosseum rather than listing pull requests, and the changelog page no longer shows stray formatting marks.
1.10.0
2026-08-19
Added
GitHub repos and profiles get their own block. Paste a link to one and you get a card with its avatar, name, description, and the repo's main language, instead of a screenshot of a page that's mostly navigation.
YouTube channels get their own block too, showing the channel's avatar, name, and description.
Sharing a block now lands people on the channel with that block open, so closing it leaves them somewhere to browse. Back and forward move between the block and the channel.
Both channel pickers offer "New channel…", so wanting a fresh channel no longer means abandoning what you were in the middle of.
Block links unfurl properly in Slack, iMessage, Discord, and X — the card shows the block you shared rather than the generic Colosseum one.
Notifications say what they're about, and a burst of activity on one block arrives as a single notification instead of one per event.
A link block's modal has a button to copy its URL.
The MCP integration can move a block from one channel to another.
Changed
Channels open faster and stay smooth as you scroll, most noticeably on large boards. Images load as they come into view, cards far off screen let their media go, and videos show a still frame that's ready in advance.
Opening a block is immediate. The picture you clicked shows straight away while the full-size version arrives behind it, and stepping between blocks with the arrow keys lands on something already loaded.
Coming back to a channel reuses what your browser already has, so pages you have visited before load with far less waiting.
Search keeps up with your typing.
The GitHub and YouTube cards share one look, so a channel holding both reads as one thing.
Fixed
Searching for a block puts the closest match first. A block named for what you searched could land below one that only mentioned it in passing, and repeating the same search could return a different set of results.
Toasts no longer appear underneath the bar at the bottom of the screen on mobile.
For self-hosters
Upgrades now apply their own data fixes on boot, tracked the same way schema migrations are, so there's no checklist to follow after updating and skipping releases is safe. The backfill-thumbnails and backfill-video-posters commands are gone; bun run data:migrate runs the set. See Upgrading in the README.
GitHub blocks read GitHub's public API. Setting GITHUB_TOKEN (no scopes needed) raises the request limit; without one, a link that gets rate-limited falls back to a plain link block.
1.9.3
2026-08-19
Fixed
Channel search now puts name matches first, then tag matches, then channels that only mention the term in their description. Searching "design" led with whichever channel the database happened to return first, so a channel named Design could sit below one whose description mentioned design in passing. Results with the same rank are ordered newest first, which also makes the ten-result cap return a consistent ten.
1.9.2
2026-08-15
Fixed
A link straight to an image file (https://example.com/cat.gif) now becomes an image block instead of a link block. It used to be screenshotted, which captured the browser's bare image viewer and froze a GIF on its first frame. The image is fetched and stored like any other upload, so it's thumbnailed and animates; a URL that turns out not to be a usable image still falls back to a link block with its screenshot.
1.9.1
2026-08-15
Fixed
Clicking a block in the Explore feed now opens its channel under the channel's owner. When a member added a block to someone else's channel, the feed linked the channel under the member instead, so the URL and the breadcrumbs named the wrong user. The feed still attributes the block to whoever added it.
1.9.0
2026-07-26
Added
Redis caching layer for hot, stable read queries — channel metadata (getChannel) and the per-user channel lists (getUserChannels, getUserPublicChannels). The Docker stack bundles a redis service and caching is **on by default**; it's best-effort, so Redis failures fall back to Postgres and can never take the app down. Channel create/update/delete invalidate the affected keys, with a TTL backstop. Turn it off with REDIS_CACHE_ENABLED=false, or point REDIS_URL at an external Redis.
Open-source community health files: MIT LICENSE, CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md, and GitHub issue/PR templates. The README gained a project overview plus Contributing and License sections, and package.json now carries license, description, and repository metadata.
Changed
Notifications now say what they are about. A comment or mention names the block and its channel and quotes the first 140 characters of the comment, with the block's thumbnail in the row; the email subject names the block instead of repeating the body. Rows recorded before this shipped have no comment to quote and keep their old one-line text.
A burst of activity on one block is emailed once. A notification is skipped when the same recipient was already emailed about the same block within 15 minutes; in-app notifications, the unread badge, and the per-type email toggles are unaffected.
Image blocks now start loading their full-size image while the pointer rests on the card, so opening one shows the whole image at once instead of painting it in top-to-bottom. Applies to the channel grid, the list view, and the Explore feed; a pointer merely crossing a card doesn't trigger a fetch, and nothing is prefetched on a data-saver connection.
Private media is now cacheable by the viewer's own browser, so blocks in private channels get that same instant open (and their grid thumbnails stop re-downloading). It is served private, no-cache with the blob's hash as an ETag: the browser may keep a copy but must revalidate before every reuse, so each one still re-runs the channel-access check. A viewer who has lost access, or a different account on the same browser, revalidates into a 404 rather than a cache hit. Public media is unchanged.
Search stops querying Postgres on every keystroke. The nav box, the mobile drawer, and the command palette now share one 150ms debounce (they used 300ms, 50ms, and none), skip queries shorter than three characters, and answer a repeated or backspaced-to query from results already fetched. A nine-character search was 27 queries and is now three. Results stay on screen while the next search runs, so the list no longer empties and refills.
A shared block link now previews as the block. Pasting one into Slack, iMessage, Discord, or X shows the block's own image, its title, and its description instead of the same generic Colosseum card every block used to get. Image blocks share their picture, URL blocks their captured preview, and YouTube blocks the video thumbnail; anything with no picture of its own keeps the site card. Shared channels now carry a picture from inside the channel. Nothing changes for a private channel — its blocks unfurl as they always did, giving away neither title nor image.
Profile search reads from an index. user_profile.handle and about gained trigram GIN indexes, matching what channel and column search already had; before this every palette keystroke and every @-mention character scanned the whole profile table.
Fixed
A "connected to your channel" notification now opens the channel your channel was added to, rather than your own channel — where nothing had changed. The message names both channels. Existing notifications are migrated; any whose column has since been deleted keep their old wording and link. Adding a channel to a **private** channel no longer notifies its owner at all — what someone collects privately is their own business, and the recipient could not open it to look anyway.
Toasts no longer land on top of the mobile bottom bar. They now clear it by the same margin they keep from the bottom of the screen everywhere else, including between 600px and 640px, where the toast library switches to its desktop spacing while the bar is still on screen. Where the bar isn't there at all — the landing and auth pages, and any signed-out or not-yet-onboarded viewer — toasts sit at the usual distance instead of floating above nothing.
Fixed
The mobile add-block sheet no longer opens cut off. After the keyboard had been used on the first step, picking a channel showed a sliver of the list instead of the whole picker, and stayed that way until the page was reloaded. The sheet now keeps one height across both steps.
1.8.3
2026-07-24
Fixed
Tweet blocks now sit properly inside their card. The embed no longer draws its own border, corner radius, and background over the block's — the mismatched radii read as a box inside a box — and a tweet shorter than the card is centered instead of hugging the top. Taller tweets still start at the top and clip at the bottom, so the author and the opening line stay visible.
1.8.2
2026-07-24
Fixed
Self-hosting: the app service in compose.yaml now passes through the documented S3/CDN vars (S3_BUCKET, S3_REGION, S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY, S3_ENDPOINT, CDN_URL) and the runtime toggles (DISABLE_SIGNUPS, API_RATE_LIMIT, API_RATE_WINDOW_MS). Setting them in the compose .env previously had no effect because they never reached the container; unset, behavior is unchanged.
1.8.1
2026-07-22
Fixed
The Cmd/Ctrl+K command palette now highlights the first result again, so pressing Enter opens the top match immediately. With manual filtering the palette had stopped auto-selecting the first item, forcing an arrow-down before Enter would do anything.
1.8.0
2026-07-19
Added
YouTube blocks: paste a YouTube URL (watch, youtu.be, Shorts, or embed form) to add a video block. Grid cards show the video thumbnail; the modal and block page embed the live player. The block's title is set to the video's title. Nothing else is persisted — the embed renders from YouTube, so the block reflects the live video.
Spotify blocks: paste an open.spotify.com URL (track, album, playlist, artist, episode, or show) to add a block. Grid cards show the cover art; the modal and block page embed the live Spotify player. The block's title and cover art come from Spotify; nothing else is persisted, so the block reflects the live item.
Profile channel lists can now be sorted (recently added to, name, or column count) and filtered by access (public / open / private) and — on your own profile — whether you're a member of the channel.
Outbound email, configured at runtime from the admin panel (Off / Resend / SMTP) with a "Send test" button. Password-reset mail routes through it, and transactional emails share a branded template.
In-app notifications for comments, @mentions, channel connects, and channel membership, with a nav-bar bell and unread badge. Each type has an instant-save per-type email toggle in settings; notification delivery is best-effort and never blocks the action that triggered it.
1.7.5
2026-07-19
Fixed
Viewing a profile whose channel previews include a tweet no longer triggers a hydration error. Each channel card wrapped its previews in a <Link> (<a>), and a tweet preview renders its own avatar/header <a> inside — nesting them is invalid HTML. The card link is now a "stretched link" overlay that sits beside the previews rather than around them.
1.7.4
2026-07-19
Fixed
Opening a tweet block from the Explore feed no longer triggers a hydration error. The feed wrapped each block's card in a <button>, and a tweet card renders its own "Copy link" <button> inside — nesting them is invalid HTML. The feed trigger is now a role="button" element, matching the channel grid.
1.7.3
2026-07-19
Fixed
Tweet embed images (including the author's avatar) now load on proxied/HTTPS deployments. Their URLs were made absolute using the server's request origin, which behind a TLS-terminating proxy became http:// and got blocked as mixed content; they are now resolved against the browser's origin.
1.7.2
2026-07-18
Fixed
Members of a private channel can now see the channel's images. Previously only the channel owner could load them — every image 404'd for members even though they could read the channel.
1.7.1
2026-07-18
Fixed
Channel-connection columns now open the block modal like any other column, so a connection can be deleted and its details viewed. Previously they navigated straight to the linked channel with no way to remove them, and stepping onto one via the side navigation showed an empty modal.
1.7.0
2026-07-18
Added
An admin area for managing the instance.
Video files can now be uploaded as blocks and play inline.
A column can be copied into another channel.
Profile pages list the channels a person is a member of.
Adding a member to a channel now searches users by name or handle.
Members can see blocks from private channels they belong to in the Explore feed.
Deleting a column now asks for confirmation first.
The /users page shows an invite network graph of who invited whom.
Blob storage is now pluggable, with an S3/CDN backend option alongside local disk.
Tweets can be embedded as blocks that keep rendering even after the source tweet is deleted.
Changed
The REST API is now rate limited per token owner.
1.6.1
2026-07-16
Fixed
Untitled blocks (such as images) no longer shift the channel grid when hovered — the title line now reserves its height instead of collapsing.
1.6.0
2026-07-12
Added
Channels can be shared with invite links that let people join directly.
A gradient "matrix" loading spinner now appears on the Explore feed and when loading more blocks on a channel.
The block modal shows who created a block, and channel cards show column titles.
Member avatars now appear on profile pages.
Changed
Grid and list views are now a single sliding toggle.
The add-column flow is reachable from the top navigation.
Fixed
Channels with more than 50 blocks now paginate correctly instead of loading every block at once.
Fixed a hydration error in the channel loading skeleton.
1.5.4
2026-07-11
Fixed
The mobile add-column drawer now opens to a consistent taller height, so the channel picker has room to scroll — previously it stayed stuck at the first step's shorter height.
1.5.3
2026-07-11
Fixed
The markdown text-block editor in the block modal now opens in Preview (rendered) mode and fills the panel height so it lines up with the sidebar.
The command palette (Cmd/Ctrl+K) searches instantly on each keystroke instead of waiting for a short delay.
The Explore feed now shows a block's title beneath its card when it has one.
The mobile add-column drawer's channel picker opens taller and has a search box to filter channels when the list is long.
1.5.2
2026-07-11
Fixed
Image blocks created through the API (REST and MCP) are now fetched and stored like uploaded images — so they're compressed, thumbnailed, and served from Colosseum — instead of keeping a link to a third-party host that bypassed the grid's image compression.
1.5.1
2026-07-11
Fixed
Fixed a build failure that stopped the 1.5.0 release from deploying: markdown in text blocks is now sanitized with a pure-JS sanitizer that bundles for production, instead of one that pulled in an unbundleable dependency.
1.5.0
2026-07-11
Added
Text blocks are now Markdown: rendered when viewed, with a GitHub-style Write/Preview editor while editing. Dropping a .md file onto a channel creates one.
PDF files are now a block type — drop or upload a PDF and it opens in an in-app viewer.
The Explore feed now shows each member's avatar next to their handle.
Changed
Channel pages load with fewer, parallelized database queries.
Profile pages fetch channel previews and counts in batched queries instead of one per channel.
Channel and block search is backed by trigram and tag (GIN) indexes.
1.4.5
2026-07-10
Fixed
The block permalink side panel now has a bordered card around its metadata, matching the block modal.
A URL block's preview is now centered in the permalink page's main column instead of hugging the left edge.
1.4.4
2026-07-10
Added
The block permalink page now shows the block's comments, matching the block modal.
Fixed
On a URL block's permalink page, the site link and its screenshot are now a single clickable preview that opens the link, sized to match the modal instead of stretching across the page.
The block permalink page now fits the viewport like the modal — the page no longer scrolls; the screenshot and comments scroll within their own panels.
1.4.3
2026-07-10
Fixed
Text blocks in the block modal now size to their content instead of a fixed half-viewport-tall box with a large empty expanse below short text.
1.4.2
2026-07-10
Fixed
Signed-in users can now post comments on blocks opened from the Explore feed, not just read them.
1.4.1
2026-07-09
Fixed
The profile and Explore pages now scroll beneath the translucent nav bar like every other page, instead of within their own inner scroll area.
1.4.0
2026-07-09
Added
Comments: leave comments on individual blocks.
Channel access modes — public, open (any signed-in user can add blocks), and private — with per-channel membership.
An in-app developer documentation page.
A UI motion and materials pass: press feedback when opening a block, translucent (frosted) nav bars, and support for the system reduced-motion, reduced-transparency, and increased-contrast preferences.
Changed
Channel pages load noticeably faster — the first page of blocks is server-rendered, image thumbnails are pre-generated at upload, per-request reads are deduplicated, prepared statements are enabled, and foreign-key columns are indexed.
1.3.3
2026-07-09
Fixed
Deleting a URL block — or a whole channel — now removes its cached page screenshot instead of retaining it forever, fixing a storage leak.
A channel column no longer shows a linked channel's title, description, or item count after that channel is made private (unless you own it).
1.3.2
2026-07-08
Fixed
Copy that called a column a "block" (toasts, dialog titles, labels, placeholders) now consistently says "column".
1.3.1
2026-07-08
Fixed
Pasting a GIF copied from a web browser now keeps it animated, instead of saving a still frame.
1.3.0
2026-07-08
Added
Animated GIFs: GIF blocks now animate everywhere, including grid thumbnails (profile pictures already animated).
A link to your own profile in the nav avatar menu.
Changed
Global search now spans every public profile, channel, and block across Colosseum, not just your own.
1.2.1
2026-07-08
Fixed
Signed-out visitors can now view the Explore page instead of being redirected to the landing page.
URL blocks whose screenshot can't be captured now show the link's address instead of loading forever, and settle immediately rather than retrying for minutes.
1.2.0
2026-07-07
Added
An Explore page (/explore, where signed-in users land from /) with a feed of recent public activity — new blocks, channels, and members — from across the invite-connected network.
A search box on the profile page to filter channels by title or description, in both grid and list views.
Rich link previews (Open Graph / Twitter card) for shared public channel URLs, showing the channel name, description, and owner.
Move a block to a different channel from the block modal, keeping its title, description, and tags.
Add a public channel as a column inside one of your own channels (Are.na-style nesting); the column links straight to that channel.
Changed
Image column previews load faster: the grid serves generated thumbnails instead of the full-resolution image.
1.1.2
2026-07-07
Fixed
Buttons and other interactive controls now show a pointer cursor, so they read as clickable.
1.1.1
2026-07-06
Fixed
The changelog page no longer crashes in production: CHANGELOG.md is now shipped in the Docker image instead of being excluded by .dockerignore.
1.1.0
2026-07-05
Added
A command palette (Cmd/Ctrl+K) for quick navigation, search, theme switching, and logout.
Installable iOS PWA: a web manifest, home-screen icons, and an offline service worker.
A mobile bottom navigation bar with a "+" flow to add a block, then pick its channel.
A list-view toggle for the channels on a profile, alongside the existing grid.
Pasting images and capturing multiple files into blocks in one go.
An in-app changelog page rendered from this file.
Instant navigation: profile, channel, and block routes stream a loading shell on click.
Accounts created from an invite link are attributed to the inviter.
Changed
Rebuilt the screenshot engine: faster and stealthier, with an og:image fallback.
Channels are ordered by their most recently added block.
The channel grid is two columns on mobile.
Fixed
Mobile drawers size with dvh, so the keyboard no longer shifts the layout in the installed PWA.
The browser favicon shows the logo again instead of a stale icon.
Removed a stray focus outline on the command palette input.
The block modal keeps a constant size and the mobile bottom bar stays fixed.
Long channel descriptions truncate on the profile card, and wrapped titles are centered.
Dark-mode braille previews render correctly.
iOS no longer zooms when focusing the block input, and pinch/double-tap zoom is disabled for an app-like feel.
Larger image uploads no longer hit the server action body limit.
puppeteer-extra is kept out of the webpack bundle, fixing a build failure.
1.0.3
2026-07-04
Fixed
Screenshot thumbnails are resized to a square instead of cropping a fixed-offset region, so previews are no longer clipped.
1.0.2
2026-07-04
Changed
Added prefixed, contextual server-side logging across the API surface.
Fixed
The screenshot poll loop no longer cancels its own retry timer.
A page is still captured when networkidle2 times out, instead of failing.
1.0.1
2026-07-03
Added
URL block previews are captured via the REST API.
Fixed
URL blocks poll for their preview instead of assuming it's missing.
A permanently failed screenshot capture is now signalled instead of failing silently.
1.0.0
2026-07-03
Initial public release.
Added
Channels and blocks with a grid/list view toggle on the channel page.
Tags on channels and blocks.
A real logo mark for the nav, home, and favicon.
Block modal with navigation, a growing description, and a hidden scrollbar.
Public/private media layer with visibility tracked on the reference.
Docker Compose packaging with a migrate-on-boot entrypoint.
Changed
Data access ported to Drizzle with authorization enforced in app code.
Supabase Auth replaced with in-process Better Auth.
Supabase Storage replaced with content-addressed local-disk storage.