100 Commits
Author SHA1 Message Date
dangered wolf 78aa6eb261 feat: improve replying to text on non-discord 2026-09-28 14:03:37 -07:00
dangered wolf f1664ec622 fix: maybe fix xctid 2026-09-27 22:55:04 -07:00
dangered wolf a2e220c2b8 fix: only add csrf tokens with add_csrf 2026-09-27 14:08:24 -07:00
dangered wolf a49cbda7a0 Merge branch 'main' of https://github.com/FxEmbed/FxEmbed 2026-09-27 10:15:05 -07:00
dangered wolf fba752fc7b temp increase maxAttempts 2026-09-27 10:15:03 -07:00
dangered wolf 89e230bb1f Merge pull request #2510 from agammann/fix/bluesky-external-card-thumbnail
fix(bluesky): use external card thumbnails as image media
2026-09-27 10:03:44 -07:00
dangered wolf e0c3d9f0cc Merge branch 'main' into fix/bluesky-external-card-thumbnail 2026-09-27 10:02:21 -07:00
dangered wolf 01bbce7522 Merge pull request #2518 from humairaambreen/fix/telegram-photo-size
fix(telegram): use scaled X photos in Instant View
2026-09-27 09:58:24 -07:00
dangered wolf 845bca84ca Merge branch 'main' into fix/telegram-photo-size 2026-09-27 09:57:05 -07:00
dangered wolf 88ce7e7cdc Merge pull request #2511 from agammann/feat/bluesky-single-photo-embed
feat(bluesky): support single photo embed URLs
2026-09-27 09:56:50 -07:00
dangered wolf 5d917e031b Merge branch 'main' into feat/bluesky-single-photo-embed 2026-09-27 09:55:31 -07:00
dangered wolf 093489903e Merge pull request #2508 from FxEmbed/renovate/dotenv-18.x
chore(deps): update dependency dotenv to v18
2026-09-27 09:49:36 -07:00
dangered wolf 6d849830c4 Merge branch 'main' into fix/telegram-photo-size 2026-09-27 09:48:49 -07:00
dangered wolf c34daf4872 Merge pull request #2509 from agammann/fix/bluesky-media-feed-replies
fix(bluesky): apply with_replies to media RSS and Atom feeds
2026-09-26 10:17:53 -07:00
dangered wolf 5e8165fee0 Merge branch 'main' into feat/bluesky-single-photo-embed 2026-09-26 10:17:01 -07:00
dangered wolf f52af833d3 Merge branch 'main' into fix/bluesky-external-card-thumbnail 2026-09-26 10:14:49 -07:00
dangered wolf a38b8e1846 Merge branch 'main' into fix/bluesky-media-feed-replies 2026-09-26 10:13:17 -07:00
dangered wolf 726bbafe6d Merge pull request #2516 from FxEmbed/cursor/telegram-instagram-video-direct-a3b6
Serve Instagram videos directly to Telegram
2026-09-26 10:11:48 -07:00
dangered wolf 8f2e449405 Merge branch 'main' into cursor/telegram-instagram-video-direct-a3b6 2026-09-26 10:10:16 -07:00
dangered wolf 4c16a805e6 Merge pull request #2446 from iAverages/feat/angle-brackets
feat: escape angle brackets
2026-09-17 11:30:01 -04:00
dangered wolf c56321aac8 Merge branch 'main' into feat/angle-brackets 2026-09-17 11:26:44 -04:00
dangered wolf c07fa865fa Merge branch 'main' into feat/angle-brackets 2026-09-17 11:23:46 -04:00
dangered wolf e4bf81c64b chore: redeploy with updated credentials 2026-08-28 19:29:39 -04:00
dangered wolf a6b02e6a83 Merge pull request #2405 from FxEmbed/cursor/fix-spoiler-translated-tweet-d4bf
fix(embed): ignore Discord spoiler markers on translated URLs
2026-08-28 07:02:19 -04:00
dangered wolf 0dd9e4aed4 Merge branch 'main' into cursor/fix-spoiler-translated-tweet-d4bf 2026-08-28 07:00:41 -04:00
dangered wolf aa09b4c887 chore: bump wrangler and workers types 2026-08-28 06:53:51 -04:00
dangered wolf 4e1d411722 Update package-lock.json 2026-08-28 06:52:27 -04:00
dangered wolf 1682a6f3df Merge pull request #2260 from FxEmbed/renovate/cloudflare-workers-types-5.x
chore(deps): update dependency @cloudflare/workers-types to v5
2026-08-28 06:48:51 -04:00
dangered wolf 9e48747f8a ugh so annoying 2026-08-28 06:41:11 -04:00
dangered wolf b8959dc4f9 chore: bump @cloudflare/workers-types 2026-08-28 06:35:48 -04:00
dangered wolf a524698396 chore: update packages 2026-08-28 06:34:53 -04:00
dangered wolf 660b72595a Merge pull request #2402 from FxEmbed/improve-tiktok-api
feat: expand TikTok API
2026-08-28 06:26:49 -04:00
dangered wolf c9d0992a39 Merge branch 'improve-tiktok-api' of https://github.com/FxEmbed/FxEmbed into improve-tiktok-api 2026-08-28 06:24:07 -04:00
dangered wolf 2f6a8d4421 fix: various code review fixes 2026-08-28 06:22:25 -04:00
dangered wolf 36980877c6 feat(atmosphere): expand tiktok api 2026-08-28 06:12:39 -04:00
dangered wolf 0a756073f5 Merge pull request #2390 from FxEmbed/improve-instagram-threads
feat: improve APi coverage of instagram / threads
2026-08-28 06:08:54 -04:00
dangered wolf 2a79a4b890 Merge branch 'main' into improve-instagram-threads 2026-08-28 05:54:54 -04:00
dangered wolf 8ba6e7baf3 Merge pull request #2384 from richardmilles/fix/2365-mosaic-openapi-optional
fix: make mosaic url/width/height optional in OpenAPI
2026-08-28 05:54:30 -04:00
dangered wolf 50e1d8da03 Merge branch 'main' into fix/2365-mosaic-openapi-optional 2026-08-28 05:53:18 -04:00
dangered wolf 8b8fee5968 Merge pull request #2385 from richardmilles/fix/1494-traditional-chinese-lang
fix: restore Traditional Chinese translation language codes
2026-08-28 05:53:10 -04:00
dangered wolf 76191fe3a3 Merge branch 'main' into fix/1494-traditional-chinese-lang 2026-08-28 05:50:36 -04:00
dangered wolfandCursor Agent 9f133b6671 fix(instagram): apply request timeout to private API body read (#2401)
Fetch can resolve when headers arrive, so a stalled res.text() hung
outside withTimeout and never rotated accounts. Read and parse the
body inside the timed callback so AbortError retries then rotates.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-08-28 05:50:16 -04:00
dangered wolfandCursor Agent e4bcdb3531 fix(threads): keep account-proxy cookies off auto-followed redirects (#2400)
* fix(threads): reject off-origin redirects on account-proxy fetches

Stop fetch from auto-following Location hops with session cookies.
workerd does not implement redirect: 'error', so use manual mode and
only follow same-origin HTTPS targets.

Co-authored-by: dangered wolf <d@ngeredwolf.me>

* fix(instagram): apply same-origin HTTPS redirect policy to account-proxy

Instagram's private API fetch had the same cookie-forwarding default as
Threads. Share fetchSameOriginHttps and use it in both account proxies.

Co-authored-by: dangered wolf <d@ngeredwolf.me>

* test: use an unparseable Location in same-origin redirect coverage

`::::` is a valid relative path against the request URL, so it was not
a useful junk-Location case.

Co-authored-by: dangered wolf <d@ngeredwolf.me>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-08-28 05:43:47 -04:00
dangered wolf 0b385fd7e8 Merge branch 'main' into fix/2365-mosaic-openapi-optional 2026-08-28 05:36:48 -04:00
dangered wolf 491b419cb5 Merge branch 'main' into fix/1494-traditional-chinese-lang 2026-08-28 05:36:17 -04:00
dangered wolf ebc09b782c Revert "fix(threads): reject redirects on cookie-authenticated private API fetches (#2397)"
This reverts commit 0545509671.
2026-08-28 05:34:15 -04:00
dangered wolf 31a3228a72 feat(atmosphere): expand tiktok api 2026-08-28 05:33:59 -04:00
0545509671 fix(threads): reject redirects on cookie-authenticated private API fetches (#2397)
* feat: improve APi coverage of instagram / threads

* Update packages/atmosphere/src/providers/threads/private-processor.ts

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* fix(instagram): rotate accounts on private API status=fail (#2391)

* fix(instagram): treat private API status=fail as rotation failure

Parseable 2xx bodies with status: fail (checkpoint, spam block) were
returned as ok: true, which hid empty results and skipped the next
configured account. Match the Threads proxy: mark them failed and rotate.

Co-authored-by: dangered wolf <d@ngeredwolf.me>

* style: prettier Instagram status=fail test fixture

Co-authored-by: dangered wolf <d@ngeredwolf.me>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>

* fix(instagram,threads): constrain private-API pages to requested count (#2394)

Pass count through Instagram comments and Threads replies/profile-feed
fetches so next-page cursors match the truncated page instead of skipping
items.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>

* fix(threads): decode search cursors as UTF-8 before JSON.parse (#2395)

b64urlDecode returns an atob binary string. Search queries can contain
non-ASCII text, so convert those bytes with TextDecoder before parsing.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>

* fix(threads): apply request timeout to private API body read (#2396)

* fix(threads): apply request timeout to private API body read

Fetch can resolve once headers arrive, leaving res.text() and JSON.parse
outside withTimeout. Keep both inside the timed operation so a stalled
body aborts, retries, and rotates accounts.

Co-authored-by: dangered wolf <d@ngeredwolf.me>

* fix(threads): drop unused initializers in private API timeout path

Co-authored-by: dangered wolf <d@ngeredwolf.me>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>

* fix(threads): reject redirects on cookie-authenticated private API fetches

Do not follow 3xx responses when sending account session cookies, so a
redirect cannot leak credentials to another origin.

Co-authored-by: dangered wolf <d@ngeredwolf.me>

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-08-28 05:32:27 -04:00
dangered wolfandCursor Agent 8d30e84c91 fix(threads): apply request timeout to private API body read (#2396)
* fix(threads): apply request timeout to private API body read

Fetch can resolve once headers arrive, leaving res.text() and JSON.parse
outside withTimeout. Keep both inside the timed operation so a stalled
body aborts, retries, and rotates accounts.

Co-authored-by: dangered wolf <d@ngeredwolf.me>

* fix(threads): drop unused initializers in private API timeout path

Co-authored-by: dangered wolf <d@ngeredwolf.me>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-08-28 01:14:59 -04:00
dangered wolfandCursor Agent 351b1006ad fix(threads): decode search cursors as UTF-8 before JSON.parse (#2395)
b64urlDecode returns an atob binary string. Search queries can contain
non-ASCII text, so convert those bytes with TextDecoder before parsing.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-08-28 01:12:09 -04:00
dangered wolfandCursor Agent 7460aad2d8 fix(instagram,threads): constrain private-API pages to requested count (#2394)
Pass count through Instagram comments and Threads replies/profile-feed
fetches so next-page cursors match the truncated page instead of skipping
items.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-08-28 01:11:31 -04:00
dangered wolfandCursor Agent c2c9da2ca5 fix(instagram): rotate accounts on private API status=fail (#2391)
* fix(instagram): treat private API status=fail as rotation failure

Parseable 2xx bodies with status: fail (checkpoint, spam block) were
returned as ok: true, which hid empty results and skipped the next
configured account. Match the Threads proxy: mark them failed and rotate.

Co-authored-by: dangered wolf <d@ngeredwolf.me>

* style: prettier Instagram status=fail test fixture

Co-authored-by: dangered wolf <d@ngeredwolf.me>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-08-28 01:06:38 -04:00
dangered wolfandcoderabbitai[bot] 9fa89e2a78 Update packages/atmosphere/src/providers/threads/private-processor.ts
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-08-28 01:06:13 -04:00
dangered wolf b0f1219e09 feat: improve APi coverage of instagram / threads 2026-08-28 00:47:11 -04:00
dangered wolf 7f2d5490da feat(api): bluesky typeahead and user search 2026-08-27 17:49:55 -04:00
dangered wolfandCursor Agent 85ba21c6e4 fix(api): cap FxTwitter /2/search query at 512 characters (#2387)
Reject oversized search queries with HTTP 400 before calling X, matching
SearchTimeline's rawQuery limit, and map the upstream length error if it
still appears.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-08-22 13:46:20 -04:00
dangered wolf 4c2bdbc8fe Merge pull request #2341 from Marjani/main
Add Dockerfile and docker-compose.yml
2026-08-20 12:34:36 -04:00
dangered wolf 5e746c11db fix(docker): run as dedicated user and not root 2026-08-20 12:32:55 -04:00
dangered wolf e9acfc8744 fix(docker): exclude local env from built image 2026-08-20 12:31:15 -04:00
dangered wolf f1a104b446 Merge branch 'main' into main 2026-08-20 12:30:12 -04:00
dangered wolf de87827335 Merge branch 'main' into main 2026-08-20 12:27:28 -04:00
dangered wolf 46f1bd4e70 Merge pull request #2356 from OctoBored/fix/star-history-chart
Fix broken star history chart
2026-08-20 12:25:09 -04:00
dangered wolf db41bc9f0b Merge branch 'main' into main 2026-08-20 12:24:55 -04:00
dangered wolf 5cadaed353 Merge branch 'main' into fix/star-history-chart 2026-08-20 12:23:22 -04:00
dangered wolfandCursor Agent eae1fa81d6 fix: enable Telegram Instant View for posts with multiple videos (#2375)
Telegram can only preview one video in a link card. Instant View already
renders every video in the body when forced via i., but video-only posts
never opted into IV automatically. Turn it on when a post has more than
one video so all clips are reachable from the preview.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-08-19 19:03:17 -04:00
dangered wolfandCursor Agent db75368948 Hide about author section in Instagram Instant View (#2348)
Instagram author profile details are incomplete, so omit the
about-author footer in Instant View the same way we do for Bluesky.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-08-11 15:52:55 +00:00
dangered wolf 209493321c Merge pull request #2299 from FxEmbed/cursor/instagram-polaris-extract-70d9
fix(instagram): rework post fetch to yt-dlp Polaris path
2026-07-29 17:22:41 -07:00
dangered wolf 83770c95ea Merge branch 'main' into cursor/instagram-polaris-extract-70d9 2026-07-29 17:21:00 -07:00
dangered wolf d15f5b27e9 Merge branch 'cursor/instagram-polaris-extract-70d9' of https://github.com/FxEmbed/FxEmbed into cursor/instagram-polaris-extract-70d9 2026-07-27 11:12:59 -07:00
dangered wolf 251accab1d fix(instagram): telegram size algorithm 2026-07-27 11:12:47 -07:00
dangered wolf 07f8971160 Merge branch 'main' into cursor/instagram-polaris-extract-70d9 2026-07-27 11:12:01 -07:00
dangered wolf 32e7b07e08 Merge branch 'cursor/instagram-polaris-extract-70d9' of https://github.com/FxEmbed/FxEmbed into cursor/instagram-polaris-extract-70d9 2026-07-27 02:14:07 -07:00
dangered wolf 982effb8fd feat: test ig tg size limit 2026-07-27 02:13:52 -07:00
dangered wolf 0a5690d1ca Merge branch 'main' into cursor/instagram-polaris-extract-70d9 2026-07-27 02:12:42 -07:00
dangered wolf 1338b65ac1 fix: misc bugfixes 2026-07-26 11:30:34 -07:00
dangered wolf 22c85ca981 Merge branch 'cursor/instagram-polaris-extract-70d9' of https://github.com/FxEmbed/FxEmbed into cursor/instagram-polaris-extract-70d9 2026-07-25 21:21:48 -07:00
dangered wolf 83043ebc95 chore: run prettier 2026-07-25 21:21:41 -07:00
dangered wolf bbd262c24d Merge branch 'main' into cursor/instagram-polaris-extract-70d9 2026-07-25 21:21:27 -07:00
dangered wolf 3362a6cf98 Merge pull request #2291 from FxEmbed/renovate/actions-setup-node-7.x
chore(deps): update actions/setup-node action to v7
2026-07-25 21:21:16 -07:00
dangered wolf a97fb4d376 Merge branch 'cursor/instagram-polaris-extract-70d9' of https://github.com/FxEmbed/FxEmbed into cursor/instagram-polaris-extract-70d9 2026-07-25 21:20:40 -07:00
dangered wolf d5fe78b7ff chore: run prettier 2026-07-25 21:20:38 -07:00
dangered wolf aebb421b32 Merge branch 'main' into cursor/instagram-polaris-extract-70d9 2026-07-25 21:16:10 -07:00
dangered wolf e71fc38863 Merge pull request #2203 from FxEmbed/renovate/actions-checkout-7.x
chore(deps): update actions/checkout action to v7
2026-07-25 21:15:26 -07:00
dangered wolf c9d31fba7e Merge branch 'main' into renovate/actions-checkout-7.x 2026-07-25 21:14:07 -07:00
dangered wolf 59eaa68507 Merge pull request #2177 from FxEmbed/renovate/npm-astro-vulnerability
fix(deps): update dependency astro to v7 [security]
2026-07-25 21:13:54 -07:00
dangered wolf 9f5053fe2d feat: instagram realm 2026-07-25 21:13:35 -07:00
dangered wolf c0850d57d4 Merge pull request #2179 from FxEmbed/cursor/deadline-exceeded-errors-6a16 2026-06-17 16:45:17 -07:00
dangered wolf 21097ab250 Merge branch 'main' into cursor/deadline-exceeded-errors-6a16 2026-06-17 16:43:56 -07:00
dangered wolf f675f51b8e Merge branch 'main' into cursor/deadline-exceeded-errors-6a16 2026-06-17 16:23:38 -07:00
dangered wolf 49109cdbab Merge pull request #2180 from FxEmbed/cursor/renovate-automerge-0x-packages-6dfd
chore(renovate): enable automerge for 0.x minor and patch updates
2026-06-17 01:53:20 -07:00
dangered wolf 30bd5beed8 Merge branch 'main' into cursor/renovate-automerge-0x-packages-6dfd 2026-06-17 01:51:46 -07:00
dangered wolf e4b00b7a6f Merge pull request #2146 from FxEmbed/renovate/astrojs-starlight-0.x
fix(deps): update dependency @astrojs/starlight to ^0.39.3
2026-06-15 00:44:46 -07:00
dangered wolf 59bd7764eb Merge pull request #2106 from FxEmbed/renovate/starlight-openapi-0.x
fix(deps): update dependency starlight-openapi to ^0.25.3
2026-06-14 19:33:50 -07:00
dangered wolf b1eaf01b3a Merge pull request #2104 from FxEmbed/renovate/cloudflare-vitest-pool-workers-0.x 2026-06-14 18:35:55 -07:00
dangered wolf 181a12c789 Merge pull request #2162 from FxEmbed/cursor/exclude-non-language-codes-b15b 2026-06-14 18:32:38 -07:00
dangered wolf 2c7ce3ff3d Merge branch 'main' into cursor/exclude-non-language-codes-b15b 2026-06-14 18:31:26 -07:00
dangered wolf d969bf7513 Merge pull request #2163 from FxEmbed/cursor/bluesky-image-carousels-4b22 2026-06-14 18:25:23 -07:00
dangered wolf f60d9a9f7d Merge branch 'main' into cursor/exclude-non-language-codes-b15b 2026-06-14 18:08:53 -07:00
dangered wolf 9304a739dd Merge branch 'main' into cursor/bluesky-image-carousels-4b22 2026-06-14 18:08:19 -07:00
dangered wolf c1211b6519 Merge pull request #2160 from FxEmbed/cursor/search-timeline-error-handling-e8ac 2026-06-14 18:07:45 -07:00