2885 Commits
Author SHA1 Message Date
osmarks 0dc571fee7 add notes 2026-07-08 13:09:37 +01:00
osmarks 05e095c630 merge upstream 2026-07-08 12:56:04 +01:00
osmarks d2b1221d64 fix robots exclusions 2026-07-08 12:50:51 +01:00
tobiandtobi 60b693f9c7 [bugfix/frontend] turn DateTimeMinute and DateTimeSecond into proper components (#4911)
Fixes https://codeberg.org/superseriousbusiness/gotosocial/issues/4906 by turning `DateTimeMinute` and `DateTimeSecond` into proper memoized components instead of functions that return jsx elements.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4911
2026-06-29 11:41:48 +02:00
kimandtobi 867ce73d07 [bugfix] stricter property value counts (#4905)
- removes some duplicate logic in ./internal/ap and moves more of the functions to ./internal/ap/properties.go with standardized interfaces
- updates various areas of the codebase to rely on these GetOne___() functions
- pulls in latest gopkg for log.Formatted() function for nicer log formatting of variables in errors

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4905
2026-06-25 06:39:45 +02:00
kimandkim 24537b2f6f [chore] update dependencies (#4904)
- github.com/coreos/go-oidc/v3: v3.18.0 -> v3.19.0
- golang.org/x/image: v0.42.0 -> v0.43.0
- modernc.org/sqlite: v1.52.0 -> v1.53.0
- code.superseriousbusiness.org/exif-terminator: v0.11.2 -> v0.11.4

in particular the exif-terminator update should close https://codeberg.org/superseriousbusiness/gotosocial/issues/4805

closes: https://codeberg.org/superseriousbusiness/gotosocial/issues/4805

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4904
2026-06-24 17:56:35 +02:00
tobiandtobi b2e789e952 [bugfix] Allow hyphen in usernameRelaxed regex (#4902)
# Description

> If this is a code change, please include a summary of what you've coded, and link to the issue(s) it closes/implements.
>
> If this is a documentation change, please briefly describe what you've changed and why.

Fix issue like the one described in https://codeberg.org/superseriousbusiness/gotosocial/issues/4878#issuecomment-17953256 where instance accounts containing hyphens can't send activities from their outbox.

## Checklist

Please put an x inside each checkbox to indicate that you've read and followed it: `[ ]` -> `[x]`

If this is a documentation change, only the first two checkboxes must be filled (you can delete the others if you want).

- [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md).
- [x] I/we have not used so-called 'AI' to create the proposed changes.
- [x] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat.
- [x] I/we have performed a self-review of added code.
- [x] I/we have written code that is legible and maintainable by others.
- [x] I/we have commented the added code, particularly in hard-to-understand areas.
- [ ] I/we have made any necessary changes to documentation.
- [ ] I/we have added tests that cover new code.
- [x] I/we have run tests and they pass locally with the changes.
- [x] I/we have run `go fmt ./...` and `golangci-lint run`.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4902
2026-06-24 09:49:13 +02:00
tobiandtobi 0419b4d86d [performance] Use CROSS JOIN LATERAL for Postgres home timeline queries (#4891)
# Description

> If this is a code change, please include a summary of what you've coded, and link to the issue(s) it closes/implements.
>
> If this is a documentation change, please briefly describe what you've changed and why.

This pull request updates the home timeline query for Postgres specifically, to use a [LATERAL subquery](https://www.postgresql.org/docs/current/queries-table-expressions.html#QUERIES-LATERAL), avoiding the creeping heap fetch issue described in https://codeberg.org/superseriousbusiness/gotosocial/issues/4757

Before:

```
EXPLAIN ANALYZE WITH "_data" ("account_id") AS ( VALUES ('010KJCAZVGX7RSXT3XZJ8HK2A3'::char(26)), ('010TBJR4TJSFVSWN9YQT3QT308'::char(26)), ('011B59FH6XSWKT63JE80WEZ2NG'::char(26)), ('011JJ4G01DZEGWRAPYSQWG91XM'::char(26)), ('0124HQ0KF2DCSH5GAR78GBHZRZ'::char(26)), ('0124WH8BQBD6CDQDPD3CG3T29M'::char(26)), ('01358MRD0D94D01KWTJWRFHDJM'::char(26)), ('013H20V1Z3AVWZ9JZEJWZKD8WX'::char(26)), ('013JFKQR8M9Y5QK1AZF9WT2FNX'::char(26)), ('013P1NVPH1BP8Q1SXT4TCAN36M'::char(26)), ('014598E8FAY9SZVZFB2M8MEGTP'::char(26)), ('0149CR6CGH91FT3JVAQ52WF0EP'::char(26)), ('014BGPSBD4H955CS79HQ3ECHN6'::char(26)), ('014G5NATJBNEH77F8XVK6JY99X'::char(26)), ('014J0W8RBS84BRZYK79WGS0QSJ'::char(26)), ('014S45FWJT45H1Z49R9HWZWV20'::char(26)), ('014T7SBR0968GES9A375JSH7MP'::char(26)), ('01535NNG059DGY5ZPGJQAAVS13'::char(26)), ('01541VDMNWAEM9JEXDTRRCH6P3'::char(26)), ('015CCGAC1MH1MYY80KCXPDRXR9'::char(26)), ('015DR5MYCZFFM6ZP6SZ4PSW31K'::char(26)), ('015G42YMDNQM092QNN41NY5KMY'::char(26)), ('015NJAK04RVZ8KRR20JYD77AWJ'::char(26)), ('015P4N1NZZQNYPSRJX0AT5ENDV'::char(26)), ('015R6PN8ZWA63Z9AA4NFHMNMJ7'::char(26)), ('015W3DJEV77410AEB438CSKKXF'::char(26)), ('015XXSW55D0M0H85HHXERB7X9F'::char(26)), ('015ZFRFGNVQVJCATSQRT35APK8'::char(26)), ('0163NDE688GY0SK8DHZ5KTHEB1'::char(26)), ('0165CM61ZJVWSX9ZT8Q151W51Y'::char(26)), ('0169Y8TJHWBRSCKNV1F0QH8C00'::char(26)), ('016FV57FJMJTP6GM1AX97SBSWZ'::char(26)), ('016MK747JE82KNF0A5BH9Q28ZS'::char(26)), ('016Q2N8M9TKPM2HXAPBMAMG8BA'::char(26)), ('016THHHCAM5AQ2QJETYWMF6M37'::char(26)), ('016VP4S3BP3QSJBACEQ6J1VFDX'::char(26)), ('0171075Q5V357NS00ZJQRGH6NW'::char(26)), ('017DWBB1TX5NHZV3JZKTVKKMZB'::char(26)), ('017GAWN8JR7RECEDX82EM94X7D'::char(26)), ('017K2RG96VDWJHG35GV1R03R5Y'::char(26)), ('017T6N57D3KKBHYS2H352DEY9D'::char(26)), ('01824Y24R5NPZTVK9GJSG6QR3R'::char(26)), ('0186ZVSYZ208XSE4PAJETQZHW9'::char(26)), ('01876Q3TJ0Y2W577YN0BMP49HW'::char(26)), ('018KRFQSART3AQ49TRPM0BX2C8'::char(26)), ('018N9WEKHBQTKVMZW8GNHQJ629'::char(26)), ('018SWC5NJ3B114BZSA9AEPAC7T'::char(26)), ('018XGGK71Q1ZVA8T9XKXFC3KKN'::char(26)), ('0190MK7YXNR7N18KC398TE1M8S'::char(26)), ('019980EV8ZSWMDEM9XJ1CZGC85'::char(26)), ('0199G3RXT4MH8QZRV9401KSHNV'::char(26)), ('019C55VGC39DAHMEB5ZKFESEC9'::char(26)), ('019EF14SHK5KKSQ6QWMSYQB3XJ'::char(26)), ('019XW6CMB06QTQ42DPXYD461AY'::char(26)), ('01A1Y8X9P39FTJGRPJWVJFF1VQ'::char(26)), ('01A72AZ44N5SBX6WGXEF4QPGDN'::char(26)), ('01A9FXTTV7VNDWXTW3MAT5F8TS'::char(26)), ('01AES78TJ171V5GBQ9A4FT6M0Y'::char(26)), ('01AJHSYXPR0AMD1FHX29QSPVH4'::char(26)), ('01AKS3VNBE7ESZJ32CR7Y1KHZ8'::char(26)), ('01AQKRF3JZNQ3FDB1JXNS88SPE'::char(26)), ('01AQVEFV1BR9ZJEWXJHVM9SMSW'::char(26)), ('01AYKM70B4TFR0CVBGA1YBE9BQ'::char(26)), ('01B43VVFAZB6CNY4XPS8SSP7CT'::char(26)), ('01B5EBWSQ2S6EBR7538WB34FZZ'::char(26)), ('01B945BBPG17A3HSGESWBVASTX'::char(26)), ('01B9XSMFQBEBH1AB8YZGPR9Z8C'::char(26)), ('01BD3HDDQMAEPHNKW0YCRVR0EK'::char(26)), ('01BKJ18EXS58K8N3W0GK5B2CTH'::char(26)), ('01BQQEA5S9F1HYA6N9SR0F2DH1'::char(26)), ('01BRC1CJGEX49HE6J3RYBTW5FT'::char(26)), ('01BSXJ28K4FQ2F2Q1QD43XCY69'::char(26)), ('01BT8W7M439Q1HR9DAETJK56KS'::char(26)), ('01BVFQWHSCNBZMEAA55P433V47'::char(26)), ('01BWJ34SVG4CTE9578D896FASZ'::char(26)), ('01C59JW86JBETRK0GYYJGYGWK4'::char(26)), ('01CH1E9YADSKPZPE3XZTK43859'::char(26)), ('01CH4ZMGKE45Z2NR3D2Z68FTND'::char(26)), ('01CJ50FJ12YNXBZ3XJPDDD3ERQ'::char(26)), ('01CP37J1CYA9R8HAD2STHNM1XQ'::char(26)), ('01CQTJGAPTBAZ3A4A8PFWKY3JN'::char(26)), ('01CTYR17YFS9KQFQT2JM7ZJGMF'::char(26)), ('01D7683PBJ8TVSP7QM7532M0FP'::char(26)), ('01D8ENRT7SJK7ZHFMF002S3MNW'::char(26)), ('01DAVJYVPXHW7JGWKZHWMGB6JB'::char(26)), ('01DDBJ121GX2DNHSHW0HYYW1WX'::char(26)), ('01DFT35G3Z545GWAG4NSN875VR'::char(26)), ('01DPAEFQHWVTSABRBH00F9KY2J'::char(26)), ('01DQHDPZ28ZNDZSNVQT39DYM24'::char(26)), ('01DTE9GFAQGY0JQKPQ9JJJWAYV'::char(26)), ('01DVBSWPME78F8TH90NPRTHZCZ'::char(26)), ('01DVDGADC6FM0V1EF3VJCPS8Q0'::char(26)), ('01DWZ5TRHQVDW59Q6J3JYBTRPM'::char(26)), ('01DX4SSBV3XP1Y7Q71T1WYJWP9'::char(26)), ('01E5VH11BBERND2HZY335HCXMV'::char(26)), ('01EA5VC37PEJE4WM9JYN85063M'::char(26)), ('01EGE516AN5QNP732DVAJRH5TD'::char(26)), ('01EHZAJA1H76RFX9Q3XFSRF6X2'::char(26)), ('01EKEGWRA0N538W5TZ3XT1XVQB'::char(26)), ('01EN6FJ0Y6700K6QZRVADCMZ1S'::char(26)), ('01ER8ZNXY2QPGH7EKP16SYMGVK'::char(26)), ('01F0SN5XZG0KY17MFB3QV3AKZ7'::char(26)), ('01F3S2ZGZ69S1WD3VB7XBB4VPV'::char(26)), ('01F57NK3Y6Y1D48KTDCQKR15JG'::char(26)), ('01F68RGWGACB0JN7YZ8WKNM5A5'::char(26)), ('01F7R73S31QXK3GVSTT70P0S3W'::char(26)), ('01FC2TW4B5A9QMBMTQCGXJCVB1'::char(26)), ('01FF8FEM0Y88D0FKE3GF5CPTYE'::char(26)), ('01FGQCQH103C9YMKG977KW7YBC'::char(26)), ('01FJGZY8BTYGHWQ9S644YMJJ1J'::char(26)), ('01FJPDPAJE39YG6QE0P4H9CJ54'::char(26)), ('01FJR0V05745PHYMFFRF582N9G'::char(26)), ('01FM11CJCJ3MANFFGY6XQ6A2SN'::char(26)), ('01FQ9CAR2P7P5KECTNFBWB3RZT'::char(26)), ('01FTBPN8GDNABBXPXP5CV9HVCN'::char(26)), ('01FTPP74QV8JBEJ0X9SVE9GJPW'::char(26)), ('01FVB3WQCDQQ58RWVZTNN1BCHH'::char(26)), ('01FYC489JJYSFBBMGPW4TEWFMB'::char(26)), ('01FYYFYM41APHPC10ZP34M0AGA'::char(26)), ('01G132DPQFCN1ZMDG05STFF5DM'::char(26)), ('01G2PXNZEFNX0WTBKJD0KJQZVZ'::char(26)), ('01G9SX5PABE3YFWB10R3P2YG8M'::char(26)), ('01G9Z5NNWVNP7EP1PPYMDB7FTS'::char(26)), ('01GCSJSFCX8GA4FSZZRYR5WY8H'::char(26)), ('01GEP0VQ9MK4YC6YSS2D65B42X'::char(26)), ('01GFQHFQ5G9J1X5VR39QS9JNZH'::char(26)), ('01GK985EDCKDNZ9VTA2EH0588A'::char(26)), ('01GRE1KVX7WTE6A17CFEK9QFKW'::char(26)), ('01GRFDT0RHNCRXM5XVDFBWCV1V'::char(26)), ('01GS7YBHJR6XEJ9902EQ38V2HC'::char(26)), ('01GSRE95Z0M3MBYNQTTM768PY4'::char(26)), ('01GT6VW7C843F7R52W41X21SE8'::char(26)), ('01GTBN1KPV1S4JD7YW0WF9EYKX'::char(26)), ('01GWN8985RZZQS76R08GC5V2AG'::char(26)), ('01GWQEWKAX8NK2E0P0K59PAKKB'::char(26)), ('01GXPBCAA4NK53WDKZT7N8H3CG'::char(26)), ('01GYWHQH01T8MHHH9GX2HN74FT'::char(26)), ('01H0YSAJK57SNT6FZ9ZYQCHY4A'::char(26)), ('01H344S14HT8PPRBK994R7SH3G'::char(26)), ('01H3975PZZF4E88FN0AF9CW1WA'::char(26)), ('01H431FJ6V4YAHCGFFW34X8896'::char(26)), ('01H5M6GATV1PCDX9Z8KM9VWZ9Z'::char(26)), ('01H625GSHDQHQX31EGRNYZHAQV'::char(26)), ('01H66W8RF1V73Q8DJTF7B4YGBH'::char(26)), ('01H6K463ABNQYK7WF4HYDBM93N'::char(26)), ('01H7X3RGHVMTFEFQAB3XB1JNT2'::char(26)), ('01H80SYN2ZF3QX1GZCANNW7958'::char(26)), ('01H8QAXECJCE3ZNCWKAG2PVE41'::char(26)), ('01HAHVRP3F28R8RJMZR6T9ATAR'::char(26)), ('01HBGD567VD5ZHMBA7P9WM8777'::char(26)), ('01HCY101HMDM4HYD7YEG8GN8YF'::char(26)), ('01HCYS169BFFQNHT5J4XD7FZJY'::char(26)), ('01HD8JAVHAKJ02AF29QMZPNGGM'::char(26)), ('01HDJ42G3V41CFDV51HN0B86BV'::char(26)), ('01HEDHXHEE1XVXR8NTGG88MXWH'::char(26)), ('01HG4W3KW1D6TPS316BQZKBNVH'::char(26)), ('01HGD8K8NGJHF4Z4DYS4BDQJFT'::char(26)), ('01HHSZCR1K6T0SYF2BD93APMVB'::char(26)), ('01HJP92D74N69C4FCME4AF3DRK'::char(26)), ('01HK0GPCACF9Z9G4HM9VRRMBZT'::char(26)), ('01HN2W94S2S2NJ4ZH58KMPD3HC'::char(26)), ('01HN62BPR4M2K87D3689SNZ6G9'::char(26)), ('01HXFZ2MSSDTFKGBCSACD3NG74'::char(26)), ('01HYMYMBNFPH02VMAF5C1T3HA5'::char(26)), ('01HYY39CQ9AMRZ4GSKQ1V1ZY56'::char(26)), ('01HZW2HXDP1QVZT4E5XDZZAZ53'::char(26)), ('01J0H6RPP9PB60VGY6KRZD3B2V'::char(26)), ('01J0NRYK08SKHNSBRW4C02K2A0'::char(26)), ('01J0P2W9CEV8B8CRG68NVSF5W2'::char(26)), ('01J1MT22HF3472SQA7VE34KC3H'::char(26)), ('01J42T81TFY33QMK2G99MJBAXX'::char(26)), ('01J4C59KK3CJ0VN7XN5CJFTY67'::char(26)), ('01J58695478QX17FKNQ4ZVAVM1'::char(26)), ('01J75WP4DCTGFD0TV2MTE41HWX'::char(26)), ('01J75XE4WWMTSWGKBYE67NY95W'::char(26)), ('01J75XJR9YD6ESS5QF1V9TV1AS'::char(26)), ('01J75XQ353QSRNQ7VZHVRTCWX7'::char(26)), ('01J75Y2WHTQ8BY1WG3KDC4VH0T'::char(26)), ('01J75Y99MQRE4KZY1Y05T0VV7Z'::char(26)), ('01J75Y9XQQ3CM9C9XCGM35KGHM'::char(26)), ('01J9QVAB4BM3V4CM37DWM30K5M'::char(26)), ('01JCR3D1D3ZY3QVN5A61B1SK8G'::char(26)), ('01JEM6XKK9BKD2TG76FHMH4QDA'::char(26)), ('01JEMBY612J7PMW87T8XYEA091'::char(26)), ('01JEYV93PT3072YYWWAP3JEGPV'::char(26)), ('01JFSNJVY31X2T8RJT24BBDRST'::char(26)), ('01JG1WG1JK6DTHHBWAC3N22CGY'::char(26)), ('01JG44P0SND7T0B5ACX3A2FH9D'::char(26)), ('01JGFQ6VK2HDWJEEAS3VYPYYQP'::char(26)), ('01JGH4RQPT4TD8PYM1ETVDZBEB'::char(26)), ('01JH4FXVNPMAZB1TKET514AV9X'::char(26)), ('01JK12R970J9E43T5P5HWTENM4'::char(26)), ('01JK138N5MBCFERV2WCYYEXVQ1'::char(26)), ('01JKXMV3DZQ3HX1G6JDJQW2XDF'::char(26)), ('01JNE4XKDF5Z1CDR720PZNHKVV'::char(26)), ('01JNGBFNBBYVP1DYK7JNDFZQGQ'::char(26)), ('01JNHRW3KDVE6XAHZGBRZT62XE'::char(26)), ('01JPZPXCWQ7MCA40CNWSH28GR6'::char(26)), ('01JQCAB3DW1ZXQ6D5DX1BHJ8BP'::char(26)), ('01JQGZV6VZDFM9SC1JNPGFQD8N'::char(26)), ('01JR0WC1HZ1RPSXEHX8KFHVR6Z'::char(26)), ('01JRN5X6RYF1WS5FG707HY5QZA'::char(26)), ('01JRNNF1W627Z3TBWKS06TWFBW'::char(26)), ('01JRP9VAJRSV0R24F8TGCVZBHG'::char(26)), ('01JRTSGH6C7GFG42H6NY6SJBHG'::char(26)), ('01JRY8B2Z583SC5ZEACZ1K5XQ0'::char(26)), ('01JT3HPZZB0AVB5E8MK5MKPGZM'::char(26)), ('01JTGCC5GP27W4HNKG42Y6MF09'::char(26)), ('01JTSYQ7KAH9M98DSA3PPVP0WZ'::char(26)), ('01JVQZ68F7BTK5CNCK3HVVH592'::char(26)), ('01JW3QF7KAER5453T8PGACVZAJ'::char(26)), ('01JWWQ51HR3R0EC87SSRTK3XFQ'::char(26)), ('01JWXEQT4NB6ABSWNA8DM4318A'::char(26)), ('01K0QTBJE82WA2ZAWJJTTCFJSD'::char(26)), ('01K0Z2QJHF2E1M8585621P7AF7'::char(26)), ('01K2N8WH4HGG4DWCP7C72RK0DS'::char(26)), ('01K2XFKN0X9FGP0Z4HAVQSFQAN'::char(26)), ('01K727MG9QK1GFXZA8F49G1CHN'::char(26)), ('01KBE39J8P0ESVNTP3B7MJPZ8A'::char(26)), ('01KCGJEEG3GJ0JQPD99E0H0RAG'::char(26)), ('01KCSZ5HEYHZMEVDZQT4FDQYTG'::char(26)), ('01KDVC85NAB4JMQBXC552G9H51'::char(26)), ('01KHBNS8H8WZK70MVXWSMP1ADC'::char(26)), ('01KJATPHVFZVEJT7Z6JDYHVB4A'::char(26)), ('01KJG9PW50AZBTVW5D2NH1RMX3'::char(26)), ('01KPPCN19EGJ2N3JD3JK8Z96NN'::char(26)), ('01KPVMMF4YESS9EGYFCEQRCT7D'::char(26)), ('01KPZZ2WYYW70KRZMJR60NNFDS'::char(26)), ('01KS8K2G7ZT18H3ZA83S7GEMTX'::char(26)), ('01KT11HEJAMNQ7YS8N7FZH4HC4'::char(26)), ('01KTHFS76VYMX80XFVAEH2187Y'::char(26)), ('01KTYJAREWNQ0GM4YVW8WSMB5D'::char(26)), ('01KXPZT066KZ6SWTC9F8BT3VSZ'::char(26)), ('01KXRB11VCGSKA78P4P4W18N1Q'::char(26)), ('01KYVKABD7MKBPMHA3WAVVSSAT'::char(26)), ('01M7EPSSYTVQ8P5BHN9NEPCA7T'::char(26)), ('01M9RN3FGWA0F1ABHDHZNB8SCT'::char(26)), ('01MAJKA5157GYGH4V4B9GZ5CCV'::char(26)), ('01MF0JERZ55TY0G8TRTE867G0B'::char(26)), ('01MWZZM0QH26BDJPR7RG03JCYR'::char(26)), ('01MZ7FEMK09RT3C50Z7QQWXQNA'::char(26)), ('01N0Y1793BXPMM3P9Q7XM7QZQN'::char(26)), ('01N115BNT5ERRNNYXB2W0453J4'::char(26)), ('01N2ZE39DZBC1EH7MZQ3JBZVZE'::char(26)), ('01N3JVRFENQN5BSN9RHY2R29GG'::char(26)), ('01N5P9CR9QWS27CPBKMP1T373M'::char(26)), ('01N6MMSD28WQPZ8FFKHAV1SZPB'::char(26)), ('01N7WZNC8MVRCZFX1J3F0MXMED'::char(26)), ('01NQN2F3VJG4SMRSD42QMXYDC1'::char(26)), ('01NR1PXBYGRAJ28PCP19JYB756'::char(26)), ('01P3DC4H9Z263RM2JKYSZ0X4SN'::char(26)), ('01P539RH13YRVFDWW8MVPZKRW8'::char(26)), ('01P8KSW8B0RW2K466364V6BY7D'::char(26)), ('01P8QYNX7VKY4E43MB3X2DKN8V'::char(26)), ('01PB3YCAGVVTVM7JTSFK8WRWV9'::char(26)), ('01PCF3SAFKH1KVDHMD458MPS5N'::char(26)), ('01PX7AGFX66M57HV6YJTPT3EBM'::char(26)), ('01PZNHC63PPYTHMQ8A9HY1YP7X'::char(26)), ('01Q7ZJ700HE0J7ZV7WM4ZFPXX1'::char(26)), ('01QATDFQQSYK4F5T6P9AXDM637'::char(26)), ('01QBYS90D60720RA1N2J7CREG9'::char(26)), ('01QENWN77TSEM0VB4NGP4BXRNX'::char(26)), ('01QHTD5X15MVEFNBAJ5VPMMDTD'::char(26)), ('01QJKCF8WM7H1GD7CRT3H2VEE4'::char(26)), ('01QKNFYCBFNANRKDXQYWH246GK'::char(26)), ('01QVJBA4F63YYFH9EXN4NF41EC'::char(26)), ('01R03G2X49H8BS4Z52QF8GT3M2'::char(26)), ('01R8RZJ6EGRBK8VSJ7268SXWEG'::char(26)), ('01R9A1SYQA68ZWQY9H9QR2PS3R'::char(26)), ('01RDTES621167B0APPR4WMRPK9'::char(26)), ('01RHDD9SPJ5SC854MGJB3T49KM'::char(26)), ('01RJB6W1QNC1DMK4X9W8GFKEKR'::char(26)), ('01RMB7EYFBKZAF8WWQGKZKSZT6'::char(26)), ('01RPX6K11S6TC7KQDGT0HH575R'::char(26)), ('01RSQ1ZTFX936KW051ECGBBDBV'::char(26)), ('01RW9HW9TW15K16ZAQY5RA1B59'::char(26)), ('01RZPPDRD8XVTPVBBP2YHBJ17S'::char(26)), ('01S865K6GN8KJRCABY71HWH6EF'::char(26)), ('01S8ERTNETXDNXQ72BZ7Y4VPQS'::char(26)), ('01S9VR99FTHRWFJBTG1G722EAC'::char(26)), ('01SCJNCKYRS2V849HPFWCNJP98'::char(26)), ('01SDTT0Q72WSHCJ285XPPPR2G3'::char(26)), ('01SHJ4763YJTWVPY4V4CEE5MRP'::char(26)), ('01SMTYCEY76XY9R7NNKCFSSB79'::char(26)), ('01SRYWNXEYHKAXDW4Y7Y08JNKX'::char(26)), ('01STFTTQBQEXS1TVHSZG1BRK80'::char(26)), ('01T5R2T5EDMC987FEG7WWT8VXA'::char(26)), ('01T9SSP6YVMZJ9DS98E9403YH5'::char(26)), ('01TAWCEMQEN84TZ5RB276SNPFC'::char(26)), ('01TGBRWAWZ6HS48S9GVDV7ZFYR'::char(26)), ('01TQXC952JHY2XEE233WASVEK9'::char(26)), ('01TR5EDP73NPR12S85ENCWR5P3'::char(26)), ('01TTR9AXJMTBN6AD5PZGCAJSC2'::char(26)), ('01TYKK51B54F3BBE05HG0EYGWT'::char(26)), ('01VJXQ59Z0NHFYE5CR9Q2JVXJW'::char(26)), ('01VM56ZSRWX45817Y1Y9Y4RM01'::char(26)), ('01W71JQ9P3T94PABFZ1YVB43AA'::char(26)), ('01W9Q4NS5SPEJ0K676XFHJE5FY'::char(26)), ('01WCTCDT0PJAS0YEHS0P6K1QF7'::char(26)), ('01WMXHPHHFA602G42ZR69GFYZ1'::char(26)), ('01X8J6P8B3TRAC8N0VPB8AJCEB'::char(26)), ('01XDZ19FWPMJX6MKEHFWZMZYW8'::char(26)), ('01XHKD009T4W7MGC7FQTMRSSQ4'::char(26)), ('01XWC8MK7BYH164Z0W9M7N1E5F'::char(26)), ('01YAJ3172F4K9E269SJJVMKY1V'::char(26)), ('01YW7XGKSQC13GN3Q42BRQZATR'::char(26)), ('01ZED2MTT6VP2YAXS4FJQ6F8CZ'::char(26)), ('01ZFQ73C2GSJ3W5VCSC7Q0ZM3C'::char(26)), ('020MYYBFHE385P3SFG5CW9NFA1'::char(26)) ) SELECT "status"."id" FROM "statuses" AS "status", "_data" WHERE ( "status"."account_id" = "_data"."account_id" ) AND ("flags" & 32 = 0) AND ("flags" & 2 = 0) AND ( "status"."id" < '01KVJY68YK0000000000000000' ) ORDER BY "status"."id" DESC LIMIT 100;
                                                                                  QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=13.89..13.90 rows=2 width=27) (actual time=9655.114..9655.440 rows=100 loops=1)
   ->  Sort  (cost=13.89..13.90 rows=2 width=27) (actual time=9655.114..9655.224 rows=100 loops=1)
         Sort Key: status.id DESC
         Sort Method: top-N heapsort  Memory: 35kB
         ->  Hash Join  (cost=8.28..13.88 rows=2 width=27) (actual time=30.580..8448.281 rows=1023510 loops=1)
               Hash Cond: (status.account_id = "*VALUES*".column1)
               ->  Index Only Scan using statuses_home_timeline_idx on statuses status  (cost=0.56..5.86 rows=74 width=54) (actual time=0.352..4250.809 rows=2986943 loops=1)
                     Index Cond: (id < '01KVJY68YK0000000000000000'::bpchar)
                     Heap Fetches: 12628
               ->  Hash  (cost=3.86..3.86 rows=309 width=108) (actual time=0.921..0.985 rows=309 loops=1)
                     Buckets: 1024  Batches: 1  Memory Usage: 26kB
                     ->  Values Scan on "*VALUES*"  (cost=0.00..3.86 rows=309 width=108) (actual time=0.009..0.485 rows=309 loops=1)
 Planning Time: 2.596 ms
 Execution Time: 9655.882 ms
(14 rows)
```

After:

```
EXPLAIN ANALYZE SELECT "status"."id" FROM ( VALUES ('010KJCAZVGX7RSXT3XZJ8HK2A3'::char(26)), ('010TBJR4TJSFVSWN9YQT3QT308'::char(26)), ('011B59FH6XSWKT63JE80WEZ2NG'::char(26)), ('011JJ4G01DZEGWRAPYSQWG91XM'::char(26)), ('0124HQ0KF2DCSH5GAR78GBHZRZ'::char(26)), ('0124WH8BQBD6CDQDPD3CG3T29M'::char(26)), ('01358MRD0D94D01KWTJWRFHDJM'::char(26)), ('013H20V1Z3AVWZ9JZEJWZKD8WX'::char(26)), ('013JFKQR8M9Y5QK1AZF9WT2FNX'::char(26)), ('013P1NVPH1BP8Q1SXT4TCAN36M'::char(26)), ('014598E8FAY9SZVZFB2M8MEGTP'::char(26)), ('0149CR6CGH91FT3JVAQ52WF0EP'::char(26)), ('014BGPSBD4H955CS79HQ3ECHN6'::char(26)), ('014G5NATJBNEH77F8XVK6JY99X'::char(26)), ('014J0W8RBS84BRZYK79WGS0QSJ'::char(26)), ('014S45FWJT45H1Z49R9HWZWV20'::char(26)), ('014T7SBR0968GES9A375JSH7MP'::char(26)), ('01535NNG059DGY5ZPGJQAAVS13'::char(26)), ('01541VDMNWAEM9JEXDTRRCH6P3'::char(26)), ('015CCGAC1MH1MYY80KCXPDRXR9'::char(26)), ('015DR5MYCZFFM6ZP6SZ4PSW31K'::char(26)), ('015G42YMDNQM092QNN41NY5KMY'::char(26)), ('015NJAK04RVZ8KRR20JYD77AWJ'::char(26)), ('015P4N1NZZQNYPSRJX0AT5ENDV'::char(26)), ('015R6PN8ZWA63Z9AA4NFHMNMJ7'::char(26)), ('015W3DJEV77410AEB438CSKKXF'::char(26)), ('015XXSW55D0M0H85HHXERB7X9F'::char(26)), ('015ZFRFGNVQVJCATSQRT35APK8'::char(26)), ('0163NDE688GY0SK8DHZ5KTHEB1'::char(26)), ('0165CM61ZJVWSX9ZT8Q151W51Y'::char(26)), ('0169Y8TJHWBRSCKNV1F0QH8C00'::char(26)), ('016FV57FJMJTP6GM1AX97SBSWZ'::char(26)), ('016MK747JE82KNF0A5BH9Q28ZS'::char(26)), ('016Q2N8M9TKPM2HXAPBMAMG8BA'::char(26)), ('016THHHCAM5AQ2QJETYWMF6M37'::char(26)), ('016VP4S3BP3QSJBACEQ6J1VFDX'::char(26)), ('0171075Q5V357NS00ZJQRGH6NW'::char(26)), ('017DWBB1TX5NHZV3JZKTVKKMZB'::char(26)), ('017GAWN8JR7RECEDX82EM94X7D'::char(26)), ('017K2RG96VDWJHG35GV1R03R5Y'::char(26)), ('017T6N57D3KKBHYS2H352DEY9D'::char(26)), ('01824Y24R5NPZTVK9GJSG6QR3R'::char(26)), ('0186ZVSYZ208XSE4PAJETQZHW9'::char(26)), ('01876Q3TJ0Y2W577YN0BMP49HW'::char(26)), ('018KRFQSART3AQ49TRPM0BX2C8'::char(26)), ('018N9WEKHBQTKVMZW8GNHQJ629'::char(26)), ('018SWC5NJ3B114BZSA9AEPAC7T'::char(26)), ('018XGGK71Q1ZVA8T9XKXFC3KKN'::char(26)), ('0190MK7YXNR7N18KC398TE1M8S'::char(26)), ('019980EV8ZSWMDEM9XJ1CZGC85'::char(26)), ('0199G3RXT4MH8QZRV9401KSHNV'::char(26)), ('019C55VGC39DAHMEB5ZKFESEC9'::char(26)), ('019EF14SHK5KKSQ6QWMSYQB3XJ'::char(26)), ('019XW6CMB06QTQ42DPXYD461AY'::char(26)), ('01A1Y8X9P39FTJGRPJWVJFF1VQ'::char(26)), ('01A72AZ44N5SBX6WGXEF4QPGDN'::char(26)), ('01A9FXTTV7VNDWXTW3MAT5F8TS'::char(26)), ('01AES78TJ171V5GBQ9A4FT6M0Y'::char(26)), ('01AJHSYXPR0AMD1FHX29QSPVH4'::char(26)), ('01AKS3VNBE7ESZJ32CR7Y1KHZ8'::char(26)), ('01AQKRF3JZNQ3FDB1JXNS88SPE'::char(26)), ('01AQVEFV1BR9ZJEWXJHVM9SMSW'::char(26)), ('01AYKM70B4TFR0CVBGA1YBE9BQ'::char(26)), ('01B43VVFAZB6CNY4XPS8SSP7CT'::char(26)), ('01B5EBWSQ2S6EBR7538WB34FZZ'::char(26)), ('01B945BBPG17A3HSGESWBVASTX'::char(26)), ('01B9XSMFQBEBH1AB8YZGPR9Z8C'::char(26)), ('01BD3HDDQMAEPHNKW0YCRVR0EK'::char(26)), ('01BKJ18EXS58K8N3W0GK5B2CTH'::char(26)), ('01BQQEA5S9F1HYA6N9SR0F2DH1'::char(26)), ('01BRC1CJGEX49HE6J3RYBTW5FT'::char(26)), ('01BSXJ28K4FQ2F2Q1QD43XCY69'::char(26)), ('01BT8W7M439Q1HR9DAETJK56KS'::char(26)), ('01BVFQWHSCNBZMEAA55P433V47'::char(26)), ('01BWJ34SVG4CTE9578D896FASZ'::char(26)), ('01C59JW86JBETRK0GYYJGYGWK4'::char(26)), ('01CH1E9YADSKPZPE3XZTK43859'::char(26)), ('01CH4ZMGKE45Z2NR3D2Z68FTND'::char(26)), ('01CJ50FJ12YNXBZ3XJPDDD3ERQ'::char(26)), ('01CP37J1CYA9R8HAD2STHNM1XQ'::char(26)), ('01CQTJGAPTBAZ3A4A8PFWKY3JN'::char(26)), ('01CTYR17YFS9KQFQT2JM7ZJGMF'::char(26)), ('01D7683PBJ8TVSP7QM7532M0FP'::char(26)), ('01D8ENRT7SJK7ZHFMF002S3MNW'::char(26)), ('01DAVJYVPXHW7JGWKZHWMGB6JB'::char(26)), ('01DDBJ121GX2DNHSHW0HYYW1WX'::char(26)), ('01DFT35G3Z545GWAG4NSN875VR'::char(26)), ('01DPAEFQHWVTSABRBH00F9KY2J'::char(26)), ('01DQHDPZ28ZNDZSNVQT39DYM24'::char(26)), ('01DTE9GFAQGY0JQKPQ9JJJWAYV'::char(26)), ('01DVBSWPME78F8TH90NPRTHZCZ'::char(26)), ('01DVDGADC6FM0V1EF3VJCPS8Q0'::char(26)), ('01DWZ5TRHQVDW59Q6J3JYBTRPM'::char(26)), ('01DX4SSBV3XP1Y7Q71T1WYJWP9'::char(26)), ('01E5VH11BBERND2HZY335HCXMV'::char(26)), ('01EA5VC37PEJE4WM9JYN85063M'::char(26)), ('01EGE516AN5QNP732DVAJRH5TD'::char(26)), ('01EHZAJA1H76RFX9Q3XFSRF6X2'::char(26)), ('01EKEGWRA0N538W5TZ3XT1XVQB'::char(26)), ('01EN6FJ0Y6700K6QZRVADCMZ1S'::char(26)), ('01ER8ZNXY2QPGH7EKP16SYMGVK'::char(26)), ('01F0SN5XZG0KY17MFB3QV3AKZ7'::char(26)), ('01F3S2ZGZ69S1WD3VB7XBB4VPV'::char(26)), ('01F57NK3Y6Y1D48KTDCQKR15JG'::char(26)), ('01F68RGWGACB0JN7YZ8WKNM5A5'::char(26)), ('01F7R73S31QXK3GVSTT70P0S3W'::char(26)), ('01FC2TW4B5A9QMBMTQCGXJCVB1'::char(26)), ('01FF8FEM0Y88D0FKE3GF5CPTYE'::char(26)), ('01FGQCQH103C9YMKG977KW7YBC'::char(26)), ('01FJGZY8BTYGHWQ9S644YMJJ1J'::char(26)), ('01FJPDPAJE39YG6QE0P4H9CJ54'::char(26)), ('01FJR0V05745PHYMFFRF582N9G'::char(26)), ('01FM11CJCJ3MANFFGY6XQ6A2SN'::char(26)), ('01FQ9CAR2P7P5KECTNFBWB3RZT'::char(26)), ('01FTBPN8GDNABBXPXP5CV9HVCN'::char(26)), ('01FTPP74QV8JBEJ0X9SVE9GJPW'::char(26)), ('01FVB3WQCDQQ58RWVZTNN1BCHH'::char(26)), ('01FYC489JJYSFBBMGPW4TEWFMB'::char(26)), ('01FYYFYM41APHPC10ZP34M0AGA'::char(26)), ('01G132DPQFCN1ZMDG05STFF5DM'::char(26)), ('01G2PXNZEFNX0WTBKJD0KJQZVZ'::char(26)), ('01G9SX5PABE3YFWB10R3P2YG8M'::char(26)), ('01G9Z5NNWVNP7EP1PPYMDB7FTS'::char(26)), ('01GCSJSFCX8GA4FSZZRYR5WY8H'::char(26)), ('01GEP0VQ9MK4YC6YSS2D65B42X'::char(26)), ('01GFQHFQ5G9J1X5VR39QS9JNZH'::char(26)), ('01GK985EDCKDNZ9VTA2EH0588A'::char(26)), ('01GRE1KVX7WTE6A17CFEK9QFKW'::char(26)), ('01GRFDT0RHNCRXM5XVDFBWCV1V'::char(26)), ('01GS7YBHJR6XEJ9902EQ38V2HC'::char(26)), ('01GSRE95Z0M3MBYNQTTM768PY4'::char(26)), ('01GT6VW7C843F7R52W41X21SE8'::char(26)), ('01GTBN1KPV1S4JD7YW0WF9EYKX'::char(26)), ('01GWN8985RZZQS76R08GC5V2AG'::char(26)), ('01GWQEWKAX8NK2E0P0K59PAKKB'::char(26)), ('01GXPBCAA4NK53WDKZT7N8H3CG'::char(26)), ('01GYWHQH01T8MHHH9GX2HN74FT'::char(26)), ('01H0YSAJK57SNT6FZ9ZYQCHY4A'::char(26)), ('01H344S14HT8PPRBK994R7SH3G'::char(26)), ('01H3975PZZF4E88FN0AF9CW1WA'::char(26)), ('01H431FJ6V4YAHCGFFW34X8896'::char(26)), ('01H5M6GATV1PCDX9Z8KM9VWZ9Z'::char(26)), ('01H625GSHDQHQX31EGRNYZHAQV'::char(26)), ('01H66W8RF1V73Q8DJTF7B4YGBH'::char(26)), ('01H6K463ABNQYK7WF4HYDBM93N'::char(26)), ('01H7X3RGHVMTFEFQAB3XB1JNT2'::char(26)), ('01H80SYN2ZF3QX1GZCANNW7958'::char(26)), ('01H8QAXECJCE3ZNCWKAG2PVE41'::char(26)), ('01HAHVRP3F28R8RJMZR6T9ATAR'::char(26)), ('01HBGD567VD5ZHMBA7P9WM8777'::char(26)), ('01HCY101HMDM4HYD7YEG8GN8YF'::char(26)), ('01HCYS169BFFQNHT5J4XD7FZJY'::char(26)), ('01HD8JAVHAKJ02AF29QMZPNGGM'::char(26)), ('01HDJ42G3V41CFDV51HN0B86BV'::char(26)), ('01HEDHXHEE1XVXR8NTGG88MXWH'::char(26)), ('01HG4W3KW1D6TPS316BQZKBNVH'::char(26)), ('01HGD8K8NGJHF4Z4DYS4BDQJFT'::char(26)), ('01HHSZCR1K6T0SYF2BD93APMVB'::char(26)), ('01HJP92D74N69C4FCME4AF3DRK'::char(26)), ('01HK0GPCACF9Z9G4HM9VRRMBZT'::char(26)), ('01HN2W94S2S2NJ4ZH58KMPD3HC'::char(26)), ('01HN62BPR4M2K87D3689SNZ6G9'::char(26)), ('01HXFZ2MSSDTFKGBCSACD3NG74'::char(26)), ('01HYMYMBNFPH02VMAF5C1T3HA5'::char(26)), ('01HYY39CQ9AMRZ4GSKQ1V1ZY56'::char(26)), ('01HZW2HXDP1QVZT4E5XDZZAZ53'::char(26)), ('01J0H6RPP9PB60VGY6KRZD3B2V'::char(26)), ('01J0NRYK08SKHNSBRW4C02K2A0'::char(26)), ('01J0P2W9CEV8B8CRG68NVSF5W2'::char(26)), ('01J1MT22HF3472SQA7VE34KC3H'::char(26)), ('01J42T81TFY33QMK2G99MJBAXX'::char(26)), ('01J4C59KK3CJ0VN7XN5CJFTY67'::char(26)), ('01J58695478QX17FKNQ4ZVAVM1'::char(26)), ('01J75WP4DCTGFD0TV2MTE41HWX'::char(26)), ('01J75XE4WWMTSWGKBYE67NY95W'::char(26)), ('01J75XJR9YD6ESS5QF1V9TV1AS'::char(26)), ('01J75XQ353QSRNQ7VZHVRTCWX7'::char(26)), ('01J75Y2WHTQ8BY1WG3KDC4VH0T'::char(26)), ('01J75Y99MQRE4KZY1Y05T0VV7Z'::char(26)), ('01J75Y9XQQ3CM9C9XCGM35KGHM'::char(26)), ('01J9QVAB4BM3V4CM37DWM30K5M'::char(26)), ('01JCR3D1D3ZY3QVN5A61B1SK8G'::char(26)), ('01JEM6XKK9BKD2TG76FHMH4QDA'::char(26)), ('01JEMBY612J7PMW87T8XYEA091'::char(26)), ('01JEYV93PT3072YYWWAP3JEGPV'::char(26)), ('01JFSNJVY31X2T8RJT24BBDRST'::char(26)), ('01JG1WG1JK6DTHHBWAC3N22CGY'::char(26)), ('01JG44P0SND7T0B5ACX3A2FH9D'::char(26)), ('01JGFQ6VK2HDWJEEAS3VYPYYQP'::char(26)), ('01JGH4RQPT4TD8PYM1ETVDZBEB'::char(26)), ('01JH4FXVNPMAZB1TKET514AV9X'::char(26)), ('01JK12R970J9E43T5P5HWTENM4'::char(26)), ('01JK138N5MBCFERV2WCYYEXVQ1'::char(26)), ('01JKXMV3DZQ3HX1G6JDJQW2XDF'::char(26)), ('01JNE4XKDF5Z1CDR720PZNHKVV'::char(26)), ('01JNGBFNBBYVP1DYK7JNDFZQGQ'::char(26)), ('01JNHRW3KDVE6XAHZGBRZT62XE'::char(26)), ('01JPZPXCWQ7MCA40CNWSH28GR6'::char(26)), ('01JQCAB3DW1ZXQ6D5DX1BHJ8BP'::char(26)), ('01JQGZV6VZDFM9SC1JNPGFQD8N'::char(26)), ('01JR0WC1HZ1RPSXEHX8KFHVR6Z'::char(26)), ('01JRN5X6RYF1WS5FG707HY5QZA'::char(26)), ('01JRNNF1W627Z3TBWKS06TWFBW'::char(26)), ('01JRP9VAJRSV0R24F8TGCVZBHG'::char(26)), ('01JRTSGH6C7GFG42H6NY6SJBHG'::char(26)), ('01JRY8B2Z583SC5ZEACZ1K5XQ0'::char(26)), ('01JT3HPZZB0AVB5E8MK5MKPGZM'::char(26)), ('01JTGCC5GP27W4HNKG42Y6MF09'::char(26)), ('01JTSYQ7KAH9M98DSA3PPVP0WZ'::char(26)), ('01JVQZ68F7BTK5CNCK3HVVH592'::char(26)), ('01JW3QF7KAER5453T8PGACVZAJ'::char(26)), ('01JWWQ51HR3R0EC87SSRTK3XFQ'::char(26)), ('01JWXEQT4NB6ABSWNA8DM4318A'::char(26)), ('01K0QTBJE82WA2ZAWJJTTCFJSD'::char(26)), ('01K0Z2QJHF2E1M8585621P7AF7'::char(26)), ('01K2N8WH4HGG4DWCP7C72RK0DS'::char(26)), ('01K2XFKN0X9FGP0Z4HAVQSFQAN'::char(26)), ('01K727MG9QK1GFXZA8F49G1CHN'::char(26)), ('01KBE39J8P0ESVNTP3B7MJPZ8A'::char(26)), ('01KCGJEEG3GJ0JQPD99E0H0RAG'::char(26)), ('01KCSZ5HEYHZMEVDZQT4FDQYTG'::char(26)), ('01KDVC85NAB4JMQBXC552G9H51'::char(26)), ('01KHBNS8H8WZK70MVXWSMP1ADC'::char(26)), ('01KJATPHVFZVEJT7Z6JDYHVB4A'::char(26)), ('01KJG9PW50AZBTVW5D2NH1RMX3'::char(26)), ('01KPPCN19EGJ2N3JD3JK8Z96NN'::char(26)), ('01KPVMMF4YESS9EGYFCEQRCT7D'::char(26)), ('01KPZZ2WYYW70KRZMJR60NNFDS'::char(26)), ('01KS8K2G7ZT18H3ZA83S7GEMTX'::char(26)), ('01KT11HEJAMNQ7YS8N7FZH4HC4'::char(26)), ('01KTHFS76VYMX80XFVAEH2187Y'::char(26)), ('01KTYJAREWNQ0GM4YVW8WSMB5D'::char(26)), ('01KXPZT066KZ6SWTC9F8BT3VSZ'::char(26)), ('01KXRB11VCGSKA78P4P4W18N1Q'::char(26)), ('01KYVKABD7MKBPMHA3WAVVSSAT'::char(26)), ('01M7EPSSYTVQ8P5BHN9NEPCA7T'::char(26)), ('01M9RN3FGWA0F1ABHDHZNB8SCT'::char(26)), ('01MAJKA5157GYGH4V4B9GZ5CCV'::char(26)), ('01MF0JERZ55TY0G8TRTE867G0B'::char(26)), ('01MWZZM0QH26BDJPR7RG03JCYR'::char(26)), ('01MZ7FEMK09RT3C50Z7QQWXQNA'::char(26)), ('01N0Y1793BXPMM3P9Q7XM7QZQN'::char(26)), ('01N115BNT5ERRNNYXB2W0453J4'::char(26)), ('01N2ZE39DZBC1EH7MZQ3JBZVZE'::char(26)), ('01N3JVRFENQN5BSN9RHY2R29GG'::char(26)), ('01N5P9CR9QWS27CPBKMP1T373M'::char(26)), ('01N6MMSD28WQPZ8FFKHAV1SZPB'::char(26)), ('01N7WZNC8MVRCZFX1J3F0MXMED'::char(26)), ('01NQN2F3VJG4SMRSD42QMXYDC1'::char(26)), ('01NR1PXBYGRAJ28PCP19JYB756'::char(26)), ('01P3DC4H9Z263RM2JKYSZ0X4SN'::char(26)), ('01P539RH13YRVFDWW8MVPZKRW8'::char(26)), ('01P8KSW8B0RW2K466364V6BY7D'::char(26)), ('01P8QYNX7VKY4E43MB3X2DKN8V'::char(26)), ('01PB3YCAGVVTVM7JTSFK8WRWV9'::char(26)), ('01PCF3SAFKH1KVDHMD458MPS5N'::char(26)), ('01PX7AGFX66M57HV6YJTPT3EBM'::char(26)), ('01PZNHC63PPYTHMQ8A9HY1YP7X'::char(26)), ('01Q7ZJ700HE0J7ZV7WM4ZFPXX1'::char(26)), ('01QATDFQQSYK4F5T6P9AXDM637'::char(26)), ('01QBYS90D60720RA1N2J7CREG9'::char(26)), ('01QENWN77TSEM0VB4NGP4BXRNX'::char(26)), ('01QHTD5X15MVEFNBAJ5VPMMDTD'::char(26)), ('01QJKCF8WM7H1GD7CRT3H2VEE4'::char(26)), ('01QKNFYCBFNANRKDXQYWH246GK'::char(26)), ('01QVJBA4F63YYFH9EXN4NF41EC'::char(26)), ('01R03G2X49H8BS4Z52QF8GT3M2'::char(26)), ('01R8RZJ6EGRBK8VSJ7268SXWEG'::char(26)), ('01R9A1SYQA68ZWQY9H9QR2PS3R'::char(26)), ('01RDTES621167B0APPR4WMRPK9'::char(26)), ('01RHDD9SPJ5SC854MGJB3T49KM'::char(26)), ('01RJB6W1QNC1DMK4X9W8GFKEKR'::char(26)), ('01RMB7EYFBKZAF8WWQGKZKSZT6'::char(26)), ('01RPX6K11S6TC7KQDGT0HH575R'::char(26)), ('01RSQ1ZTFX936KW051ECGBBDBV'::char(26)), ('01RW9HW9TW15K16ZAQY5RA1B59'::char(26)), ('01RZPPDRD8XVTPVBBP2YHBJ17S'::char(26)), ('01S865K6GN8KJRCABY71HWH6EF'::char(26)), ('01S8ERTNETXDNXQ72BZ7Y4VPQS'::char(26)), ('01S9VR99FTHRWFJBTG1G722EAC'::char(26)), ('01SCJNCKYRS2V849HPFWCNJP98'::char(26)), ('01SDTT0Q72WSHCJ285XPPPR2G3'::char(26)), ('01SHJ4763YJTWVPY4V4CEE5MRP'::char(26)), ('01SMTYCEY76XY9R7NNKCFSSB79'::char(26)), ('01SRYWNXEYHKAXDW4Y7Y08JNKX'::char(26)), ('01STFTTQBQEXS1TVHSZG1BRK80'::char(26)), ('01T5R2T5EDMC987FEG7WWT8VXA'::char(26)), ('01T9SSP6YVMZJ9DS98E9403YH5'::char(26)), ('01TAWCEMQEN84TZ5RB276SNPFC'::char(26)), ('01TGBRWAWZ6HS48S9GVDV7ZFYR'::char(26)), ('01TQXC952JHY2XEE233WASVEK9'::char(26)), ('01TR5EDP73NPR12S85ENCWR5P3'::char(26)), ('01TTR9AXJMTBN6AD5PZGCAJSC2'::char(26)), ('01TYKK51B54F3BBE05HG0EYGWT'::char(26)), ('01VJXQ59Z0NHFYE5CR9Q2JVXJW'::char(26)), ('01VM56ZSRWX45817Y1Y9Y4RM01'::char(26)), ('01W71JQ9P3T94PABFZ1YVB43AA'::char(26)), ('01W9Q4NS5SPEJ0K676XFHJE5FY'::char(26)), ('01WCTCDT0PJAS0YEHS0P6K1QF7'::char(26)), ('01WMXHPHHFA602G42ZR69GFYZ1'::char(26)), ('01X8J6P8B3TRAC8N0VPB8AJCEB'::char(26)), ('01XDZ19FWPMJX6MKEHFWZMZYW8'::char(26)), ('01XHKD009T4W7MGC7FQTMRSSQ4'::char(26)), ('01XWC8MK7BYH164Z0W9M7N1E5F'::char(26)), ('01YAJ3172F4K9E269SJJVMKY1V'::char(26)), ('01YW7XGKSQC13GN3Q42BRQZATR'::char(26)), ('01ZED2MTT6VP2YAXS4FJQ6F8CZ'::char(26)), ('01ZFQ73C2GSJ3W5VCSC7Q0ZM3C'::char(26)), ('020MYYBFHE385P3SFG5CW9NFA1'::char(26)) ) as "_data"("account_id") CROSS JOIN LATERAL ( SELECT "status"."id" FROM "statuses" AS "status" WHERE ( "status"."account_id" = "_data"."account_id" ) AND ("flags" & 32 = 0) AND ("flags" & 2 = 0) AND ( "status"."id" < '01KVJY68YK0000000000000000' ) ORDER BY "status"."id" DESC LIMIT 100 ) AS "status" ORDER BY "status"."id" DESC LIMIT 100;
                                                                                 QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=1435.53..1435.78 rows=100 width=27) (actual time=238.533..238.557 rows=100 loops=1)
   ->  Sort  (cost=1435.53..1436.30 rows=309 width=27) (actual time=238.533..238.540 rows=100 loops=1)
         Sort Key: status.id DESC
         Sort Method: top-N heapsort  Memory: 36kB
         ->  Nested Loop  (cost=0.56..1423.72 rows=309 width=27) (actual time=0.419..197.809 rows=26106 loops=1)
               ->  Values Scan on "*VALUES*"  (cost=0.00..3.86 rows=309 width=108) (actual time=0.000..2.037 rows=309 loops=1)
               ->  Limit  (cost=0.56..4.57 rows=1 width=27) (actual time=0.041..0.418 rows=84 loops=309)
                     ->  Index Only Scan using statuses_home_timeline_idx on statuses status  (cost=0.56..4.57 rows=1 width=27) (actual time=0.039..0.199 rows=84 loops=309)
                           Index Cond: ((account_id = "*VALUES*".column1) AND (id < '01KVJY68YK0000000000000000'::bpchar))
                           Heap Fetches: 275
 Planning Time: 1.391 ms
 Execution Time: 239.187 ms
(12 rows)
```

Full credit to @cdn0x12 and @oliphant for tireless investigation and suggesting this way or organizing the query.

## Checklist

Please put an x inside each checkbox to indicate that you've read and followed it: `[ ]` -> `[x]`

If this is a documentation change, only the first two checkboxes must be filled (you can delete the others if you want).

- [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md).
- [x] I/we have not used so-called 'AI' to create the proposed changes.
- [x] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat.
- [x] I/we have performed a self-review of added code.
- [x] I/we have written code that is legible and maintainable by others.
- [x] I/we have commented the added code, particularly in hard-to-understand areas.
- [ ] I/we have made any necessary changes to documentation.
- [ ] I/we have added tests that cover new code.
- [x] I/we have run tests and they pass locally with the changes.
- [x] I/we have run `go fmt ./...` and `golangci-lint run`.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4891
2026-06-23 16:28:00 +02:00
tobiandtobi 5caf33de0d [bugfix] Ensure timeline side effects triggered for relayed Announces (#4901)
Fix Announce coming from relays not appearing in timeline streams.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4901
2026-06-23 15:52:56 +02:00
tobiandtobi 4bb89d213f [bugfix] Add support for public:remote stream type (#4899)
Adds support for the `public:remote` stream type, ie., the federated timeline with *only* remote posts in it (as used by masto-fe in the "live feeds -> other servers" tab).

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4899
2026-06-23 15:05:02 +02:00
tobiandtobi d51bec4999 [bugfix/frontend] Fix docs links + remove trailing code for some relay stuff (#4898)
Closes https://codeberg.org/superseriousbusiness/gotosocial/issues/4894

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4898
2026-06-23 09:35:47 +02:00
tobiandtobi 9d03fc482a [bugfix] Depunify account domain in api instance response + web pages (#4897)
Closes https://codeberg.org/superseriousbusiness/gotosocial/issues/4893

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4897
2026-06-23 09:34:13 +02:00
tobiandtobi ce6fd30017 [bugfix] Don't return 500 on forwarded Update targeting an actor (#4892)
# Description

> If this is a code change, please include a summary of what you've coded, and link to the issue(s) it closes/implements.
>
> If this is a documentation change, please briefly describe what you've changed and why.

Instead of returning 500 when someone tries to update someone else's account, return 202 if the receiver is the instance account (likely forwarded Update from a relay) or return 403 otherwise.

Closes https://codeberg.org/superseriousbusiness/gotosocial/issues/4889

## Checklist

Please put an x inside each checkbox to indicate that you've read and followed it: `[ ]` -> `[x]`

If this is a documentation change, only the first two checkboxes must be filled (you can delete the others if you want).

- [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md).
- [x] I/we have not used so-called 'AI' to create the proposed changes.
- [x] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat.
- [x] I/we have performed a self-review of added code.
- [x] I/we have written code that is legible and maintainable by others.
- [x] I/we have commented the added code, particularly in hard-to-understand areas.
- [x] I/we have made any necessary changes to documentation.
- [ ] I/we have added tests that cover new code.
- [x] I/we have run tests and they pass locally with the changes.
- [x] I/we have run `go fmt ./...` and `golangci-lint run`.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4892
Reviewed-by: kim <gruf@noreply.codeberg.org>
2026-06-23 08:28:39 +02:00
tobiandtobi 663d725c92 [bugfix] Call dereferencer hook for relayed status to put in timeline(s) (#4887)
# Description

> If this is a code change, please include a summary of what you've coded, and link to the issue(s) it closes/implements.
>
> If this is a documentation change, please briefly describe what you've changed and why.

Fixes an issue where newly dereferenced statuses sent to us by a relay were not being added to timelines properly.

Credit to lisko (matrix chat) for finding the bug.

## Checklist

Please put an x inside each checkbox to indicate that you've read and followed it: `[ ]` -> `[x]`

If this is a documentation change, only the first two checkboxes must be filled (you can delete the others if you want).

- [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md).
- [x] I/we have not used so-called 'AI' to create the proposed changes.
- [x] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat.
- [x] I/we have performed a self-review of added code.
- [x] I/we have written code that is legible and maintainable by others.
- [x] I/we have commented the added code, particularly in hard-to-understand areas.
- [x] I/we have made any necessary changes to documentation.
- [ ] I/we have added tests that cover new code.
- [x] I/we have run tests and they pass locally with the changes.
- [x] I/we have run `go fmt ./...` and `golangci-lint run`.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4887
Reviewed-by: kim <gruf@noreply.codeberg.org>
2026-06-20 14:36:43 +02:00
nicole mikołajczykandtobi 0b9a273c00 [docs] fix default param value definition (#4886)
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>

## Checklist

- [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md).
- [x] I/we have not used so-called 'AI' to create the proposed changes.
- [ ] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat.
- [x] I/we have performed a self-review of added code.
- [x] I/we have written code that is legible and maintainable by others.
- [x] I/we have commented the added code, particularly in hard-to-understand areas.
- [x] I/we have made any necessary changes to documentation.
- [ ] I/we have added tests that cover new code.
- [ ] I/we have run tests and they pass locally with the changes.
- [ ] I/we have run `go fmt ./...` and `golangci-lint run`.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4886
2026-06-20 09:24:09 +02:00
tobiandtobi d40aefec8a [bugfix] fix erroneus use of RelayConnectionCreateRequest when updating a relay push (#4884)
Whoops! Fixes `Code 400: Bad Request: Key: 'RelayConnectionCreateRequest.RelayActorURI' Error:Field validation for 'RelayActorURI' failed on the 'required' tag` when updating a relay push.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4884
2026-06-19 11:41:18 +02:00
tobiandtobi 8737f05c47 [feature] Unfollow relay actor if no connections exist targeting that actor (#4880)
# Description

> If this is a code change, please include a summary of what you've coded, and link to the issue(s) it closes/implements.
>
> If this is a documentation change, please briefly describe what you've changed and why.

As it says, if a connection targeting a relay actor gets removed, any follow (req) targeting that relay actor will also now be undone if no connections to that actor remain in the db.

This allows instance admins to remove all connections targeting an actor, and create them again, essentially retrying sending the follow request.

## Checklist

Please put an x inside each checkbox to indicate that you've read and followed it: `[ ]` -> `[x]`

If this is a documentation change, only the first two checkboxes must be filled (you can delete the others if you want).

- [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md).
- [x] I/we have not used so-called 'AI' to create the proposed changes.
- [x] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat.
- [x] I/we have performed a self-review of added code.
- [x] I/we have written code that is legible and maintainable by others.
- [x] I/we have commented the added code, particularly in hard-to-understand areas.
- [x] I/we have made any necessary changes to documentation.
- [ ] I/we have added tests that cover new code.
- [x] I/we have run tests and they pass locally with the changes.
- [x] I/we have run `go fmt ./...` and `golangci-lint run`.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4880
2026-06-19 10:53:18 +02:00
tobiandtobi 67b8b88b76 [chore] Just debug log wrong type (eg., dereffing Announce of Announce) in createAnnounceFromRelay (#4881)
# Description

> If this is a code change, please include a summary of what you've coded, and link to the issue(s) it closes/implements.
>
> If this is a documentation change, please briefly describe what you've changed and why.

Log only at debug level when we try get delivered an Announce of an Announce by a relay and try to deref the wrapped Announce as a status, we don't need to handle these or log big errors when we encounter them.

## Checklist

Please put an x inside each checkbox to indicate that you've read and followed it: `[ ]` -> `[x]`

If this is a documentation change, only the first two checkboxes must be filled (you can delete the others if you want).

- [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md).
- [x] I/we have not used so-called 'AI' to create the proposed changes.
- [x] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat.
- [x] I/we have performed a self-review of added code.
- [x] I/we have written code that is legible and maintainable by others.
- [x] I/we have commented the added code, particularly in hard-to-understand areas.
- [x] I/we have made any necessary changes to documentation.
- [ ] I/we have added tests that cover new code.
- [x] I/we have run tests and they pass locally with the changes.
- [x] I/we have run `go fmt ./...` and `golangci-lint run`.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4881
2026-06-19 10:52:54 +02:00
tobiandtobi c53f27bc1c [bugfix] don't error on db.ErrNoEntries in OnMediaDereference callback (#4874)
# Description

> If this is a code change, please include a summary of what you've coded, and link to the issue(s) it closes/implements.
>
> If this is a documentation change, please briefly describe what you've changed and why.

Handles all those `error dereferencing media: func3: db error getting status: sql: no rows in result set` error messages.

## Checklist

Please put an x inside each checkbox to indicate that you've read and followed it: `[ ]` -> `[x]`

If this is a documentation change, only the first two checkboxes must be filled (you can delete the others if you want).

- [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md).
- [x] I/we have not used so-called 'AI' to create the proposed changes.
- [x] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat.
- [x] I/we have performed a self-review of added code.
- [x] I/we have written code that is legible and maintainable by others.
- [x] I/we have commented the added code, particularly in hard-to-understand areas.
- [ ] I/we have made any necessary changes to documentation.
- [ ] I/we have added tests that cover new code.
- [x] I/we have run tests and they pass locally with the changes.
- [x] I/we have run `go fmt ./...` and `golangci-lint run`.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4874
2026-06-18 17:45:44 +02:00
kimandtobi 620bfa1fe6 [bugfix] disable outgoing http2 requests until superseriousbusiness/httpsig is updated (#4879)
Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4879
2026-06-18 16:21:06 +02:00
tobiandtobi 26eb2c7e94 [chore] use time.Now() when published prop not present on Announce from relay actor (#4872)
As it says on the tin!

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4872
2026-06-17 17:28:13 +02:00
tobiandtobi 4e47c7625b [docs] Add note about Postgres docker shm-size parameter (#4873)
As it says! It's a common error when doing the second VACUUM command.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4873
2026-06-17 17:12:28 +02:00
kimandkim ad9418c93b [bugfix] only mark status as edited for streaming hooks if edited_at column has changed (#4867)
Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4867
2026-06-17 12:46:25 +02:00
tobiandtobi b201dbeda5 [bugfix] Remove admin check on user-level relay push matchers (#4870)
🤦

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4870
2026-06-17 11:46:24 +02:00
tobiandtobi b833c9666e [bugfix] set statuses-cleanup-remote-older-than to "0s", skip scheduling if 0 (#4869)
# Description

> If this is a code change, please include a summary of what you've coded, and link to the issue(s) it closes/implements.
>
> If this is a documentation change, please briefly describe what you've changed and why.

Fixes https://codeberg.org/superseriousbusiness/gotosocial/issues/4868 by changing default to 0s instead of 0.

Also skips scheduling statuses cleanup if duration is not > 0 as there's no point.

## Checklist

Please put an x inside each checkbox to indicate that you've read and followed it: `[ ]` -> `[x]`

If this is a documentation change, only the first two checkboxes must be filled (you can delete the others if you want).

- [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md).
- [x] I/we have not used so-called 'AI' to create the proposed changes.
- [x] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat.
- [x] I/we have performed a self-review of added code.
- [x] I/we have written code that is legible and maintainable by others.
- [x] I/we have commented the added code, particularly in hard-to-understand areas.
- [x] I/we have made any necessary changes to documentation.
- [ ] I/we have added tests that cover new code.
- [x] I/we have run tests and they pass locally with the changes.
- [x] I/we have run `go fmt ./...` and `golangci-lint run`.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4869
2026-06-17 11:32:06 +02:00
tobiandtobi aec4f4610a [bugfix] Update go-sqlite3 to v0.35.1 to fix out of memory panic during migration (#4864)
Regression was introduced in v0.34.1; all versions above that panic as described in https://codeberg.org/superseriousbusiness/gotosocial/issues/4862, until the fix from https://github.com/ncruces/go-sqlite3/commit/d581398704480342712fd89572d55cb064ad6fcc

Closes https://codeberg.org/superseriousbusiness/gotosocial/issues/4862

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4864
2026-06-16 17:10:17 +02:00
tobiandtobi 1a58374aa7 [bugfix] Fix account domain being used incorrectly in api instance responses (#4863)
Fixes a cheeky little bug I wrote 😎

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4863
2026-06-16 10:42:22 +02:00
tobiandtobi ed164e831e [chore] HTTP server/client config stuff (#4861)
# Description

> If this is a code change, please include a summary of what you've coded, and link to the issue(s) it closes/implements.
>
> If this is a documentation change, please briefly describe what you've changed and why.

Removes unused setting `MaxOpenConnsPerHost`, document http server + client advanced config defaults, set MaxConnsPerHost to default `maxprocs * 10`.

## Checklist

Please put an x inside each checkbox to indicate that you've read and followed it: `[ ]` -> `[x]`

If this is a documentation change, only the first two checkboxes must be filled (you can delete the others if you want).

- [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md).
- [x] I/we have not used so-called 'AI' to create the proposed changes.
- [x] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat.
- [x] I/we have performed a self-review of added code.
- [x] I/we have written code that is legible and maintainable by others.
- [x] I/we have commented the added code, particularly in hard-to-understand areas.
- [x] I/we have made any necessary changes to documentation.
- [ ] I/we have added tests that cover new code.
- [x] I/we have run tests and they pass locally with the changes.
- [x] I/we have run `go fmt ./...` and `golangci-lint run`.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4861
2026-06-15 14:50:16 +02:00
tobiandtobi c6388ed088 [frontend] tweak account directory styling (#4860)
Makes it look a bit better on smaller screens by removing unnecessary padding.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4860
2026-06-15 10:48:07 +02:00
kimandtobi 542c57f716 [docs] update list of supported platforms regarding recent changes to ncruces/go-sqlite3 and our build tag behaviour (#4858)
Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4858
2026-06-15 09:40:14 +02:00
kimandtobi c35d2b7264 [bugfix] temporarily removes the sqlite vacuum CLI action, as it seems to fail with i/o issues (#4859)
Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4859
2026-06-15 09:36:41 +02:00
tobiandtobi 40ed94590f [docs] Update db maintenance docs, add status cleanup docs, update media cleanup docs (#4857)
Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4857
Reviewed-by: kim <gruf@noreply.codeberg.org>
2026-06-15 09:34:28 +02:00
kimandkim f85412164e [bugfix] nowasm: on context cancel hook, check that process is non-nil before calling Kill() (#4855)
closes: https://codeberg.org/superseriousbusiness/gotosocial/issues/4790

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4855
2026-06-14 14:17:19 +02:00
kimandkim 19d294ebba [chore] update dependencies (#4854)
- github.com/ncruces/go-sqlite3: v0.34.4 -> v0.35.0
- golang.org/x/crypto: v0.52.0 -> v0.53.0
- golang.org/x/image: v0.41.0 -> v0.42.0
- golang.org/x/net: v0.55.0 -> v0.56.0
- golang.org/x/sys: v0.45.0 -> v0.46.0
- golang.org/x/text: v0.37.0 -> v0.38.0
- modernc.org/sqlite: v1.50.1 -> v1.52.0

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4854
2026-06-12 22:07:06 +02:00
tobiandtobi 4ce10bdb5e [bugfix] Fix error message for account-domain/host validation being the wrong way around (#4851)
Closes https://codeberg.org/superseriousbusiness/gotosocial/issues/4850

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4851
2026-06-08 15:45:00 +02:00
kimandkim 06c10bba83 [chore] update dependencies (#4848)
- ~~github.com/go-swagger/go-swagger: v0.33.2 -> v0.34.0~~ ignoring for now
- github.com/jackc/pgx/v5: v5.9.2 -> v5.10.0
- github.com/minio/minio-go/v7: v7.1.0 -> v7.2.0
- github.com/mitchellh/mapstructure: v1.5.0 -> v1.5.0
- github.com/ncruces/go-sqlite3: v0.34.2 -> v0.34.4
- github.com/tetratelabs/wazero: v1.11.0 -> v1.12.0
- go.opentelemetry.io/contrib/exporters/autoexport: v0.68.0 -> v0.69.0
- go.opentelemetry.io/contrib/instrumentation/runtime: v0.68.0 -> v0.69.0
- golang.org/x/image: v0.40.0 -> v0.41.0
- codeberg.org/gruf/go-ffmpreg: v0.6.19 -> v0.6.20

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4848
2026-06-05 00:31:09 +02:00
tobiandtobi 8bc9103f01 [chore] Return 202 when we're *forwarded* an activity originating from a domain we block (#4844)
# Description

> If this is a code change, please include a summary of what you've coded, and link to the issue(s) it closes/implements.
>
> If this is a documentation change, please briefly describe what you've changed and why.

Solves an annoying issue where we returning 403 to inbox posts when the caller wasn't actually blocked, but was forwarding us an activity originating from a domain that is blocked. Instead we now just return 202 and drop the activity.

Also removes a bit of cruft with a custom error type and uses gtserror.NotRelevant instead.

## Checklist

Please put an x inside each checkbox to indicate that you've read and followed it: `[ ]` -> `[x]`

If this is a documentation change, only the first two checkboxes must be filled (you can delete the others if you want).

- [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md).
- [x] I/we have not used so-called 'AI' to create the proposed changes.
- [ ] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat.
- [x] I/we have performed a self-review of added code.
- [x] I/we have written code that is legible and maintainable by others.
- [x] I/we have commented the added code, particularly in hard-to-understand areas.
- [x] I/we have made any necessary changes to documentation.
- [ ] I/we have added tests that cover new code.
- [x] I/we have run tests and they pass locally with the changes.
- [x] I/we have run `go fmt ./...` and `golangci-lint run`.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4844
2026-06-04 15:18:41 +02:00
tobiandtobi 3fe273cbd9 [feature] Show explanation when user shows no posts on the web (#4846)
# Description

> If this is a code change, please include a summary of what you've coded, and link to the issue(s) it closes/implements.
>
> If this is a documentation change, please briefly describe what you've changed and why.

This pull request updates some of our templating to add a little explainer at the bottom of the page when a profile doesn't show posts on the web view, and also renders such a profile in a wide view as there's no need for a double-column thingy if there's no posts.

![image](/attachments/4ce20e13-3cfa-405d-bb7b-450a33e2620e)

## Checklist

Please put an x inside each checkbox to indicate that you've read and followed it: `[ ]` -> `[x]`

If this is a documentation change, only the first two checkboxes must be filled (you can delete the others if you want).

- [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md).
- [x] I/we have not used so-called 'AI' to create the proposed changes.
- [x] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat.
- [x] I/we have performed a self-review of added code.
- [x] I/we have written code that is legible and maintainable by others.
- [x] I/we have commented the added code, particularly in hard-to-understand areas.
- [ ] I/we have made any necessary changes to documentation.
- [ ] I/we have added tests that cover new code.
- [x] I/we have run tests and they pass locally with the changes.
- [x] I/we have run `go fmt ./...` and `golangci-lint run`.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4846
2026-06-02 16:01:38 +02:00
tobiandtobi a77b44caec [feature] better error pages + handling for hidden or gone statuses (#4840)
# Description

> If this is a code change, please include a summary of what you've coded, and link to the issue(s) it closes/implements.
>
> If this is a documentation change, please briefly describe what you've changed and why.

Update some of our templating and error handling so that deleted local statuses return 410 Gone with a page explaining what's up, and statuses not visible in the web view return a 401 Unauthorized page with a link to copy the status and paste it into a client.

![Screenshot from 2026-05-27 14-33-29](/attachments/f41bd8ea-34c4-4862-ac5e-39c3c0efe6c5)

![Screenshot from 2026-05-27 14-33-11](/attachments/238a1678-adc0-4540-b279-cc39adf98c15)

## Checklist

Please put an x inside each checkbox to indicate that you've read and followed it: `[ ]` -> `[x]`

If this is a documentation change, only the first two checkboxes must be filled (you can delete the others if you want).

- [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md).
- [x] I/we have not used so-called 'AI' to create the proposed changes.
- [x] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat.
- [x] I/we have performed a self-review of added code.
- [x] I/we have written code that is legible and maintainable by others.
- [x] I/we have commented the added code, particularly in hard-to-understand areas.
- [ ] I/we have made any necessary changes to documentation.
- [ ] I/we have added tests that cover new code.
- [x] I/we have run tests and they pass locally with the changes.
- [x] I/we have run `go fmt ./...` and `golangci-lint run`.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4840
2026-06-02 11:37:21 +02:00
tobiandtobi 10244f032b [docs] Update database maintenance docs to specify using the gts binary to run analyze (#4843)
That's it! Reason for the change is explained in the added docs:

```markdown
It's very important that when doing an analyze, you use the GoToSocial binary, and **not** the `sqlite3` command line tool.

This is because the version of SQLite used in the GoToSocial binary has the compile-time flag `SQLITE_ENABLE_STAT4` enabled, which leads to much more thorough analysis and better query plans.

If you run `analyze` using the `sqlite3` command line tool, you risk severely degrading performance for certain timeline and profile page queries!

For more info on `SQLITE_ENABLE_STAT4`, see [the SQLite compilation flag docs](https://sqlite.org/compile.html#enable_stat4).
```

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4843
2026-05-28 16:59:14 +02:00
tobiandtobi 47772362b9 [frontend] Update media cleanup form to better reflect API (#4839)
Clarify a bit of language on the form so users know they can submit duration strings as well as days.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4839
2026-05-26 15:03:48 +02:00
tobiandkim cc3af19e78 [feature] Allow sorting access tokens by last_used, allow setting name per access token (#4833)
This pull request adds database + frontend functionality to sort the token view by last used time (most recent to oldest), and allows users to set a name per token, as a reminder of why the token was created / what device is using it, etc.

Also updates the token "last_used" updater to allow per-minute granularity instead of per-hour, since sorting by last_used is very confusing when you've just used a token but it's not shown up at the top of the list yet because you used it some time within the last hour.

Closes: https://codeberg.org/superseriousbusiness/gotosocial/issues/4689
Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4833
2026-05-26 15:00:51 +02:00
tobiandtobi c8f6ef8028 [chore] Don't error message when unable to enrich mention because remote is blocked (#4838)
# Description

> If this is a code change, please include a summary of what you've coded, and link to the issue(s) it closes/implements.
>
> If this is a documentation change, please briefly describe what you've changed and why.

Updates logging when failing to enrich mentions, so that we don't log at error level when the mention isn't enriched because the remote is blocked.

## Checklist

Please put an x inside each checkbox to indicate that you've read and followed it: `[ ]` -> `[x]`

If this is a documentation change, only the first two checkboxes must be filled (you can delete the others if you want).

- [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md).
- [x] I/we have not used so-called 'AI' to create the proposed changes.
- [x] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat.
- [x] I/we have performed a self-review of added code.
- [x] I/we have written code that is legible and maintainable by others.
- [x] I/we have commented the added code, particularly in hard-to-understand areas.
- [ ] I/we have made any necessary changes to documentation.
- [ ] I/we have added tests that cover new code.
- [x] I/we have run tests and they pass locally with the changes.
- [x] I/we have run `go fmt ./...` and `golangci-lint run`.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4838
2026-05-26 13:52:43 +02:00
tobiandkim de2e6a066e [bugfix] Always return 401 unauthorized when deref of pubkey fails (#4836)
We should only be returning a 500 internal error for this when there's actually an internal error.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4836
2026-05-23 22:48:12 +02:00
kimandkim 1a0e3fda41 [bugfix] fix error format strings (#4835)
Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4835
2026-05-23 22:20:45 +02:00
tobiandtobi b765e749be [feature] Forward outgoing creates, updates, and deletes to relay pushes (#4820)
# Description

> If this is a code change, please include a summary of what you've coded, and link to the issue(s) it closes/implements.
>
> If this is a documentation change, please briefly describe what you've changed and why.

This should be the last PR finishing off relay support. Adds forwarding of creates, updates, and deletes of statuses to push relays configured by the author, using the instance account to do the forwarding.

Related to https://codeberg.org/superseriousbusiness/gotosocial/pulls/4810, https://codeberg.org/superseriousbusiness/gotosocial/pulls/4796, and https://codeberg.org/superseriousbusiness/gotosocial/issues/1123

## Checklist

Please put an x inside each checkbox to indicate that you've read and followed it: `[ ]` -> `[x]`

If this is a documentation change, only the first two checkboxes must be filled (you can delete the others if you want).

- [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md).
- [x] I/we have not used so-called 'AI' to create the proposed changes.
- [x] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat.
- [x] I/we have performed a self-review of added code.
- [x] I/we have written code that is legible and maintainable by others.
- [x] I/we have commented the added code, particularly in hard-to-understand areas.
- [ ] I/we have made any necessary changes to documentation.
- [ ] I/we have added tests that cover new code.
- [x] I/we have run tests and they pass locally with the changes.
- [x] I/we have run `go fmt ./...` and `golangci-lint run`.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4820
2026-05-22 11:47:27 +02:00
bae8f079f0 [feature] add statuses multi GET endpoint (#4814)
this follows on from the work of @cdn0x12 in https://codeberg.org/superseriousbusiness/gotosocial/pulls/4795 but modifies the implementation to better make use of our multi lookup database and cache calls.

in addition to the above, this moves much of the surfacing (timelining and notifying) logic to derefencer hooks that are now setup to be called on dereference of accounts, statuses, media and emojis. though only statuses and media are hooked up for now.

Co-authored-by: cdn0x12 <git@cdn0x12.dev>
Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4814
2026-05-21 11:18:35 +02:00
kimandkim 2c9a2c6e2c [chore] updated dependencies (#4831)
- code.superseriousbusiness.org/gopkg: v0.0.0-20260503204153-b9100c6c75dd -> v0.0.0-20260520114201-7a01c90db818
- github.com/klauspost/compress: v1.18.4 -> v1.18.6
- github.com/ncruces/go-sqlite3: v0.34.1 -> v0.34.2
- modernc.org/sqlite: v1.50.0 -> v1.50.1

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4831
2026-05-21 00:48:41 +02:00
tobiandtobi 7161b5c7db [chore] Add more bullshit crawlers to robots.txt 🖕 (#4829)
Beep boop.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4829
2026-05-19 15:30:18 +02:00
tobiandtobi e0bc24aadc [bugfix] don't return 500 error on unsupported Announce forwards (#4828)
Closes https://codeberg.org/superseriousbusiness/gotosocial/issues/4750

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4828
2026-05-19 14:20:08 +02:00