Hello pals, here's the first release candidate for version 0.22.0 of GoToSocial.
Please read the migration notes carefully for instructions on how to upgrade to this version, in particular note that there are several config file changes that need to be addressed when you're updating from a previous version of GoToSocial to this version.
⚠️⚠️⚠️ This release contains a long-ass database migration to move status boolean columns (like pinned, local, etc) to a single bitfield column. This saves a lot of space in the database, but it also means on startup the migration has to iterate through all statuses in your database and set the new field. Please be patient and don't interrupt this process! ⚠️⚠️⚠️
@Postgres users: Following the migration, if you encounter slowdown on Postgres specifically (ie., timing out while loading home timeline) you may need to regenerate your Postgres visibility map. Please check our Postgres database maintenance documentation for steps on how to do this using the psql tool.
Release highlights
- Relay support: GoToSocial now supports subscribing to relays (as an admin action), and pushing posts to relays (configured per-user, with filters available).
Documentation for admin-level relay subscriptions.
Documentation for user-level relays pushes. - Automated cleanup of old remote posts: you can now configure your instance to clean up threads of remote statuses that haven't been interacted with by anyone on your instance. This should save a lot of space in folks' databases!
Documentation for post caching + pruning. - Delivery error tracking for remote instances: there's now a page in the settings panel where admin can view errors encountered while attempting delivery of posts to instances that may be experiencing technical difficulties or may have gone offline. You can use this to get a quick view on possible "dead" instances that you can then remove from your database with a domain block.
- Accounts directory: there's a new setting to allow admins to expose (or not) a directory of accounts on the instance! Your account will only be shown in the directory if you opt in via your privacy settings.
Documentation for inclusion in account directory. - Better tracking of deleted statuses/status tombstones: GtS now stores tombstones for deleted statuses, allowing threads to remain intact even when a status in the middle of the thread has been deleted.
- Better status codes + info pages on deleted or hidden statuses: the old 404 page when you try to open a hidden status in the browser has been replaced with a more informative error page.
- Way more configurable http server + client options: we've exposed a whole shitload of settings that you can tweak on the HTTP client + HTTP server that GoToSocial uses. We don't recommend changing these, but if you really want to, now you can.
- Show your Träwelling status on your profile by setting your Träwelling page as a field value, similar to how our ListenBrainz integration already works.
- Allow setting a name for your tokens, and sorting tokens by last used time in the token view of the settings page. Should make it a lot easier to track which tokens you've created, and when they were used by which apps!
- Better layout for web view of profiles that hide all posts from the web: it just uses a single-column view now.
Migration notes
Upgrading
To upgrade to v0.22.0-rc1 from a previous release:
Binary/tar
- Stop GoToSocial.
- Back up your database! If you're running on SQLite, this is as simple as copying your
sqlite.dbfile, eg.,cp sqlite.db sqlite.db.backup. On Postgres you can do this with pg_dump. - Download and untar the new release, including the web assets and html templates, not just the binary.
- Edit your config.yaml file if necessary (see below).
- Start GoToSocial.
- Wait patiently for any migrations to run, do not interrupt migrations or you could leave your db in a broken state and will have to restore from backup!
- Enjoy your updated instance.
Docker
- Stop GoToSocial.
- Back up your database! If you're running on SQLite, this is as simple as copying your
sqlite.dbfile, eg.,cp sqlite.db sqlite.db.backup. On Postgres you can do this with pg_dump. - Pull the new docker container with
docker pull docker.io/superseriousbusiness/gotosocial:0.22.0-rc1ordocker pull docker.io/superseriousbusiness/gotosocial:latestif this is a stable release and not a release candidate. - Edit your config.yaml file or environment variables if necessary (see below).
- Start GoToSocial.
- Wait patiently for any migrations to run, do not interrupt migrations or you could leave your db in a broken state and will have to restore from backup!
- Enjoy your updated instance.
config.yaml
The configuration file has changed since the previous release; you will need to update at least the config options that were removed + replaced (see below).
- Removed
instance-subscriptions-process-fromandinstance-subscriptions-process-every, replaced them withinstance-subscriptions-process-cronwith a default value of0 23 * * *(every night @ 11pm). - Removed
media-cleanup-fromandmedia-cleanup-every, replaced them withmedia-cleanup-cronwith a default value of0 0 * * *(every night @ midnight). - Removed
media-remote-cache-days, replaced withmedia-remote-cache-durationwith a default value of7 days. - Added
instance-directory-modeset towebonlyby default. - Added
instance-robots-allow-indexingset tofalseby default. - Added
storage-s3-region. - Added
statuses-cleanup-cronwith a default value of0 1 * * 0, ie., at 1am every Sunday. - Added
statuses-cleanup-remote-older-thanwith a default value of0(don't cleanup statuses). - Added
smtp-from-display-name, allowing you to customize the display name used by sent admin emails. - Updated
http-client.timeoutdefault from30sto1mwhich was already used internally. - Added many more (commented out) http client options.
- Added many (commented out) http server options.
You can see a diff of the config file here: https://codeberg.org/superseriousbusiness/gotosocial/compare/v0.21.2...v0.22.0-rc1#diff-c071e03510b2c57e193a44503fd9528a785f0f411497cc75841a9f8d0b1ac622
Database Migrations
⚠️⚠️⚠️ This release contains a long-ass database migration to move status boolean columns (like pinned, local, etc) to a single bitfield column. This saves a lot of space in the database, but it also means on startup the migration has to iterate through all statuses in your database and set the new field. Please be patient and don't interrupt this process! ⚠️⚠️⚠️
@Postgres users: Following the migration, if you encounter slowdown on Postgres specifically (ie., timing out while loading home timeline) you may need to regenerate your Postgres visibility map. Please check our Postgres database maintenance documentation for steps on how to do this using the psql tool.
Which release archive/container should I use?
GoToSocial releases binary builds for 64-bit Linux, FreeBSD, and NetBSD operating systems. We also release Docker builds for 64-bit Linux.
| OS | Architecture | Support level | Binary archive | Docker |
|---|---|---|---|---|
| Linux | x86-64/AMD64 (64-bit) | 🟢 Full | linux_amd64.tar.gz | docker.io/superseriousbusiness/gotosocial:0.22.0-rc1
|
| Linux | Armv8/ARM64 (64-bit) | 🟢 Full | linux_arm64.tar.gz | docker.io/superseriousbusiness/gotosocial:0.22.0-rc1
|
| FreeBSD | x86-64/AMD64 (64-bit) | 🟢 Full | freebsd_amd64.tar.gz | Not provided |
| FreeBSD | Armv8/ARM64 (64-bit) | 🟢 Full | freebsd_arm64.tar.gz | Not provided |
| NetBSD | x86-64/AMD64 (64-bit) | 🟢 Full | netbsd_amd64.tar.gz | Not provided |
| NetBSD | Armv8/ARM64 (64-bit) | 🟢 Full | netbsd_arm64.tar.gz | Not provided |
nowasm
For your convenience, we also provide UNSUPPORTED, EXPERIMENTAL BUILDS, created using the nowasm tag, in the downloads list below. There is no Docker build for nowasm.
GoToSocial releases built with nowasm use the Go-native, modernc version of SQLite instead of the WASM one, and will use on-system ffmpeg and ffprobe binaries for media processing.
Using a nowasm build is currently the only way to run GoToSocial on a 32-bit system.
For more information on running a nowasm build, see the nowasm documentation page.
Changelog
Features and performance
- 3fe273cbd9d92f7ef4cab6d81a2a57fb081c5ef0: [feature] Show explanation when user shows no posts on the web (#4846) (@kipvandenbos)
- a77b44caec869a723456c16707f982db9235e711: [feature] better error pages + handling for hidden or gone statuses (#4840) (@kipvandenbos)
- cc3af19e788e64c0f6c0d21085645d251a7e7cc4: [feature] Allow sorting access tokens by last_used, allow setting name per access token (#4833) (@kipvandenbos)
- b765e749bee6ca65e1b123f7fcaacb7d5893f433: [feature] Forward outgoing creates, updates, and deletes to relay pushes (#4820) (@kipvandenbos)
- bae8f079f0da820698d92e374265a796f41e80d5: [feature] add statuses multi GET endpoint (#4814) (@gruf)
- 126959d7f3bd06107c2251f7c28dc559fb896707: [feature/frontend] Add
data-name="{{- .Name -}}"to fields to allow for per-field styling (#4827) (@kipvandenbos) - a2266f281859f6714202fcf42d34c1d045a67aba: [feature] add cleanup of old remote status threads (#4808) (@gruf)
- 12e6d0c76b5ef690b7bcc759c46b6f930c6ff3af: [feature] Dereference + store statuses delivered by a followed relay actor (#4810) (@kipvandenbos)
- 603c8497402c61bf3db7462fc1b9c3ed5fe2ede6: [feature] Add button to clear instance delivery errors (#4818) (@kipvandenbos)
- 4e2589bc3ce283a33cae3a9adf1cbfb81f93beaa: [feature] make almost every http.Client{} and http.Server{} option configurable (#4730) (@gruf)
- 77059b4e8a6916c345644da5e812ae34a7f120e2: [feature] add sqlite cli commands (#4726) (@gruf)
- f4bf4aa061d8214e3ac820184f29ef3ab8d2c737: [performance] add configurables for timeline cache lengths (#4807) (@gruf)
- 39ad5099682ff4c5ee2afc03127117085928f3db: [feature] Add db functions, api endpoints, and settings panel sections for relay subscriptions + pushes (#4796) (@kipvandenbos)
- 0496504231cb1c37517aaa935858bc64692e92fe: [feature] Add storage-s3-region config option (#4788) (@Misofist)
- 85050eec411b584828529e4915a488913bbac479: [feature] Serve instance actor AP representation without auth (#4798) (@kipvandenbos)
- cc1316b498e78cbc8a4d50732f855cddf55d4dc9: [feature] Store delivery errors, add remote instances overview to view stored errors (#4741) (@kipvandenbos)
- 40fff696ba5aed940c8d7ffa3962b063c12a3d29: [feature] Add config option
smtp-from-display-namefor customization of email from address display name (#4769) (@kipvandenbos) - 4e935d03fcab8c78601176f2ac4095bcb6f54e60: [performance] further index fiddling (#4761) (@gruf)
- ef60ffecc823d48824850c77c118c482e4d41b4b: [feature] hook up "log-db-queries" again and when enabled log at TRACE regardless of current "log-level" (#4764) (@gruf)
- 9972836d289efe823c450fa18ecb72e69d3e53a7: [performance] use CTE for home timeline query, allows postgres to make use of indices, thanks @cdn0x12 (#4760) (@gruf)
- c40dbf0fb8b201b237f8daae8c345a2be3299041: [performance] don't block on media load on API endpoints to improve latency (#4756) (@gruf)
- 0415d71afc78447750fe8c133c69041cee133cd8: [feature] implement status deletion via stubbing (#4752) (@gruf)
- 7362d55a35588095cd112acf914598755d56012b: [feature] add deleted flag to the statuses table to track tombstones (#4716) (@gruf)
- ea7e3c0cd7faa32bec6727103b3881fdd2c0cdb2: [feature/frontend] add Träwelling status to profile (#4540) (@wolfyjade)
- ec692007777a622f1602612f697b8a1d7f4aef64: [feature] Add instance directory page for accounts that opt-in to discoverability (#4707) (@kipvandenbos)
Bug fixes
- c35d2b7264b3dbb311c47d4767e8a379a57caf17: [bugfix] temporarily removes the sqlite vacuum CLI action, as it seems to fail with i/o issues (#4859) (@gruf)
- f85412164ea32ef56da3f213ff1c9b377c0367fe: [bugfix] nowasm: on context cancel hook, check that process is non-nil before calling Kill() (#4855) (@gruf)
- 4ce10bdb5e022f9f32fdbb0f28da17ca268a9579: [bugfix] Fix error message for account-domain/host validation being the wrong way around (#4851) (@kipvandenbos)
- de2e6a066e03adcd9b33b29c6e1b989c6ae6ebb3: [bugfix] Always return 401 unauthorized when deref of pubkey fails (#4836) (@kipvandenbos)
- 1a0e3fda4174d996687b57be655f96c723ef8c86: [bugfix] fix error format strings (#4835) (@gruf)
- e0bc24aadc2456f88943cc87d16f1aa15afb5985: [bugfix] don't return 500 error on unsupported Announce forwards (#4828) (@kipvandenbos)
- 6a5794e6bb94dbb34f090dff58c305aec68ddf2c: [bugfix] Check error type when dereferencing threads, to avoid spurious error messages (#4824) (@kipvandenbos)
- 8198126b3efaceabea43726d52b4557c9324fa00: [bugfix/frontend] Validate domain name for new domain perms earlier to avoid confusing err messages (#4826) (@kipvandenbos)
- ed6b7375abff0c0f89100dd711b69718adb634df: [bugfix] Ignore extraneous data streams when processing videos (#4819) (@prplecake)
- dd81a521a5c9d8e58229032692480225df4c55ee: [bugfix] Fix logic error on outgoing poll votes (#4813) (@kipvandenbos)
- f20588d77899a2dcca70ab8da98295991af9bb66: [bugfix]: make GET /api/v1/admin/reports match Mastodon admin API (#4778) (@mkljczk)
- a0d235b8573e29748b65ad2a2025c9078f51bd42: [bugfix] numerous media processing bug fixes (#4771) (@gruf)
- beb928196cf81bb751823bef95b222eef9b51c74: [bugfix] Preescape backslashes when doing plaintext parsing (#4770) (@kipvandenbos)
- 80b8faaf2d4eafb87c909bf4a3278427e59198a6: [bugfix] set deleted status placeholder serialization (#4768) (@gruf)
- bc19d7b705ed83bd6c85b22a6c19e0aaef65311c: [bugfix] fix media setting errors on codec unsupported or generic ffmpeg/ffprobe related errors (#4749) (@gruf)
- 085448e30d8eccfe7423f6763bfcbf550ef3f156: [bugfix] Only insert status pins if slice not empty (#4743) (@kipvandenbos)
- ad85f899566401ab917bab08c6001405ef92a0ed: [bugfix] Fix 404 for local audio files with no cover image (#4739) (@kipvandenbos)
- b49939a6a0624966563ccf73f42cf29010caf3c4: [bugfix] Check
replyAuthorizationprop on statuses, fall back to deprecatedapprovedBy(#4732) (@kipvandenbos) - dd7d659129a4d163791d7370489b59470852b58e: [bugfix] catch empty media attachment URLs and set appropriate error text so they get replaced with placeholder text (#4723) (@gruf)
- 10afa7692afa109a0dd108a824ba200dd9643ae0: [bugfix] ensure domain limit status filters get serialized the same as regular status filters (#4722) (@gruf)
- da22ce93b0f8b73da96bb5f842583ff476a29f9d: [bugfix] do not crash on null
media.metaon reports page (#4721) (@mkljczk) - d1f330e9cd2d5d00a23569864420b53a57a4f0b6: [bugfix] Fix missing prometheus go runtime metrics (#4718) (@kipvandenbos)
Chores & version bumps
- ed164e831ecb662f05e4c1c2aa34d977c801a313: [chore] HTTP server/client config stuff (#4861) (@kipvandenbos)
- 19d294ebba6db95c2dd53321228e9fb91835d850: [chore] update dependencies (#4854) (@gruf)
- 06c10bba8305f1cddc4ccbeff4b268293e4e7999: [chore] update dependencies (#4848) (@gruf)
- 8bc9103f018956efd50aada5e765b2b372d8d17b: [chore] Return 202 when we're forwarded an activity originating from a domain we block (#4844) (@kipvandenbos)
- c8f6ef80288ced68e5149e89c51ca56ccdd851cd: [chore] Don't error message when unable to enrich mention because remote is blocked (#4838) (@kipvandenbos)
- 2c9a2c6e2ccb419ceb3c117f41151acc842d0138: [chore] updated dependencies (#4831) (@gruf)
- 7161b5c7db457353f09a41612c4d3be3775c2636: [chore] Add more bullshit crawlers to
robots.txt🖕 (#4829) (@kipvandenbos) - 3b63e8979d098a72bebdfc04940d2a3cb12280b6: [chore] remove unused
auth_flow.shscript (#4822) (@kipvandenbos) - aeb597ed983bb5f2f768807258c85b522c201875: [chore] update dependencies (#4815) (@gruf)
- 47237d7b81a35a6e727fcedf53430d87288f28b1: [chore] update dependencies (#4806) (@gruf)
- 6cdf99a467f892ad3e6c0586870d8014d719c232: [chore] update dependencies (#4801) (@gruf)
- 62852a052611393f3f8b714db995ac90232c89c3: [chore] update dependencies (#4797) (@gruf)
- 22105fba1b1b8291457cb9a7461ba57c346c693b: [chore] update dependencies (#4791) (@gruf)
- 650a9982606c909894f8b92c706a2ddd466f2568: [chore] update dependencies (#4784) (@gruf)
- 12ff7d3dc47a062f52996a6c19b363bae9284b68: [chore] Totally definitely legitimately support Claude code, we love our shit-eating LLM capitalist overlords 🚀 (#4781) (@mkljczk)
- e5f7b69df36d3f0a64c82bd20f770b4585967dc0: [chore] Update
gotosocial-woodpecker-buildversion number (#4774) (@kipvandenbos) - 003788429dd2ad57294482af2411559998cdefbb: [chore] update dependencies (#4773) (@gruf)
- 92d7e6c456ac4cba741a2bf2438e45f78aaa8f5b: [chore/performance] Set lazy loading in HTML for status header avatars (#4772) (@kipvandenbos)
- c7f37c34e26fb005b55ed88983e6ac7e74042268: [chore] update dependencies (#4745) (@gruf)
- fe460402d3adce60792a8609267a50f2a4a6fda3: [chore] Use
bun.Ident()inGetCachedAttachments(#4753) (@kipvandenbos) - df7b9e0319a7574c8ae0ccdf870949ff3c2e2d87: [chore] updated dependencies (#4719) (@gruf)
- 8d1f34958355947df667d02050e5c45ac7283541: [chore] Updating linter in CI/CD to v2.9.0 (#4714) (@foxbite)
Documentation
- 542c57f71626e0f167eceb05f4c76bdbe732284d: [docs] update list of supported platforms regarding recent changes to ncruces/go-sqlite3 and our build tag behaviour (#4858) (@gruf)
- 40ed94590f149cd3656ddd09dfa0141f37686d7c: [docs] Update db maintenance docs, add status cleanup docs, update media cleanup docs (#4857) (@kipvandenbos)
- 10244f032b3cb0eb3c5e1dd736b5edcc102794df: [docs] Update database maintenance docs to specify using the gts binary to run analyze (#4843) (@kipvandenbos)
- bafe562b3930b8c7bbe07563b59a9960a194fc5e: [docs] Update config examples for crons (#4821) (@kipvandenbos)
- a2cbe8cf28d3271c52c6032cb9ea1841ea606ada: [docs/bugfix] Fix link to example systemctl file (#4751) (@kipvandenbos)
Other
- c6388ed0886c12b5691ce6538c1962bdb0af430f: [frontend] tweak account directory styling (#4860) (@kipvandenbos)
- 47772362b9bf91dab3916a768495d19b5ec84a64: [frontend] Update media cleanup form to better reflect API (#4839) (@kipvandenbos)