Μετάβαση στο περιεχόμενο

Upstream map

Ανάπτυξη του Catodon 13 λεπτά ανάγνωσης Πηγή στο codefloeΜόνο στα αγγλικά

Σε αυτή τη σελίδα

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/.