{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":9852918,"defaultBranch":"main","name":"Ghost","ownerLogin":"TryGhost","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2013-05-04T11:09:13.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/2178663?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1714147472.0","currentOid":""},"activityList":{"items":[{"before":"dcd65bfa4fed95382949f50ccb9a0d567d18902f","after":"cf9ba605244b3b5f17a787ee15deb382b00fac0e","ref":"refs/heads/main","pushedAt":"2024-04-26T16:04:32.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"daniellockyer","name":"Daniel Lockyer","path":"/daniellockyer","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/964245?s=80&v=4"},"commit":{"message":"v5.82.4","shortMessageHtmlLink":"v5.82.4"}},{"before":null,"after":"bf5d0995e09f5ba7c0956b5bbdce9b452614a475","ref":"refs/heads/modal-refinement","pushedAt":"2024-04-26T10:59:52.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"dvdwinden","name":"Daniël van der Winden","path":"/dvdwinden","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6783168?s=80&v=4"},"commit":{"message":"Updated modal class","shortMessageHtmlLink":"Updated modal class"}},{"before":"892b9ab397bfa8351e3fc053902d6df66aef3f6b","after":"dcd65bfa4fed95382949f50ccb9a0d567d18902f","ref":"refs/heads/main","pushedAt":"2024-04-26T02:17:26.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"cmraible","name":"Chris Raible","path":"/cmraible","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5412422?s=80&v=4"},"commit":{"message":"Added caching to the LinkRedirectRepository (#20036)\n\nref\r\nhttps://linear.app/tryghost/issue/ENG-851/implement-a-minimal-but-complete-version-of-redirect-caching-to\r\nref https://app.incident.io/ghost/incidents/55\r\n\r\nOften immediately after sending an email, sites receive a large volume\r\nof requests to LinkRedirect endpoints from members clicking on the links in\r\nthe email.\r\n\r\nWe currently don't cache any of these requests in our CDN, because we\r\nalso record click events, update the member's `last_seen_at` timestamp,\r\nand send webhooks in response to these clicks, so Ghost needs to handle\r\neach of these requests itself. This means that each of these LinkRedirect requests\r\nhits Ghost, and currently all these requests hit the database to lookup\r\nwhere to redirect the member to.\r\n\r\nEach one of these requests can make up to 11 database queries, which can\r\nquickly exhaust Ghost's database connection pool. Even though the\r\nLinkRedirect lookup query is fairly cheap and quick, these queries aren't\r\nprioritized over the \"record\" queries Ghost needs to handle, so they can\r\nget stuck behind other queries in the queue and eventually timeout.\r\n\r\nThe result is that members are unable to actually reach the destination\r\nof the link they clicked on, instead receiving a 500 error in Ghost, or\r\nit can take a long time (60s+) for the redirect to happen.\r\n\r\nThis PR uses our existing `adapterManager` to cache the redirect lookups\r\neither in-memory or in Redis (if configured — by default there is no caching). This only removes 1 out of\r\n11 queries per redirect request, so it won't reduce the load on the DB\r\ndrastically, but it at least decouples the serving of the LinkRedirect from\r\nthe DB so the member can be redirected even if the DB is under heavy\r\nload.\r\n\r\nLocal load testing results have shown a decrease in response times from\r\n60 seconds to ~50ms for the redirect requests when handling 500 requests\r\nper second, and reduced the 500 error rate to 0.","shortMessageHtmlLink":"Added caching to the LinkRedirectRepository (#20036)"}},{"before":"860ff201b0d18161eec692c9c44e40dcf556a7c8","after":"2a10492eb6e40e715f77e37f65e112c9d118e4df","ref":"refs/heads/chris-eng-851-implement-a-minimal-but-complete-version-of-redirect-caching","pushedAt":"2024-04-26T01:19:13.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"cmraible","name":"Chris Raible","path":"/cmraible","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5412422?s=80&v=4"},"commit":{"message":"fixup! Added new redirects to the cache when saved to the DB","shortMessageHtmlLink":"fixup! Added new redirects to the cache when saved to the DB"}},{"before":null,"after":"678fb100b916914ca095a03667db62349cda8580","ref":"refs/heads/renovate/react-monorepo","pushedAt":"2024-04-25T19:10:16.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"Update react monorepo to v18.3.0","shortMessageHtmlLink":"Update react monorepo to v18.3.0"}},{"before":"601d05de0d2112fa0cbc8f7ca39beb38ddcc8fd0","after":"892b9ab397bfa8351e3fc053902d6df66aef3f6b","ref":"refs/heads/main","pushedAt":"2024-04-25T14:37:55.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"daniellockyer","name":"Daniel Lockyer","path":"/daniellockyer","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/964245?s=80&v=4"},"commit":{"message":"Moved `internalLinking` and `stripeAutomaticTax` flags to private beta\n\nrefs https://ghost.slack.com/archives/C02G9E68C/p1714051665654659?thread_ts=1713970812.191919&cid=C02G9E68C\n\n- this enables us to enable the flags on sites without the need to\n enable developer experiments\n- added `(private beta)` to the end of the relevant UI flags, because\n they're still in alpha in the UI despite being in beta in backend","shortMessageHtmlLink":"Moved internalLinking and stripeAutomaticTax flags to private beta"}},{"before":"58e8795a33bf67b930049711c378e55c275eb824","after":null,"ref":"refs/heads/enable-flags","pushedAt":"2024-04-25T14:37:55.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"daniellockyer","name":"Daniel Lockyer","path":"/daniellockyer","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/964245?s=80&v=4"}},{"before":"e961475b3db4633b338d01b460c1e8b48012bcd3","after":"58e8795a33bf67b930049711c378e55c275eb824","ref":"refs/heads/enable-flags","pushedAt":"2024-04-25T14:21:40.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"daniellockyer","name":"Daniel Lockyer","path":"/daniellockyer","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/964245?s=80&v=4"},"commit":{"message":"Moved `internalLinking` and `stripeAutomaticTax` flags to private beta\n\nrefs https://ghost.slack.com/archives/C02G9E68C/p1714051665654659?thread_ts=1713970812.191919&cid=C02G9E68C\n\n- this enables us to enable the flags on sites without the need to\n enable developer experiments\n- added `(private beta)` to the end of the relevant UI flags, because\n they're still in alpha in the UI despite being in beta in backend","shortMessageHtmlLink":"Moved internalLinking and stripeAutomaticTax flags to private beta"}},{"before":"7e2872a8f562b57e0a0655e519594bbf55abf97f","after":null,"ref":"refs/heads/remove-dupe-flag","pushedAt":"2024-04-25T14:15:48.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ronaldlangeveld","name":"Ronald Langeveld","path":"/ronaldlangeveld","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/19263291?s=80&v=4"}},{"before":"a0b7476794bc4deea04f90fdfdfd954d8ed162ce","after":"601d05de0d2112fa0cbc8f7ca39beb38ddcc8fd0","ref":"refs/heads/main","pushedAt":"2024-04-25T14:15:47.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"ronaldlangeveld","name":"Ronald Langeveld","path":"/ronaldlangeveld","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/19263291?s=80&v=4"},"commit":{"message":"Removed duplicated ActivityPub labs key (#20089)\n\nno issue\r\n\r\n- rebased from main without seeing there's an existing flag.\r\n- this removes the duplicated flag","shortMessageHtmlLink":"Removed duplicated ActivityPub labs key (#20089)"}},{"before":"fd04db062989ad4cea22e083c6c54a065ddb6765","after":"e961475b3db4633b338d01b460c1e8b48012bcd3","ref":"refs/heads/enable-flags","pushedAt":"2024-04-25T14:13:32.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"daniellockyer","name":"Daniel Lockyer","path":"/daniellockyer","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/964245?s=80&v=4"},"commit":{"message":"Moved `internalLinking` and `stripeAutomaticTax` flags to private beta\n\nrefs https://ghost.slack.com/archives/C02G9E68C/p1714051665654659?thread_ts=1713970812.191919&cid=C02G9E68C\n\n- this enables us to enable the flags on sites without the need to\n enable developer experiments\n- added `(private beta)` to the end of the relevant UI flags, because\n they're still in alpha in the UI despite being in beta in backend","shortMessageHtmlLink":"Moved internalLinking and stripeAutomaticTax flags to private beta"}},{"before":null,"after":"7e2872a8f562b57e0a0655e519594bbf55abf97f","ref":"refs/heads/remove-dupe-flag","pushedAt":"2024-04-25T14:07:40.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"ronaldlangeveld","name":"Ronald Langeveld","path":"/ronaldlangeveld","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/19263291?s=80&v=4"},"commit":{"message":"Removed dupe ActivityPub labs key\n\nno issue\n\n- rebased from main without seeing there's an existing flag.\n- this removes that flag","shortMessageHtmlLink":"Removed dupe ActivityPub labs key"}},{"before":"79368cbd373721eb8a1e400b6d61157d510f9701","after":"fd04db062989ad4cea22e083c6c54a065ddb6765","ref":"refs/heads/enable-flags","pushedAt":"2024-04-25T14:02:42.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"daniellockyer","name":"Daniel Lockyer","path":"/daniellockyer","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/964245?s=80&v=4"},"commit":{"message":"Moved `internalLinking` and `stripeAutomaticTax` flags to private beta\n\nrefs https://ghost.slack.com/archives/C02G9E68C/p1714051665654659?thread_ts=1713970812.191919&cid=C02G9E68C\n\n- this enables us to enable the flags on sites without the need to\n enable developer experiments\n- added `(private beta)` to the end of the relevant UI flags, because\n they're still in alpha in the UI despite being in beta in backend","shortMessageHtmlLink":"Moved internalLinking and stripeAutomaticTax flags to private beta"}},{"before":"082ee34a50aca8f1a560b2c0876e17ee80818131","after":"79368cbd373721eb8a1e400b6d61157d510f9701","ref":"refs/heads/enable-flags","pushedAt":"2024-04-25T14:01:38.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"daniellockyer","name":"Daniel Lockyer","path":"/daniellockyer","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/964245?s=80&v=4"},"commit":{"message":"Moved `internalLinking` and `stripeAutomaticTax` flags to beta\n\nrefs https://ghost.slack.com/archives/C02G9E68C/p1714051665654659?thread_ts=1713970812.191919&cid=C02G9E68C\n\n- this enables us to enable the flags on sites without the need to\n enable developer experiments","shortMessageHtmlLink":"Moved internalLinking and stripeAutomaticTax flags to beta"}},{"before":null,"after":"082ee34a50aca8f1a560b2c0876e17ee80818131","ref":"refs/heads/enable-flags","pushedAt":"2024-04-25T13:44:55.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"daniellockyer","name":"Daniel Lockyer","path":"/daniellockyer","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/964245?s=80&v=4"},"commit":{"message":"Moved `internalLinking` and `stripeAutomaticTax` flags to beta\n\nrefs https://ghost.slack.com/archives/C02G9E68C/p1714051665654659?thread_ts=1713970812.191919&cid=C02G9E68C\n\n- this enables us to enable the flags on sites without the need to\n enable developer experiments","shortMessageHtmlLink":"Moved internalLinking and stripeAutomaticTax flags to beta"}},{"before":"ec70afaab3daf02be57a2fe0f9358e0e79f55be2","after":null,"ref":"refs/heads/improve-staff-deletion-perf","pushedAt":"2024-04-25T13:19:12.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"9larsons","name":"Steve Larson","path":"/9larsons","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/21961100?s=80&v=4"}},{"before":"7a3bbfde10d40d09f8149d9644d01d065338c557","after":"a0b7476794bc4deea04f90fdfdfd954d8ed162ce","ref":"refs/heads/main","pushedAt":"2024-04-25T13:19:12.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"9larsons","name":"Steve Larson","path":"/9larsons","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/21961100?s=80&v=4"},"commit":{"message":"Updated staff deletion logic (#20069)\n\nref https://linear.app/tryghost/issue/ENG-826\r\n\r\n- Changed staff deletion logic to do a bulk insert when adding a tag to\r\nthe users' associated posts\r\n\r\nStaff deletion logic has really poor performance at scale because we do\r\nindividual updates for every post. If a user has dozens+ posts\r\n(especially in a large db with thousands of posts), this can take >60s\r\nand look like a timeout. Ultimately this should probably be a jobbed off\r\nprocess, but for the time being we can improve this by doing a bulk\r\ninsert.\r\n\r\nNote that this update uses the pattern for the bulk tagging of posts\r\nfrom the right click (bulk) actions in the posts lists in Admin. With\r\nbulk actions, **we do not trigger web hooks or the post.edited events**.\r\nWe will document this and follow up on this separately.","shortMessageHtmlLink":"Updated staff deletion logic (#20069)"}},{"before":"fd92722763f4ae61cc5666dfa35f07d862b91bf2","after":"9bc2080c7ca76d5185da465217a1ce72972931eb","ref":"refs/heads/update-toast-style","pushedAt":"2024-04-25T12:29:28.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"peterzimon","name":"Peter Zimon","path":"/peterzimon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/353959?s=80&v=4"},"commit":{"message":"Consolidated toaster styles","shortMessageHtmlLink":"Consolidated toaster styles"}},{"before":null,"after":"bf8c95070fd4a2236848c0c308319ecb6e8be59d","ref":"refs/heads/admin-login-consistency-TRI-90","pushedAt":"2024-04-25T09:38:33.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"minimaluminium","name":"Sodbileg Gansukh","path":"/minimaluminium","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1418797?s=80&v=4"},"commit":{"message":"Updated sign in form to make it consistent with the new signup design","shortMessageHtmlLink":"Updated sign in form to make it consistent with the new signup design"}},{"before":"33dafe724d6d4b158543ef3165cb50bfff8d3460","after":null,"ref":"refs/heads/admin-x-playground","pushedAt":"2024-04-25T08:44:30.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ronaldlangeveld","name":"Ronald Langeveld","path":"/ronaldlangeveld","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/19263291?s=80&v=4"}},{"before":"af02ca704436ad732db655dfe3f90db9fbbaf79c","after":"7a3bbfde10d40d09f8149d9644d01d065338c557","ref":"refs/heads/main","pushedAt":"2024-04-25T08:44:29.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"ronaldlangeveld","name":"Ronald Langeveld","path":"/ronaldlangeveld","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/19263291?s=80&v=4"},"commit":{"message":"Added ActivityPub playground (#20081)\n\nref MOM61\r\n\r\n- Adds admin-x react app we’ll use as ActivityPub playground to the\r\nsidebar nav behind the feature flag.\r\n- Wired up routing to Ember\r\n- Setup the project as `admin-x-activitypub`\r\n\r\n---------\r\n\r\nCo-authored-by: Ronald Langeveld ","shortMessageHtmlLink":"Added ActivityPub playground (#20081)"}},{"before":"b8cf052727bc1081175aa997dd6fe5a4bfe87bb2","after":"fd92722763f4ae61cc5666dfa35f07d862b91bf2","ref":"refs/heads/update-toast-style","pushedAt":"2024-04-25T08:31:13.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"peterzimon","name":"Peter Zimon","path":"/peterzimon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/353959?s=80&v=4"},"commit":{"message":"Fixed tests","shortMessageHtmlLink":"Fixed tests"}},{"before":"c31c32f1fa342eb772b055c0c80e41931698d015","after":"33dafe724d6d4b158543ef3165cb50bfff8d3460","ref":"refs/heads/admin-x-playground","pushedAt":"2024-04-25T08:30:36.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"ronaldlangeveld","name":"Ronald Langeveld","path":"/ronaldlangeveld","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/19263291?s=80&v=4"},"commit":{"message":"Updated playground variables to be activitypub\n\nref MOM61\n\n- updated project file from playground to activity pub\n- its gonna have to happen late anyway.\n- peace","shortMessageHtmlLink":"Updated playground variables to be activitypub"}},{"before":"5de61bb92314286b731ac7edb7f81a59610df8f4","after":"b8cf052727bc1081175aa997dd6fe5a4bfe87bb2","ref":"refs/heads/update-toast-style","pushedAt":"2024-04-25T07:57:03.000Z","pushType":"push","commitsCount":4,"pusher":{"login":"peterzimon","name":"Peter Zimon","path":"/peterzimon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/353959?s=80&v=4"},"commit":{"message":"Merge branch 'updated-toast-style-DES-228'","shortMessageHtmlLink":"Merge branch 'updated-toast-style-DES-228'"}},{"before":"e9dc90ec8fa2332d78de40e2b2c569d4d0b05a22","after":"c31c32f1fa342eb772b055c0c80e41931698d015","ref":"refs/heads/admin-x-playground","pushedAt":"2024-04-25T07:49:39.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"ronaldlangeveld","name":"Ronald Langeveld","path":"/ronaldlangeveld","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/19263291?s=80&v=4"},"commit":{"message":"Modified NX settings in playground","shortMessageHtmlLink":"Modified NX settings in playground"}},{"before":"bb7d69828c9eb6a7ac62b8a1527735e7c115aadd","after":"5ac36c8c70428edabf1f9d846ea947c5129992c9","ref":"refs/heads/updated-toast-style-DES-228","pushedAt":"2024-04-25T07:31:01.000Z","pushType":"push","commitsCount":23,"pusher":{"login":"peterzimon","name":"Peter Zimon","path":"/peterzimon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/353959?s=80&v=4"},"commit":{"message":"Merge branch 'main' into updated-toast-style-DES-228","shortMessageHtmlLink":"Merge branch 'main' into updated-toast-style-DES-228"}},{"before":"14d6435e19903aff622d5f29f5d4e392d5644372","after":"5de61bb92314286b731ac7edb7f81a59610df8f4","ref":"refs/heads/update-toast-style","pushedAt":"2024-04-25T07:30:23.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"peterzimon","name":"Peter Zimon","path":"/peterzimon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/353959?s=80&v=4"},"commit":{"message":"Remove page level error from Portal","shortMessageHtmlLink":"Remove page level error from Portal"}},{"before":"0aa7ea901c0d34a68eb9d5369aa4bef484f41a21","after":"e9dc90ec8fa2332d78de40e2b2c569d4d0b05a22","ref":"refs/heads/admin-x-playground","pushedAt":"2024-04-25T05:58:27.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"ronaldlangeveld","name":"Ronald Langeveld","path":"/ronaldlangeveld","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/19263291?s=80&v=4"},"commit":{"message":"Updated test file","shortMessageHtmlLink":"Updated test file"}},{"before":"3f3d6397810f8fb412d142a75c7488b2cf61cc02","after":"0aa7ea901c0d34a68eb9d5369aa4bef484f41a21","ref":"refs/heads/admin-x-playground","pushedAt":"2024-04-25T05:37:11.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"ronaldlangeveld","name":"Ronald Langeveld","path":"/ronaldlangeveld","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/19263291?s=80&v=4"},"commit":{"message":"Setup test files","shortMessageHtmlLink":"Setup test files"}},{"before":"4b86b906f3d9232020a4096be80c52c8a1355636","after":"3f3d6397810f8fb412d142a75c7488b2cf61cc02","ref":"refs/heads/admin-x-playground","pushedAt":"2024-04-25T04:35:58.000Z","pushType":"push","commitsCount":90,"pusher":{"login":"ronaldlangeveld","name":"Ronald Langeveld","path":"/ronaldlangeveld","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/19263291?s=80&v=4"},"commit":{"message":"Merge branch 'main' into admin-x-playground","shortMessageHtmlLink":"Merge branch 'main' into admin-x-playground"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEO1PV4AA","startCursor":null,"endCursor":null}},"title":"Activity · TryGhost/Ghost"}