What a port from Misskey needs before reading a single hunk: for each upstream path, which file here holds that code, how far that file has drifted, and which other files here carry a copy of the same code. Merging upstream into Catodon says how to carry a change into those copies; this page says where they are.
Measured on 2026-10-10 against Misskey develop at 53ac6808ae (2026.10.0), with scripts/upstream-drift.mjs. Re-measure at each release, or before a port, against a fresh checkout:
git clone --depth 1 https://github.com/misskey-dev/misskey.git /tmp/misskey
node scripts/upstream-drift.mjs /tmp/misskey > drift.csv # one row per upstream file
node scripts/upstream-drift.mjs /tmp/misskey --summary # the table below The CSV gives, for every file Misskey tracks under packages/, the file here (at the same path, or where the tables below send it), both line counts, the changed lines and the drift. The script reads the first two cells of the tables on this page, so a row added here is measured on the next run, and a row naming a file that no longer exists is reported.
Drift is the number of changed lines, added plus removed as git diff --numstat counts them, over the longer of the two files. 0 is identical; under 0.1 a hunk usually applies as is; above 0.5 expect to port by hand; above 1 the two files share little more than a name. A high number says that a hunk will not apply, not which side moved: Misskey's develop moves too.
By area
Every file Misskey tracks under packages/, grouped by directory. "Elsewhere here" counts the files the tables below send to another path; "nothing here" counts upstream files with no counterpart, mostly upstream features Catodon does not have.
| upstream area | files | same path | identical | drift under 0.1 | 0.1 to 0.5 | over 0.5 | elsewhere here | nothing here |
|---|---|---|---|---|---|---|---|---|
packages | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
packages/backend | 11 | 9 | 2 | 0 | 1 | 6 | 0 | 2 |
packages/backend/.vscode | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
packages/backend/assets | 35 | 27 | 21 | 0 | 0 | 6 | 0 | 8 |
packages/backend/migration | 347 | 317 | 310 | 0 | 6 | 1 | 0 | 30 |
packages/backend/scripts | 5 | 3 | 1 | 0 | 1 | 1 | 0 | 2 |
packages/backend/src | 12 | 12 | 4 | 1 | 2 | 5 | 0 | 0 |
packages/backend/src/@types | 6 | 4 | 3 | 0 | 1 | 0 | 1 | 1 |
packages/backend/src/boot | 8 | 6 | 1 | 0 | 1 | 4 | 0 | 2 |
packages/backend/src/cli | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 2 |
packages/backend/src/core | 179 | 165 | 29 | 11 | 61 | 64 | 0 | 14 |
packages/backend/src/daemons | 3 | 3 | 0 | 0 | 2 | 1 | 0 | 0 |
packages/backend/src/logging | 8 | 8 | 0 | 0 | 6 | 2 | 0 | 0 |
packages/backend/src/misc | 70 | 60 | 28 | 5 | 17 | 10 | 0 | 10 |
packages/backend/src/models | 119 | 112 | 23 | 38 | 47 | 4 | 0 | 7 |
packages/backend/src/queue | 41 | 38 | 2 | 4 | 17 | 15 | 1 | 2 |
packages/backend/src/server | 527 | 475 | 42 | 99 | 230 | 104 | 19 | 33 |
packages/backend/test | 126 | 93 | 22 | 19 | 31 | 21 | 0 | 33 |
packages/backend/test-federation | 25 | 21 | 2 | 3 | 12 | 4 | 0 | 4 |
packages/backend/test-server | 5 | 3 | 1 | 1 | 0 | 1 | 0 | 2 |
packages/frontend | 9 | 5 | 1 | 0 | 2 | 2 | 0 | 4 |
packages/frontend-builder | 8 | 0 | 0 | 0 | 0 | 0 | 0 | 8 |
packages/frontend-builder/locale-inliner | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 3 |
packages/frontend-embed | 7 | 5 | 1 | 0 | 1 | 3 | 0 | 2 |
packages/frontend-embed/@types | 2 | 2 | 0 | 0 | 2 | 0 | 0 | 0 |
packages/frontend-embed/assets | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
packages/frontend-embed/lib | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
packages/frontend-embed/public | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 2 |
packages/frontend-embed/src | 11 | 11 | 2 | 3 | 3 | 3 | 0 | 0 |
packages/frontend-embed/src/components | 33 | 33 | 4 | 5 | 23 | 1 | 0 | 0 |
packages/frontend-embed/src/pages | 5 | 5 | 0 | 1 | 4 | 0 | 0 | 0 |
packages/frontend-embed/src/workers | 3 | 3 | 0 | 0 | 3 | 0 | 0 | 0 |
packages/frontend-shared | 4 | 3 | 0 | 0 | 2 | 1 | 0 | 1 |
packages/frontend-shared/@types | 2 | 1 | 0 | 0 | 1 | 0 | 0 | 1 |
packages/frontend-shared/js | 25 | 18 | 4 | 2 | 7 | 5 | 4 | 3 |
packages/frontend-shared/themes | 21 | 21 | 14 | 6 | 1 | 0 | 0 | 0 |
packages/frontend/.storybook | 15 | 0 | 0 | 0 | 0 | 0 | 0 | 15 |
packages/frontend/.vscode | 2 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
packages/frontend/@types | 2 | 2 | 0 | 0 | 2 | 0 | 0 | 0 |
packages/frontend/assets | 143 | 60 | 59 | 0 | 0 | 1 | 0 | 83 |
packages/frontend/lib | 5 | 3 | 0 | 0 | 1 | 2 | 0 | 2 |
packages/frontend/public | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 3 |
packages/frontend/src | 33 | 26 | 1 | 2 | 4 | 19 | 1 | 6 |
packages/frontend/src/aiscript | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 3 |
packages/frontend/src/boot | 3 | 3 | 0 | 0 | 1 | 2 | 0 | 0 |
packages/frontend/src/components | 366 | 219 | 20 | 20 | 100 | 79 | 13 | 134 |
packages/frontend/src/composables | 11 | 0 | 0 | 0 | 0 | 0 | 8 | 3 |
packages/frontend/src/directives | 13 | 12 | 0 | 0 | 7 | 5 | 0 | 1 |
packages/frontend/src/filters | 5 | 5 | 3 | 0 | 2 | 0 | 0 | 0 |
packages/frontend/src/lib | 3 | 2 | 0 | 0 | 0 | 2 | 0 | 1 |
packages/frontend/src/pages | 254 | 162 | 6 | 12 | 68 | 76 | 38 | 54 |
packages/frontend/src/preferences | 3 | 3 | 0 | 0 | 0 | 3 | 0 | 0 |
packages/frontend/src/shaders | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
packages/frontend/src/types | 7 | 3 | 0 | 0 | 0 | 3 | 0 | 4 |
packages/frontend/src/ui | 37 | 33 | 1 | 1 | 15 | 16 | 2 | 2 |
packages/frontend/src/utility | 146 | 73 | 25 | 5 | 19 | 24 | 5 | 68 |
packages/frontend/src/widgets | 40 | 34 | 0 | 2 | 27 | 5 | 0 | 6 |
packages/frontend/src/workers | 3 | 3 | 0 | 0 | 3 | 0 | 0 | 0 |
packages/frontend/test | 27 | 1 | 0 | 0 | 1 | 0 | 0 | 26 |
packages/i18n | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 6 |
packages/i18n/scripts | 2 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
packages/i18n/src | 3 | 0 | 0 | 0 | 0 | 0 | 1 | 2 |
packages/i18n/src/autogen | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
packages/icons-subsetter | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 4 |
packages/icons-subsetter/src | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 2 |
packages/misskey-bubble-game | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 4 |
packages/misskey-bubble-game/src | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 3 |
packages/misskey-js | 9 | 9 | 2 | 3 | 3 | 1 | 0 | 0 |
packages/misskey-js/docs | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
packages/misskey-js/etc | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
packages/misskey-js/generator | 7 | 7 | 4 | 1 | 1 | 1 | 0 | 0 |
packages/misskey-js/src | 10 | 10 | 1 | 3 | 3 | 3 | 0 | 0 |
packages/misskey-js/src/autogen | 5 | 5 | 0 | 0 | 4 | 1 | 0 | 0 |
packages/misskey-js/test | 2 | 2 | 0 | 1 | 0 | 1 | 0 | 0 |
packages/misskey-js/test-d | 2 | 2 | 0 | 0 | 1 | 1 | 0 | 0 |
packages/misskey-reversi | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 4 |
packages/misskey-reversi/src | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 4 |
packages/shared | 2 | 2 | 1 | 0 | 0 | 1 | 0 | 0 |
packages/sw | 4 | 4 | 0 | 1 | 3 | 0 | 0 | 0 |
packages/sw/src | 3 | 2 | 1 | 0 | 0 | 1 | 0 | 1 |
packages/sw/src/@types | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
packages/sw/src/scripts | 7 | 7 | 3 | 0 | 2 | 2 | 0 | 0 |
What has nothing here, by feature: the chat pages and widget (direct messages are pages/direct-messages.vue here), Reversi and the other games, post drafts, AiScript (plugins, widgets, Play), the image effects, frames and watermarks, the page blocks (components/page/, pages/page-editor/els/), the clip, Play and gallery pages, channel muting, the storybook stories, and the frontend-builder, icons-subsetter, misskey-bubble-game and misskey-reversi packages. A fix confined to those has nothing to port.
Upstream paths under another name here
The script follows these rows. A row ending in / moves a whole directory.
| upstream | here | drift | notes |
|---|---|---|---|
packages/backend/src/@types/global.d.ts | packages/backend/src/global.d.ts | 0.33 | |
packages/backend/src/server/api/RateLimiterService.ts | packages/backend/src/server/SkRateLimiterService.ts | 1.07 | a different limiter, chosen on purpose: a fix to upstream's has to be re-read against this one |
packages/backend/src/server/api/stream/NoteStreamingHidingService.ts | packages/backend/src/server/api/stream/channel.ts | 1.05 | NoteChannel.prepareNote makes the same decisions; 11 of our 16 channels call it where 9 of upstream's call the service |
packages/backend/src/server/api/openapi/api-doc.tsx | packages/backend/assets/api-doc.html | 1.77 | |
packages/backend/src/server/web/HtmlTemplateService.ts | packages/backend/src/server/web/ClientServerService.ts | 1.03 | upstream renders .tsx views, Catodon pug templates; an escaping or metadata fix has to be found by reading |
packages/backend/src/server/web/views/_splash.tsx | packages/backend/src/server/web/views/base.pug | 1.03 | |
packages/backend/src/server/web/views/announcement.tsx | packages/backend/src/server/web/views/announcement.pug | 1.32 | |
packages/backend/src/server/web/views/base-embed.tsx | packages/backend/src/server/web/views/base-embed.pug | 1.53 | |
packages/backend/src/server/web/views/base.tsx | packages/backend/src/server/web/views/base.pug | 1.60 | |
packages/backend/src/server/web/views/bios.tsx | packages/backend/src/server/web/views/bios.pug | 1.46 | |
packages/backend/src/server/web/views/channel.tsx | packages/backend/src/server/web/views/channel.pug | 1.27 | |
packages/backend/src/server/web/views/cli.tsx | packages/backend/src/server/web/views/cli.pug | 1.58 | |
packages/backend/src/server/web/views/error.tsx | packages/backend/src/server/web/views/error.pug | 1.74 | |
packages/backend/src/server/web/views/flush.tsx | packages/backend/src/server/web/views/flush.pug | 1.21 | |
packages/backend/src/server/web/views/gallery-post.tsx | packages/backend/src/server/web/views/gallery-post.pug | 1.51 | |
packages/backend/src/server/web/views/info-card.tsx | packages/backend/src/server/web/views/info-card.pug | 1.80 | |
packages/backend/src/server/web/views/note.tsx | packages/backend/src/server/web/views/note.pug | 1.55 | |
packages/backend/src/server/web/views/oauth.tsx | packages/backend/src/server/web/views/oauth.pug | 1.19 | |
packages/backend/src/server/web/views/page.tsx | packages/backend/src/server/web/views/page.pug | 1.42 | |
packages/backend/src/server/web/views/user.tsx | packages/backend/src/server/web/views/user.pug | 1.41 | |
packages/backend/src/queue/processors/PostScheduledNoteProcessorService.ts | packages/backend/src/queue/processors/ScheduleNotePostProcessorService.ts | 1.10 | scheduled posts, written separately on each side: upstream's come from drafts |
packages/frontend/src/composables/ | packages/frontend/src/use/ | upstream renamed the directory, Catodon kept the old name; use-mkselect.ts, use-mutation-observer.ts and use-uploader.ts have nothing here | |
packages/frontend/src/composables/use-loading.ts | packages/frontend/src/components/hook/useLoading.ts | 0.00 | |
packages/frontend/src/components/global/MkSuspense.vue | packages/frontend/src/components/form/suspense.vue | 0.27 | |
packages/frontend/src/components/MkMarqueeText.vue | packages/frontend/src/components/MkMarquee.vue | 1.08 | |
packages/frontend/src/components/MkDriveFileSelectDialog.vue | packages/frontend/src/components/MkDriveSelectDialog.vue | 0.32 | one dialog for files and folders here |
packages/frontend/src/components/MkDriveFolderSelectDialog.vue | packages/frontend/src/components/MkDriveSelectDialog.vue | 0.38 | |
packages/frontend/src/components/MkForm.file.vue | packages/frontend/src/components/MkFormDialog.file.vue | 0.12 | |
packages/frontend/src/components/MkStreamingNotesTimeline.vue | packages/frontend/src/components/MkTimeline.vue | 1.17 | |
packages/frontend/src/components/MkNotesTimeline.vue | packages/frontend/src/components/MkNotes.vue | 1.08 | |
packages/frontend/src/components/MkStreamingNotificationsTimeline.vue | packages/frontend/src/components/MkNotifications.vue | 1.11 | |
packages/frontend/src/components/MkPaginationControl.vue | packages/frontend/src/components/MkPagination.vue | 1.05 | the controls are inside the pagination here |
packages/frontend/src/components/MkNote.vue | packages/frontend/src/components/SkNote.vue | 1.00 | and SkForumPostCard.vue, see the copies below |
packages/frontend/src/components/MkNoteDetailed.vue | packages/frontend/src/components/SkNoteDetailed.vue | 1.01 | |
packages/frontend/src/components/MkNoteSub.vue | packages/frontend/src/components/SkNoteSub.vue | 1.00 | |
packages/frontend/src/components/MkNoteSimple.vue | packages/frontend/src/components/SkNoteSimple.vue | 0.72 | |
packages/frontend/src/pages/about-misskey.vue | packages/frontend/src/pages/about-catodon.vue | 0.94 | |
packages/frontend/src/pages/admin-file.root.vue | packages/frontend/src/pages/admin-file.vue | 0.41 | |
packages/frontend/src/pages/avatar-decorations.vue | packages/frontend/src/pages/admin/custom-emojis-manager.decorations.vue | 0.46 | |
packages/frontend/src/pages/welcome.entrance.classic.vue | packages/frontend/src/pages/welcome.entrance.a.vue | 0.35 | |
packages/frontend/src/pages/welcome.entrance.simple.vue | packages/frontend/src/pages/welcome.entrance.a.vue | 0.71 | |
packages/frontend/src/pages/chat/ | packages/frontend/src/pages/direct-messages.vue | rewritten, no shared code | |
packages/frontend/src/pages/channel.vue | packages/frontend/src/pages/forum/index.vue | 1.24 | channels are forums here, and their pages were rewritten |
packages/frontend/src/pages/channels.vue | packages/frontend/src/pages/forums.vue | 1.01 | |
packages/frontend/src/pages/admin/abuse-report/notification-recipient.vue | packages/frontend/src/pages/admin/abuses.recipients.vue | 0.63 | the settings and control panel pages were reorganised by #399 |
packages/frontend/src/pages/admin/ads.vue | packages/frontend/src/pages/admin/announcements.ads.vue | 0.84 | |
packages/frontend/src/pages/admin/database.vue | packages/frontend/src/pages/admin/job-queue.database.vue | 0.84 | |
packages/frontend/src/pages/admin/external-services.vue | packages/frontend/src/pages/admin/integrations.vue | 0.95 | |
packages/frontend/src/pages/admin/federation-job-queue.vue | packages/frontend/src/pages/admin/job-queue.vue | 0.96 | |
packages/frontend/src/pages/admin/moderation.vue | packages/frontend/src/pages/admin/content-filters.vue | 0.80 | and registration.vue |
packages/frontend/src/pages/admin/relays.vue | packages/frontend/src/pages/admin/federation.vue | 0.85 | |
packages/frontend/src/pages/admin/server-rules.vue | packages/frontend/src/pages/admin/server-info.vue | 0.98 | |
packages/frontend/src/pages/admin/settings.vue | packages/frontend/src/pages/admin/server-info.vue | 1.06 | and integrations.vue |
packages/frontend/src/pages/settings/account-data.vue | packages/frontend/src/pages/settings/data.vue | 1.10 | |
packages/frontend/src/pages/settings/drive.vue | packages/frontend/src/pages/settings/data.vue | 1.22 | |
packages/frontend/src/pages/settings/connect.vue | packages/frontend/src/pages/settings/developer.vue | 0.70 | |
packages/frontend/src/pages/settings/email.vue | packages/frontend/src/pages/settings/security.vue | 1.15 | |
packages/frontend/src/pages/settings/other.vue | packages/frontend/src/pages/settings/manage-account.vue | 0.75 | |
packages/frontend/src/pages/settings/preferences.vue | packages/frontend/src/pages/settings/posts.vue | 1.26 | split across posts.vue, notifications.vue, performance.vue and composing.vue, in that order of shared lines |
packages/frontend/src/pages/settings/sounds.vue | packages/frontend/src/pages/settings/notifications.vue | 0.98 | |
packages/frontend/src/pages/settings/theme.vue | packages/frontend/src/pages/settings/appearance.vue | 0.66 | |
packages/frontend/src/pages/settings/mute-block.word-mute.vue | packages/frontend/src/pages/settings/mute-block.word-filters.vue | 1.55 | word filters replace word mutes here |
packages/frontend/src/ui/deck/channel-column.vue | packages/frontend/src/ui/deck/forums-column.vue | 1.02 | |
packages/frontend/src/ui/deck/chat-column.vue | packages/frontend/src/ui/deck/direct-column.vue | 0.96 | |
packages/frontend/src/telemetry.ts | packages/frontend/src/boot/common.ts | 1.06 | |
packages/frontend/src/utility/element-contains.ts | packages/frontend/src/utility/contains.ts | 0.33 | |
packages/frontend/src/utility/get-file-menu.ts | packages/frontend/src/utility/get-media-file-menu.ts | 0.69 | |
packages/frontend/src/utility/inapp-search.ts | packages/frontend/src/utility/settings-search-index.ts | 0.81 | |
packages/frontend/src/utility/isWebpSupported.ts | packages/frontend/src/utility/upload/isWebpSupported.ts | 0.00 | |
packages/frontend/src/utility/url-preview.ts | packages/frontend/src/utility/player-url-transform.ts | 0.45 | |
packages/frontend-shared/js/locale.ts | packages/frontend-shared/js/config.ts | 0.94 | upstream moved these helpers from the frontend to frontend-shared; Catodon has them where they were |
packages/frontend-shared/js/note.ts | packages/frontend/src/filters/note.ts | 0.25 | |
packages/frontend-shared/js/theme.ts | packages/frontend/src/theme.ts | 1.44 | |
packages/frontend-shared/js/user.ts | packages/frontend/src/filters/user.ts | 0.77 | |
packages/i18n/scripts/generateLocaleInterface.ts | locales/generateDTS.js | 0.84 | upstream made the locales a package; Catodon keeps them in locales/ |
packages/i18n/src/index.ts | locales/index.js | 1.58 |
Upstream code with a second copy here
An upstream hunk to the first column lands at its path here (or where the table above sends it), then has to be carried by hand into the second. "Shared" counts the distinct non-blank lines the second copy has in common with our file at the first column's path, or with upstream's where that code is no longer here (the input checks, updateInstanceQueue), out of the second copy's own distinct non-blank lines.
| upstream code | the other copy here | shared | notes |
|---|---|---|---|
core/NoteCreateService.ts | core/NoteEditService.ts | 257 of 620 | the edit path calls the create pipeline's stages and writes four blocks its own way; merging-upstream.md lists them |
endpoints/notes/create.ts, its input checks | server/api/NoteInputService.ts | 14 of 207 | the checks were rewritten as one service that notes/create, notes/edit and notes/schedule/create call: carry a rule there, not into the endpoints |
core/activitypub/models/ApNoteService.ts, createNote | the same file's updateNote | 130 of 223 | upstream has no updateNote |
core/MfmService.ts, toHtml | the same file's toMastoApiHtml | 106 of 165 | |
endpoints/notes/global-timeline.ts | endpoints/notes/bubble-timeline.ts | 89 of 110 | |
stream/channels/global-timeline.ts | stream/channels/bubble-timeline.ts | 49 of 66 | the frontend side is in timelines.ts, MkTimeline.vue, pages/timeline.vue and ui/deck/tl-column.vue |
endpoints/notes/renotes.ts | endpoints/notes/quotes.ts | 66 of 73 | renotes.ts already lists quotes when quote is set |
queue/processors/InboxProcessorService.ts, updateInstanceQueue | core/UpdateInstanceQueue.ts | 30 of 39 | |
endpoints/i/update.ts, verifyLink | misc/verify-field-link.ts, verifyFieldLinks | run from VerifyLinksProcessorService.ts; i/update.ts has no verifyLink here | |
frontend/src/components/MkNote.vue and its siblings | SkNote.vue, SkNoteDetailed.vue, SkNoteSub.vue, SkForumPostCard.vue | the behaviour composables/use-note.ts holds upstream is in use/use-note.ts here, shared by the four | |
frontend/src/ui/_common_/navbar.vue | ui/_common_/navbar-for-mobile.vue | 270 of 361 | |
frontend/src/directives/user-preview.ts | directives/tag-preview.ts | 67 of 77 | |
frontend/src/components/MkUserPopup.vue | components/MkTagPopup.vue | 86 of 140 | |
.config/example.yml | .config/ci.yml | 264 of 287 |
Backend paths are under packages/backend/src/, with server/api/ left out before endpoints/ and stream/; frontend paths under packages/frontend/src/.
Catodon-only paths that do upstream's work
Code with no upstream path that re-implements, wraps or replaces something upstream fixes elsewhere. An upstream diff never names these files: the porter has to know to look.
| here | what upstream code it stands for | how an upstream fix reaches it |
|---|---|---|
server/api/mastodon/ (65 files, 17,315 lines) | the native endpoints, for Mastodon clients | through InProcessEndpointCaller where the shim calls a native endpoint; not where it reads a repository itself, as 5 of its non-test files do |
server/activitypub-c2s/ (30 files, 8,942 lines) | notes/create, notes/edit, notes/polls/vote, i/update, drive/files/*, blogs/* | every write goes through the native endpoint, so a fix to it applies here as well |
server/LemmyCompatForumService.ts, LemmyCompatServerService.ts (625 lines) | forum reads | none: read the fix and check by hand |
frontend/src/accounts/ (54 files, 17,996 lines) | misskeyApi() and the streaming client, for a web client signed in to a remote server | it replaces the transport, not the backend: a backend fix does not concern it, a fix to misskeyApi() or the stream client may |
server/oauth/OAuth2UrlClientService.ts | most of upstream's server/oauth/OAuth2ProviderService.ts (127 distinct lines shared; our OAuth2ProviderService.ts shares 31 and dispatches) | look in both files, and in server/api/mastodon/ |
core/UrlPreviewFetchService.ts | the fetch half of upstream's server/web/UrlPreviewService.ts | a fetch fix names UrlPreviewService.ts; the fetch is here |
core/RemoteNotesCleaningService.ts | the logic of upstream's queue/processors/CleanRemoteNotesProcessorService.ts (110 distinct lines shared) | the processor here is an adapter |
misc/word-filter.ts, core/WordFilterService.ts | upstream's checkWordMute in misc/check-word-mute.ts | a fix to checkWordMute names a function Catodon replaced; our misc/check-word-mute.ts keeps only matching helpers, which the Mastodon layer imports |
core/entities/NoteEntityService.ts, hideNote | upstream's shouldHideNote plus hideNote in the same file | the decision is one async hideNote here |
endpoints/ap/show.ts, the refresh of a known actor | upstream's endpoints/federation/update-remote-user.ts, its only endpoint that refreshes a known actor on demand (i/move.ts refreshes the move target) | a fix to the refresh must be checked here too |
misc/create-temp.ts, drainToFile | upstream's writeMultipartFileToTemp in server/api/ApiCallService.ts | a multipart fix names a helper Catodon moved |
server/ActivityPubServerService.ts, checkSignature and checkAuthorizedFetch | upstream's signature parsing inside inbox | an inbox hardening may apply to the GET routes here |
queue/processors/ImportNotesProcessorService.ts | none: upstream has no post import | builds posts without notes/create's checks, so an input fix there does not reach imported posts |
endpoints/notes/forums-timeline.ts | the timeline family | its own filter chain and ranking: a timeline filtering fix may belong here too |
Paths are under packages/backend/src/, with server/api/ left out before endpoints/, unless they start with frontend/.