diff --git a/.dockerignore b/.dockerignore
index f204349160..39cbe2726f 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -6,6 +6,7 @@
Dockerfile
build/
built/
+src-js/
db/
.devcontainer/compose.yml
node_modules/
diff --git a/.github/ISSUE_TEMPLATE/01_bug-report.yml b/.github/ISSUE_TEMPLATE/01_bug-report.yml
index fd68e602dd..00da7e9a2a 100644
--- a/.github/ISSUE_TEMPLATE/01_bug-report.yml
+++ b/.github/ISSUE_TEMPLATE/01_bug-report.yml
@@ -54,7 +54,7 @@ body:
* Model and OS of the device(s): MacBook Pro (14inch, 2021), macOS Ventura 13.4
* Browser: Chrome 113.0.5672.126
* Server URL: misskey.example.com
- * Misskey: 2025.x.x
+ * Misskey: 2026.x.x
value: |
* Model and OS of the device(s):
* Browser:
@@ -74,7 +74,7 @@ body:
Examples:
* Installation Method or Hosting Service: docker compose, k8s/docker, systemd, "Misskey install shell script", development environment
- * Misskey: 2025.x.x
+ * Misskey: 2026.x.x
* Node: 20.x.x
* PostgreSQL: 18.x.x
* Redis: 7.x.x
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
new file mode 100644
index 0000000000..7c30489afe
--- /dev/null
+++ b/.github/copilot-instructions.md
@@ -0,0 +1,3 @@
+# Copilot Instructions for Misskey
+
+- en-US.yml を編集しないでください。
diff --git a/.github/workflows/dockle.yml b/.github/workflows/dockle.yml
index 45b8d23dda..ec7073c9fd 100644
--- a/.github/workflows/dockle.yml
+++ b/.github/workflows/dockle.yml
@@ -11,6 +11,7 @@ on:
jobs:
dockle:
runs-on: ubuntu-latest
+
env:
DOCKER_CONTENT_TRUST: 1
DOCKLE_VERSION: 0.4.15
@@ -20,29 +21,33 @@ jobs:
- name: Download and install dockle v${{ env.DOCKLE_VERSION }}
run: |
+ set -eux
curl -L -o dockle.deb "https://github.com/goodwithtech/dockle/releases/download/v${DOCKLE_VERSION}/dockle_${DOCKLE_VERSION}_Linux-64bit.deb"
sudo dpkg -i dockle.deb
- - run: |
- cp .config/docker_example.env .config/docker.env
- cp ./compose_example.yml ./compose.yml
-
- - run: |
- docker compose up -d web
- IMAGE_ID=$(docker compose images --format json web | jq -r '.[0].ID')
- docker tag "${IMAGE_ID}" misskey-web:latest
-
- - name: Prune docker junk (optional but recommended)
+ - name: Build web image (docker build)
run: |
- docker system prune -af
- docker volume prune -f
+ set -eux
+ docker build -t "misskey-web:ci" .
+ docker image ls
- - name: Save image for Dockle
+ - name: Mount tmpfs for Dockle tar
+ env:
+ TMPFS_SIZE: 8G
run: |
- docker save misskey-web:latest -o ./misskey-web.tar
- ls -lh ./misskey-web.tar
+ set -eux
+ sudo mkdir -p /mnt/dockle-tmp
+ sudo mount -t tmpfs -o size=${{ env.TMPFS_SIZE }} tmpfs /mnt/dockle-tmp
+ free -h
+ df -h
- - name: Run Dockle with tar input
+ - name: Save image tar into tmpfs
run: |
- dockle --exit-code 1 --input ./misskey-web.tar
+ set -eux
+ docker save misskey-web:ci -o /mnt/dockle-tmp/misskey-web.tar
+ ls -lh /mnt/dockle-tmp/misskey-web.tar
+ - name: Run Dockle Scan (tar input)
+ run: |
+ set -eux
+ dockle --exit-code 1 --input /mnt/dockle-tmp/misskey-web.tar
diff --git a/.github/workflows/report-backend-memory.yml b/.github/workflows/report-backend-memory.yml
index c339ca49b4..bf2e311c83 100644
--- a/.github/workflows/report-backend-memory.yml
+++ b/.github/workflows/report-backend-memory.yml
@@ -54,55 +54,110 @@ jobs:
BASE_MEMORY=$(cat ./artifacts/memory-base.json)
HEAD_MEMORY=$(cat ./artifacts/memory-head.json)
- BASE_RSS=$(echo "$BASE_MEMORY" | jq -r '.memory.rss // 0')
- HEAD_RSS=$(echo "$HEAD_MEMORY" | jq -r '.memory.rss // 0')
+ variation() {
+ calc() {
+ BASE=$(echo "$BASE_MEMORY" | jq -r ".${1}.${2} // 0")
+ HEAD=$(echo "$HEAD_MEMORY" | jq -r ".${1}.${2} // 0")
- # Calculate difference
- if [ "$BASE_RSS" -gt 0 ] && [ "$HEAD_RSS" -gt 0 ]; then
- DIFF=$((HEAD_RSS - BASE_RSS))
- DIFF_PERCENT=$(echo "scale=2; ($DIFF * 100) / $BASE_RSS" | bc)
+ DIFF=$((HEAD - BASE))
+ if [ "$BASE" -gt 0 ]; then
+ DIFF_PERCENT=$(echo "scale=2; ($DIFF * 100) / $BASE" | bc)
+ else
+ DIFF_PERCENT=0
+ fi
- # Convert to MB for readability
- BASE_MB=$(echo "scale=2; $BASE_RSS / 1048576" | bc)
- HEAD_MB=$(echo "scale=2; $HEAD_RSS / 1048576" | bc)
- DIFF_MB=$(echo "scale=2; $DIFF / 1048576" | bc)
+ # Convert KB to MB for readability
+ BASE_MB=$(echo "scale=2; $BASE / 1024" | bc)
+ HEAD_MB=$(echo "scale=2; $HEAD / 1024" | bc)
+ DIFF_MB=$(echo "scale=2; $DIFF / 1024" | bc)
- echo "base_mb=$BASE_MB" >> "$GITHUB_OUTPUT"
- echo "head_mb=$HEAD_MB" >> "$GITHUB_OUTPUT"
- echo "diff_mb=$DIFF_MB" >> "$GITHUB_OUTPUT"
- echo "diff_percent=$DIFF_PERCENT" >> "$GITHUB_OUTPUT"
- echo "has_data=true" >> "$GITHUB_OUTPUT"
+ JSON=$(jq -c -n \
+ --argjson base "$BASE_MB" \
+ --argjson head "$HEAD_MB" \
+ --argjson diff "$DIFF_MB" \
+ --argjson diff_percent "$DIFF_PERCENT" \
+ '{base: $base, head: $head, diff: $diff, diff_percent: $diff_percent}')
- # Determine if this is a significant change (more than 5% increase)
- if [ "$(echo "$DIFF_PERCENT > 5" | bc)" -eq 1 ]; then
- echo "significant_increase=true" >> "$GITHUB_OUTPUT"
- else
- echo "significant_increase=false" >> "$GITHUB_OUTPUT"
- fi
- else
- echo "has_data=false" >> "$GITHUB_OUTPUT"
- fi
+ echo "$JSON"
+ }
+
+ JSON=$(jq -c -n \
+ --argjson VmRSS "$(calc $1 VmRSS)" \
+ --argjson VmHWM "$(calc $1 VmHWM)" \
+ --argjson VmSize "$(calc $1 VmSize)" \
+ --argjson VmData "$(calc $1 VmData)" \
+ '{VmRSS: $VmRSS, VmHWM: $VmHWM, VmSize: $VmSize, VmData: $VmData}')
+
+ echo "$JSON"
+ }
+
+ JSON=$(jq -c -n \
+ --argjson beforeGc "$(variation beforeGc)" \
+ --argjson afterGc "$(variation afterGc)" \
+ --argjson afterRequest "$(variation afterRequest)" \
+ '{beforeGc: $beforeGc, afterGc: $afterGc, afterRequest: $afterRequest}')
+
+ echo "res=$JSON" >> "$GITHUB_OUTPUT"
- id: build-comment
name: Build memory comment
+ env:
+ RES: ${{ steps.compare.outputs.res }}
run: |
- HEADER="## Backend Memory Usage Comparison"
+ HEADER="## Backend memory usage comparison"
FOOTER="[See workflow logs for details](https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID})"
echo "$HEADER" > ./output.md
echo >> ./output.md
- if [ "${{ steps.compare.outputs.has_data }}" == "true" ]; then
- echo "| Metric | base | head | Diff |" >> ./output.md
- echo "|--------|------|------|------|" >> ./output.md
- echo "| RSS | ${{ steps.compare.outputs.base_mb }} MB | ${{ steps.compare.outputs.head_mb }} MB | ${{ steps.compare.outputs.diff_mb }} MB (${{ steps.compare.outputs.diff_percent }}%) |" >> ./output.md
- echo >> ./output.md
+ table() {
+ echo "| Metric | base (MB) | head (MB) | Diff (MB) | Diff (%) |" >> ./output.md
+ echo "|--------|------:|------:|------:|------:|" >> ./output.md
- if [ "${{ steps.compare.outputs.significant_increase }}" == "true" ]; then
- echo "⚠️ **Warning**: Memory usage has increased by more than 5%. Please verify this is not an unintended change." >> ./output.md
- echo >> ./output.md
- fi
- else
- echo "Could not retrieve memory usage data." >> ./output.md
+ line() {
+ METRIC=$2
+ BASE=$(echo "$RES" | jq -r ".${1}.${2}.base")
+ HEAD=$(echo "$RES" | jq -r ".${1}.${2}.head")
+ DIFF=$(echo "$RES" | jq -r ".${1}.${2}.diff")
+ DIFF_PERCENT=$(echo "$RES" | jq -r ".${1}.${2}.diff_percent")
+
+ if (( $(echo "$DIFF_PERCENT > 0" | bc -l) )); then
+ DIFF="+$DIFF"
+ DIFF_PERCENT="+$DIFF_PERCENT"
+ fi
+
+ # highlight VmRSS
+ if [ "$2" = "VmRSS" ]; then
+ METRIC="**${METRIC}**"
+ BASE="**${BASE}**"
+ HEAD="**${HEAD}**"
+ DIFF="**${DIFF}**"
+ DIFF_PERCENT="**${DIFF_PERCENT}**"
+ fi
+
+ echo "| ${METRIC} | ${BASE} MB | ${HEAD} MB | ${DIFF} MB | ${DIFF_PERCENT}% |" >> ./output.md
+ }
+
+ line $1 VmRSS
+ line $1 VmHWM
+ line $1 VmSize
+ line $1 VmData
+ }
+
+ echo "### Before GC" >> ./output.md
+ table beforeGc
+ echo >> ./output.md
+
+ echo "### After GC" >> ./output.md
+ table afterGc
+ echo >> ./output.md
+
+ echo "### After Request" >> ./output.md
+ table afterRequest
+ echo >> ./output.md
+
+ # Determine if this is a significant change (more than 5% increase)
+ if [ "$(echo "$RES" | jq -r '.afterGc.VmRSS.diff_percent | tonumber > 5')" = "true" ]; then
+ echo "⚠️ **Warning**: Memory usage has increased by more than 5%. Please verify this is not an unintended change." >> ./output.md
echo >> ./output.md
fi
diff --git a/.github/workflows/test-backend.yml b/.github/workflows/test-backend.yml
index 562ec76b85..77bbdb2b0a 100644
--- a/.github/workflows/test-backend.yml
+++ b/.github/workflows/test-backend.yml
@@ -48,6 +48,13 @@ jobs:
image: redis:7
ports:
- 56312:6379
+ meilisearch:
+ image: getmeili/meilisearch:v1.3.4
+ ports:
+ - 57712:7700
+ env:
+ MEILI_NO_ANALYTICS: true
+ MEILI_ENV: development
steps:
- uses: actions/checkout@v6.0.1
diff --git a/.gitignore b/.gitignore
index ac7502f384..7839e4de66 100644
--- a/.gitignore
+++ b/.gitignore
@@ -46,6 +46,7 @@ docker-compose.yml
built
built-test
js-built
+src-js
/data
/.cache-loader
/db
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7c7d99b3ce..3efa0279b8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,38 @@
+## 2026.1.0
+
+### Note
+- `users/following` の `birthday` プロパティは非推奨になりました。代わりに `users/get-following-birthday-users` をご利用ください。
+
+### General
+- Enhance: 「もうすぐ誕生日のユーザー」ウィジェットで、誕生日が至近のユーザーも表示できるように
+ (Cherry-picked from https://github.com/MisskeyIO/misskey)
+ - 「今日誕生日のユーザー」は「もうすぐ誕生日のユーザー」に名称変更されました
+- 依存関係の更新
+
+### Client
+- Enhance: ドライブのファイル一覧で自動でもっと見るを利用可能に
+- Enhance: ウィジェットの表示設定をプレビューを見ながら行えるように
+- Enhance: ウィジェットの設定項目のラベルの多言語対応
+- Enhance: 画面幅が広いときにメディアを横並びで表示できるようにするオプションを追加
+- Enhance: パフォーマンスの向上
+- Fix: ドライブクリーナーでファイルを削除しても画面に反映されない問題を修正 #16061
+- Fix: 非ログイン時にログインを求めるダイアログが表示された後にダイアログのぼかしが解除されず操作不能になることがある問題を修正
+- Fix: ドライブのソートが「登録日(昇順)」の場合に正しく動作しない問題を修正
+- Fix: 高度なMFMのピッカーを使用する際の挙動を改善
+- Fix: 管理画面でアーカイブ済のお知らせを表示した際にアクティブなお知らせが多い旨の警告が出る問題を修正
+- Fix: ファイルタブのセンシティブメディアを開く際に確認ダイアログを出す設定が適用されない問題を修正
+- Fix: 2月29日を誕生日に設定している場合、閏年以外は3月1日を誕生日として扱うように修正
+- Fix: `Mk:C:container` の `borderWidth` が正しく反映されない問題を修正
+- Fix: mCaptchaが正しく動作しない問題を修正
+- Fix: 非ログイン時にリバーシの対局が表示されない問題を修正
+
+### Server
+- Enhance: OAuthのクライアント情報取得(Client Information Discovery)において、IndieWeb Living Standard 11 July 2024で定義されているJSONドキュメント形式に対応しました
+ - JSONによるClient Information Discoveryを行うには、レスポンスの`Content-Type`ヘッダーが`application/json`である必要があります
+ - 従来の実装(12 February 2022版・HTML Microformat形式)も引き続きサポートされます
+- Enhance: メモリ使用量を削減
+- Fix: `/admin/get-user-ips` エンドポイントのアクセス権限を管理者のみに修正
+
## 2025.12.2
### Note
diff --git a/COPYING b/COPYING
index 7635bfc913..a17c82c002 100644
--- a/COPYING
+++ b/COPYING
@@ -1,5 +1,5 @@
Unless otherwise stated this repository is
-Copyright © 2014-2025 syuilo and contributors
+Copyright © 2014-2026 syuilo and contributors
And is distributed under The GNU Affero General Public License Version 3, you should have received a copy of the license file as LICENSE.
diff --git a/Dockerfile b/Dockerfile
index 02739d9ca2..c1ac81f09e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,6 +1,6 @@
-# syntax = docker/dockerfile:1.4
+# syntax = docker/dockerfile:1.20
-ARG NODE_VERSION=22.15.0-bookworm
+ARG NODE_VERSION=22.21.1-bookworm
# build assets & compile TypeScript
@@ -102,6 +102,7 @@ COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-js/
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-reversi/built ./packages/misskey-reversi/built
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-bubble-game/built ./packages/misskey-bubble-game/built
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/backend/built ./packages/backend/built
+COPY --chown=misskey:misskey --from=native-builder /misskey/packages/backend/src-js ./packages/backend/src-js
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/i18n/built ./packages/i18n/built
COPY --chown=misskey:misskey --from=native-builder /misskey/fluent-emojis /misskey/fluent-emojis
COPY --chown=misskey:misskey . ./
diff --git a/README.md b/README.md
index a73102d713..e3261d13c2 100644
--- a/README.md
+++ b/README.md
@@ -26,6 +26,8 @@
[](https://deepwiki.com/misskey-dev/misskey)
+
+
## Thanks
@@ -49,3 +51,13 @@ Thanks to [Crowdin](https://crowdin.com/) for providing the localization platfor
Thanks to [Docker](https://hub.docker.com/) for providing the container platform that helps us run Misskey in production.
+
+---
+
+
= never : any; -type ObjectSchemaType
= NullOrUndefined
>; - export type SchemaTypeDef
=
p['type'] extends 'null' ? null :
p['type'] extends 'integer' ? number :
diff --git a/packages/backend/src/misc/split-id-and-objects.ts b/packages/backend/src/misc/split-id-and-objects.ts
new file mode 100644
index 0000000000..d23bb93695
--- /dev/null
+++ b/packages/backend/src/misc/split-id-and-objects.ts
@@ -0,0 +1,27 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+/**
+ * idとオブジェクトを分離する
+ * @param input idまたはオブジェクトの配列
+ * @returns idの配列とオブジェクトの配列
+ */
+export function splitIdAndObjects
-
+