feat(ui): replace Monaco with CodeMirror #10559

Merged
Gusted merged 1 commit from beowulf/forgejo-codemirror into forgejo 2026-01-04 23:52:35 +01:00 AGit
Owner
  • Replace the Monaco Editor with CodeMirror 6. This editor is used to facilitate the 'Add file' and 'Edit file' functionality.
  • Resolves forgejo/forgejo#5440
  • Resolves forgejo/forgejo#4536
  • Resolves forgejo/forgejo#6568
  • Closes forgejo/forgejo#8370
  • Rationale:
    • Monaco editor is a great and powerful editor, however for Forgejo's
      purpose it acts more like a small IDE than a code editor and is doing
      too much. In my limited user research the usage of editing files via
      the web UI is largely for small changes that does not need the
      features that Monaco editor provides.
    • Monaco editor has no mobile support, Codemirror is very usable on mobile.
    • Monaco editor pulls in large dependencies (for language support) and
      by replacing it with Codemirror the amount of time that webpack needs
      to build the frontend is reduced by 50% (~30s -> ~15s).
    • The binary of Forgejo (build with bindata tag) is reduced by 2MiB.
    • Codemirror is much more lightweight and should be more usable on
      less powerful hardware, most notably the lazy loading is much faster
      as codemirror uses less javascript.
    • Because Codemirror is modular it is much easier to change the
      behavior of the code editor if we wish to.
  • Drawbacks:
    • Codemirror is quite modular and as seen in package.json and in
      codeeditor.ts we have to supply a lot more of its features to have
      feature parity with Monaco editor.
    • Monaco editor has great integrated language support (features that
      an lsp would provide), Codemirror only has such language support to an
      extend.
    • Monaco editor has its famous command palette (known by many as its
      also available in VSCode), this is not available in code mirror.
  • Good to note:
    • All features that was added on top of the monaco editor (such as
      dynamically changing language support depending on the filename)
      still works and the theme is based on the VSCode colors which largely
      resembles the monaco editor.
    • The code editor is still lazy-loaded (this is painfully clear by
      reading how imports are passed around in codeeditor.ts).
    • This change was privately tested by a few people, a few bugs were
      found (and fixed) but no major drawbacks were noted for their usage of
      the web editor.
    • There's a "search" button in the top bar, so that search can be used
      on mobile. It is otherwise only accessible via
      Ctrl+f.

Co-authored-by: Beowulf beowulf@beocode.eu

Release notes

  • User Interface features
    • PR: feat(ui): replace Monaco with CodeMirror
- Replace the Monaco Editor with CodeMirror 6. This editor is used to facilitate the 'Add file' and 'Edit file' functionality. - Resolves forgejo/forgejo#5440 - Resolves forgejo/forgejo#4536 - Resolves forgejo/forgejo#6568 - Closes forgejo/forgejo#8370 - Rationale: - Monaco editor is a great and powerful editor, however for Forgejo's purpose it acts more like a small IDE than a code editor and is doing too much. In my limited user research the usage of editing files via the web UI is largely for small changes that does not need the features that Monaco editor provides. - Monaco editor has no mobile support, Codemirror is very usable on mobile. - Monaco editor pulls in large dependencies (for language support) and by replacing it with Codemirror the amount of time that webpack needs to build the frontend is reduced by 50% (~30s -> ~15s). - The binary of Forgejo (build with `bindata` tag) is reduced by 2MiB. - Codemirror is much more lightweight and should be more usable on less powerful hardware, most notably the lazy loading is much faster as codemirror uses less javascript. - Because Codemirror is modular it is much easier to change the behavior of the code editor if we wish to. - Drawbacks: - Codemirror is quite modular and as seen in `package.json` and in `codeeditor.ts` we have to supply a lot more of its features to have feature parity with Monaco editor. - Monaco editor has great integrated language support (features that an lsp would provide), Codemirror only has such language support to an extend. - Monaco editor has its famous command palette (known by many as its also available in VSCode), this is not available in code mirror. - Good to note: - All features that was added on top of the monaco editor (such as dynamically changing language support depending on the filename) still works and the theme is based on the VSCode colors which largely resembles the monaco editor. - The code editor is still lazy-loaded (this is painfully clear by reading how imports are passed around in `codeeditor.ts`). - This change was privately tested by a few people, a few bugs were found (and fixed) but no major drawbacks were noted for their usage of the web editor. - There's a "search" button in the top bar, so that search can be used on mobile. It is otherwise only accessible via <kbd>Ctrl</kbd>+<kbd>f</kbd>. Co-authored-by: Beowulf <beowulf@beocode.eu> <!--start release-notes-assistant--> ## Release notes <!--URL:https://codeberg.org/forgejo/forgejo--> - User Interface features - [PR](https://codeberg.org/forgejo/forgejo/pulls/10559): <!--number 10559 --><!--line 0 --><!--description ZmVhdCh1aSk6IHJlcGxhY2UgTW9uYWNvIHdpdGggQ29kZU1pcnJvcg==-->feat(ui): replace Monaco with CodeMirror<!--description--> <!--end release-notes-assistant-->
Beowulf force-pushed beowulf/forgejo-codemirror from 27f8870042
Some checks failed
testing / frontend-checks (pull_request) Failing after 19s
issue-labels / backporting (pull_request_target) Has been skipped
issue-labels / cascade (pull_request_target) Has been skipped
requirements / merge-conditions (pull_request) Failing after 3s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / backend-checks (pull_request) Successful in 2m49s
testing / test-unit (pull_request) Has been skipped
testing / test-e2e (pull_request) Has been skipped
testing / test-mysql (pull_request) Has been skipped
testing / test-pgsql (pull_request) Has been skipped
testing / test-sqlite (pull_request) Has been skipped
testing / test-remote-cacher (redis) (pull_request) Has been skipped
testing / test-remote-cacher (valkey) (pull_request) Has been skipped
testing / test-remote-cacher (garnet) (pull_request) Has been skipped
testing / test-remote-cacher (redict) (pull_request) Has been skipped
testing / security-check (pull_request) Has been skipped
to c9ea0f4f34
Some checks failed
testing / frontend-checks (pull_request) Successful in 46s
requirements / merge-conditions (pull_request) Failing after 2s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / backend-checks (pull_request) Successful in 3m4s
testing / test-unit (pull_request) Successful in 6m22s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m24s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m28s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m23s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m23s
testing / test-e2e (pull_request) Failing after 4m27s
testing / test-mysql (pull_request) Successful in 20m32s
testing / test-sqlite (pull_request) Successful in 25m33s
testing / test-pgsql (pull_request) Successful in 28m49s
testing / security-check (pull_request) Successful in 1m4s
2025-12-23 12:08:38 +01:00
Compare
Beowulf force-pushed beowulf/forgejo-codemirror from a081ebeb1a
Some checks failed
requirements / merge-conditions (pull_request) Failing after 1s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Has been cancelled
testing / backend-checks (pull_request) Has been cancelled
testing / test-unit (pull_request) Has been cancelled
testing / test-e2e (pull_request) Has been cancelled
testing / test-remote-cacher (redis) (pull_request) Has been cancelled
testing / test-remote-cacher (valkey) (pull_request) Has been cancelled
testing / test-remote-cacher (garnet) (pull_request) Has been cancelled
testing / test-remote-cacher (redict) (pull_request) Has been cancelled
testing / test-mysql (pull_request) Has been cancelled
testing / test-pgsql (pull_request) Has been cancelled
testing / test-sqlite (pull_request) Has been cancelled
testing / security-check (pull_request) Has been cancelled
to c49e53b904
Some checks failed
requirements / merge-conditions (pull_request) Failing after 3s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 47s
testing / backend-checks (pull_request) Successful in 3m4s
testing / test-unit (pull_request) Successful in 6m17s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m55s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m53s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m59s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m58s
testing / test-e2e (pull_request) Failing after 10m42s
testing / test-mysql (pull_request) Successful in 26m1s
testing / test-sqlite (pull_request) Successful in 31m50s
testing / test-pgsql (pull_request) Successful in 34m54s
testing / security-check (pull_request) Successful in 1m8s
2025-12-23 15:04:25 +01:00
Compare
Beowulf force-pushed beowulf/forgejo-codemirror from 0ec80b64dd
Some checks failed
requirements / merge-conditions (pull_request) Failing after 2s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Failing after 28s
testing / backend-checks (pull_request) Successful in 4m43s
testing / test-unit (pull_request) Has been skipped
testing / test-e2e (pull_request) Has been skipped
testing / test-mysql (pull_request) Has been skipped
testing / test-pgsql (pull_request) Has been skipped
testing / test-sqlite (pull_request) Has been skipped
testing / test-remote-cacher (redis) (pull_request) Has been skipped
testing / test-remote-cacher (valkey) (pull_request) Has been skipped
testing / test-remote-cacher (garnet) (pull_request) Has been skipped
testing / test-remote-cacher (redict) (pull_request) Has been skipped
testing / security-check (pull_request) Has been skipped
to 585b8f9773
Some checks failed
requirements / merge-conditions (pull_request) Failing after 2s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 55s
testing / backend-checks (pull_request) Successful in 3m17s
testing / test-e2e (pull_request) Failing after 5m46s
testing / test-unit (pull_request) Successful in 7m24s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m5s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m8s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m46s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m53s
testing / test-mysql (pull_request) Successful in 26m26s
testing / test-sqlite (pull_request) Successful in 30m23s
testing / test-pgsql (pull_request) Successful in 34m33s
testing / security-check (pull_request) Successful in 1m11s
2025-12-23 17:14:36 +01:00
Compare
Beowulf force-pushed beowulf/forgejo-codemirror from 585b8f9773
Some checks failed
requirements / merge-conditions (pull_request) Failing after 2s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 55s
testing / backend-checks (pull_request) Successful in 3m17s
testing / test-e2e (pull_request) Failing after 5m46s
testing / test-unit (pull_request) Successful in 7m24s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m5s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m8s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m46s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m53s
testing / test-mysql (pull_request) Successful in 26m26s
testing / test-sqlite (pull_request) Successful in 30m23s
testing / test-pgsql (pull_request) Successful in 34m33s
testing / security-check (pull_request) Successful in 1m11s
to 7bef428a78
Some checks failed
requirements / merge-conditions (pull_request) Failing after 2s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 1m10s
testing / backend-checks (pull_request) Successful in 4m16s
testing / test-unit (pull_request) Successful in 8m2s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m34s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m38s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m53s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m56s
testing / test-mysql (pull_request) Successful in 25m18s
testing / test-sqlite (pull_request) Successful in 31m17s
testing / test-pgsql (pull_request) Successful in 35m21s
testing / security-check (pull_request) Successful in 1m28s
testing / test-e2e (pull_request) Failing after 16m4s
2025-12-23 17:28:46 +01:00
Compare
Author
Owner

I hate Playwright 😄

I hate Playwright 😄
Beowulf force-pushed beowulf/forgejo-codemirror from 7bef428a78
Some checks failed
requirements / merge-conditions (pull_request) Failing after 2s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 1m10s
testing / backend-checks (pull_request) Successful in 4m16s
testing / test-unit (pull_request) Successful in 8m2s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m34s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m38s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m53s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m56s
testing / test-mysql (pull_request) Successful in 25m18s
testing / test-sqlite (pull_request) Successful in 31m17s
testing / test-pgsql (pull_request) Successful in 35m21s
testing / security-check (pull_request) Successful in 1m28s
testing / test-e2e (pull_request) Failing after 16m4s
to a50f53d41f
Some checks failed
requirements / merge-conditions (pull_request) Failing after 1s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Failing after 20s
testing / backend-checks (pull_request) Successful in 5m11s
testing / test-unit (pull_request) Has been skipped
testing / test-e2e (pull_request) Has been skipped
testing / test-mysql (pull_request) Has been skipped
testing / test-pgsql (pull_request) Has been skipped
testing / test-sqlite (pull_request) Has been skipped
testing / test-remote-cacher (redis) (pull_request) Has been skipped
testing / test-remote-cacher (valkey) (pull_request) Has been skipped
testing / test-remote-cacher (garnet) (pull_request) Has been skipped
testing / test-remote-cacher (redict) (pull_request) Has been skipped
testing / security-check (pull_request) Has been skipped
2025-12-23 18:46:10 +01:00
Compare
Beowulf force-pushed beowulf/forgejo-codemirror from a50f53d41f
Some checks failed
requirements / merge-conditions (pull_request) Failing after 1s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Failing after 20s
testing / backend-checks (pull_request) Successful in 5m11s
testing / test-unit (pull_request) Has been skipped
testing / test-e2e (pull_request) Has been skipped
testing / test-mysql (pull_request) Has been skipped
testing / test-pgsql (pull_request) Has been skipped
testing / test-sqlite (pull_request) Has been skipped
testing / test-remote-cacher (redis) (pull_request) Has been skipped
testing / test-remote-cacher (valkey) (pull_request) Has been skipped
testing / test-remote-cacher (garnet) (pull_request) Has been skipped
testing / test-remote-cacher (redict) (pull_request) Has been skipped
testing / security-check (pull_request) Has been skipped
to bc9421eace
Some checks failed
requirements / merge-conditions (pull_request) Failing after 1s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 1m15s
testing / backend-checks (pull_request) Successful in 4m22s
testing / test-unit (pull_request) Successful in 8m40s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m29s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m35s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m35s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m29s
testing / test-mysql (pull_request) Successful in 24m44s
testing / test-sqlite (pull_request) Successful in 28m31s
testing / test-e2e (pull_request) Failing after 13m9s
testing / test-pgsql (pull_request) Successful in 32m45s
testing / security-check (pull_request) Successful in 55s
2025-12-23 18:50:48 +01:00
Compare
Beowulf force-pushed beowulf/forgejo-codemirror from bc9421eace
Some checks failed
requirements / merge-conditions (pull_request) Failing after 1s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 1m15s
testing / backend-checks (pull_request) Successful in 4m22s
testing / test-unit (pull_request) Successful in 8m40s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m29s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m35s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m35s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m29s
testing / test-mysql (pull_request) Successful in 24m44s
testing / test-sqlite (pull_request) Successful in 28m31s
testing / test-e2e (pull_request) Failing after 13m9s
testing / test-pgsql (pull_request) Successful in 32m45s
testing / security-check (pull_request) Successful in 55s
to 301c2df378
Some checks failed
requirements / merge-conditions (pull_request) Failing after 2s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 49s
testing / backend-checks (pull_request) Successful in 3m0s
testing / test-unit (pull_request) Successful in 6m43s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m34s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m33s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m36s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m32s
testing / test-e2e (pull_request) Failing after 14m56s
testing / test-mysql (pull_request) Successful in 20m42s
testing / test-sqlite (pull_request) Successful in 25m44s
testing / test-pgsql (pull_request) Successful in 28m50s
testing / security-check (pull_request) Successful in 59s
2025-12-23 19:32:30 +01:00
Compare
Beowulf force-pushed beowulf/forgejo-codemirror from 301c2df378
Some checks failed
requirements / merge-conditions (pull_request) Failing after 2s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 49s
testing / backend-checks (pull_request) Successful in 3m0s
testing / test-unit (pull_request) Successful in 6m43s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m34s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m33s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m36s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m32s
testing / test-e2e (pull_request) Failing after 14m56s
testing / test-mysql (pull_request) Successful in 20m42s
testing / test-sqlite (pull_request) Successful in 25m44s
testing / test-pgsql (pull_request) Successful in 28m50s
testing / security-check (pull_request) Successful in 59s
to 86458d952f
Some checks failed
requirements / merge-conditions (pull_request) Failing after 2s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Failing after 19s
testing / backend-checks (pull_request) Successful in 3m23s
testing / test-unit (pull_request) Has been skipped
testing / test-e2e (pull_request) Has been skipped
testing / test-mysql (pull_request) Has been skipped
testing / test-pgsql (pull_request) Has been skipped
testing / test-sqlite (pull_request) Has been skipped
testing / test-remote-cacher (redis) (pull_request) Has been skipped
testing / test-remote-cacher (valkey) (pull_request) Has been skipped
testing / test-remote-cacher (garnet) (pull_request) Has been skipped
testing / test-remote-cacher (redict) (pull_request) Has been skipped
testing / security-check (pull_request) Has been skipped
2025-12-23 20:12:58 +01:00
Compare
Beowulf force-pushed beowulf/forgejo-codemirror from 86458d952f
Some checks failed
requirements / merge-conditions (pull_request) Failing after 2s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Failing after 19s
testing / backend-checks (pull_request) Successful in 3m23s
testing / test-unit (pull_request) Has been skipped
testing / test-e2e (pull_request) Has been skipped
testing / test-mysql (pull_request) Has been skipped
testing / test-pgsql (pull_request) Has been skipped
testing / test-sqlite (pull_request) Has been skipped
testing / test-remote-cacher (redis) (pull_request) Has been skipped
testing / test-remote-cacher (valkey) (pull_request) Has been skipped
testing / test-remote-cacher (garnet) (pull_request) Has been skipped
testing / test-remote-cacher (redict) (pull_request) Has been skipped
testing / security-check (pull_request) Has been skipped
to 2b851ffd08
Some checks failed
requirements / merge-conditions (pull_request) Failing after 4s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 1m4s
testing / backend-checks (pull_request) Successful in 3m24s
testing / test-unit (pull_request) Successful in 6m19s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m25s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m27s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m31s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m30s
testing / test-e2e (pull_request) Failing after 15m22s
testing / test-mysql (pull_request) Successful in 22m0s
testing / test-sqlite (pull_request) Successful in 28m4s
testing / test-pgsql (pull_request) Successful in 32m2s
testing / security-check (pull_request) Successful in 1m5s
2025-12-23 20:14:02 +01:00
Compare
Beowulf force-pushed beowulf/forgejo-codemirror from 2aa0c6c9c1
Some checks failed
requirements / merge-conditions (pull_request) Failing after 5s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 1m21s
testing / backend-checks (pull_request) Successful in 4m16s
testing / test-unit (pull_request) Successful in 7m24s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m24s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m24s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m17s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m15s
testing / test-e2e (pull_request) Successful in 19m45s
testing / test-mysql (pull_request) Successful in 23m54s
testing / test-sqlite (pull_request) Successful in 27m54s
testing / test-pgsql (pull_request) Successful in 32m8s
testing / security-check (pull_request) Successful in 54s
to 9656da3f22
Some checks failed
requirements / merge-conditions (pull_request) Failing after 2s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Failing after 20s
testing / backend-checks (pull_request) Successful in 3m28s
testing / test-unit (pull_request) Has been skipped
testing / test-e2e (pull_request) Has been skipped
testing / test-mysql (pull_request) Has been skipped
testing / test-pgsql (pull_request) Has been skipped
testing / test-sqlite (pull_request) Has been skipped
testing / test-remote-cacher (redis) (pull_request) Has been skipped
testing / test-remote-cacher (valkey) (pull_request) Has been skipped
testing / test-remote-cacher (garnet) (pull_request) Has been skipped
testing / test-remote-cacher (redict) (pull_request) Has been skipped
testing / security-check (pull_request) Has been skipped
2025-12-24 00:50:38 +01:00
Compare
Beowulf force-pushed beowulf/forgejo-codemirror from 9656da3f22
Some checks failed
requirements / merge-conditions (pull_request) Failing after 2s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Failing after 20s
testing / backend-checks (pull_request) Successful in 3m28s
testing / test-unit (pull_request) Has been skipped
testing / test-e2e (pull_request) Has been skipped
testing / test-mysql (pull_request) Has been skipped
testing / test-pgsql (pull_request) Has been skipped
testing / test-sqlite (pull_request) Has been skipped
testing / test-remote-cacher (redis) (pull_request) Has been skipped
testing / test-remote-cacher (valkey) (pull_request) Has been skipped
testing / test-remote-cacher (garnet) (pull_request) Has been skipped
testing / test-remote-cacher (redict) (pull_request) Has been skipped
testing / security-check (pull_request) Has been skipped
to 2a5cd3b15c
Some checks failed
issue-labels / backporting (pull_request_target) Has been skipped
issue-labels / cascade (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 1m3s
requirements / merge-conditions (pull_request) Successful in 2s
issue-labels / release-notes (pull_request_target) Successful in 38s
testing / backend-checks (pull_request) Successful in 3m25s
testing / test-unit (pull_request) Successful in 6m36s
testing / test-remote-cacher (redict) (pull_request) Has been cancelled
testing / test-e2e (pull_request) Has been cancelled
testing / security-check (pull_request) Has been cancelled
testing / test-mysql (pull_request) Has been cancelled
testing / test-sqlite (pull_request) Has been cancelled
testing / test-remote-cacher (garnet) (pull_request) Has been cancelled
testing / test-remote-cacher (redis) (pull_request) Has been cancelled
testing / test-remote-cacher (valkey) (pull_request) Has been cancelled
testing / test-pgsql (pull_request) Has been cancelled
2025-12-24 00:51:50 +01:00
Compare
Where does that come from? The following is a preview of the release notes for this pull request, as they will appear in the upcoming release. They are derived from the content of the `release-notes/10559.md` file, if it exists, or the title of the pull request. They were also added at the bottom of the description of this pull request for easier reference.

This message and the release notes originate from a call to the release-notes-assistant.

@@ -23,3 +23,11 @@
   - This change was privately tested by a few people, a few bugs were found (and fixed) but no major drawbacks were noted for their usage of the web editor.
   - There's a "search" button in the top bar, so that search can be used on mobile. It is otherwise only accessible via <kbd>Ctrl</kbd>+<kbd>f</kbd>.
-  - There are people that want to see a integrated IDE in Forgejo and might see this as removing such feature, I do not believe that the current implementation fits the definition of a IDE and with this change it is more focused and efficient on being a single file editor. Gitlab has a good post about this distinction, https://about.gitlab.com/blog/a-tale-of-two-editors/.
\ No newline at end of file
+  - There are people that want to see a integrated IDE in Forgejo and might see this as removing such feature, I do not believe that the current implementation fits the definition of a IDE and with this change it is more focused and efficient on being a single file editor. Gitlab has a good post about this distinction, https://about.gitlab.com/blog/a-tale-of-two-editors/.
+
+<!--start release-notes-assistant-->
+
+## Release notes
+<!--URL:https://codeberg.org/forgejo/forgejo-->
+- User Interface features
+  - [PR](https://codeberg.org/forgejo/forgejo/pulls/10559): <!--number 10559 --><!--line 0 --><!--description ZmVhdCh1aSk6IHJlcGxhY2UgTW9uYWNvIHdpdGggQ29kZU1pcnJvcg==-->feat(ui): replace Monaco with CodeMirror<!--description-->
+<!--end release-notes-assistant-->

Release notes

  • User Interface features
    • PR: feat(ui): replace Monaco with CodeMirror
<details> <summary>Where does that come from?</summary> The following is a preview of the release notes for this pull request, as they will appear in the upcoming release. They are derived from the content of the `release-notes/10559.md` file, if it exists, or the title of the pull request. They were also added at the bottom of the description of this pull request for easier reference. This message and the release notes originate from a call to the [release-notes-assistant](https://code.forgejo.org/forgejo/release-notes-assistant). ```diff @@ -23,3 +23,11 @@ - This change was privately tested by a few people, a few bugs were found (and fixed) but no major drawbacks were noted for their usage of the web editor. - There's a "search" button in the top bar, so that search can be used on mobile. It is otherwise only accessible via <kbd>Ctrl</kbd>+<kbd>f</kbd>. - - There are people that want to see a integrated IDE in Forgejo and might see this as removing such feature, I do not believe that the current implementation fits the definition of a IDE and with this change it is more focused and efficient on being a single file editor. Gitlab has a good post about this distinction, https://about.gitlab.com/blog/a-tale-of-two-editors/. \ No newline at end of file + - There are people that want to see a integrated IDE in Forgejo and might see this as removing such feature, I do not believe that the current implementation fits the definition of a IDE and with this change it is more focused and efficient on being a single file editor. Gitlab has a good post about this distinction, https://about.gitlab.com/blog/a-tale-of-two-editors/. + +<!--start release-notes-assistant--> + +## Release notes +<!--URL:https://codeberg.org/forgejo/forgejo--> +- User Interface features + - [PR](https://codeberg.org/forgejo/forgejo/pulls/10559): <!--number 10559 --><!--line 0 --><!--description ZmVhdCh1aSk6IHJlcGxhY2UgTW9uYWNvIHdpdGggQ29kZU1pcnJvcg==-->feat(ui): replace Monaco with CodeMirror<!--description--> +<!--end release-notes-assistant--> ``` </details> <!--start release-notes-assistant--> ## Release notes <!--URL:https://codeberg.org/forgejo/forgejo--> - User Interface features - [PR](https://codeberg.org/forgejo/forgejo/pulls/10559): <!--number 10559 --><!--line 0 --><!--description ZmVhdCh1aSk6IHJlcGxhY2UgTW9uYWNvIHdpdGggQ29kZU1pcnJvcg==-->feat(ui): replace Monaco with CodeMirror<!--description--> <!--end release-notes-assistant-->
Beowulf force-pushed beowulf/forgejo-codemirror from 2a5cd3b15c
Some checks failed
issue-labels / backporting (pull_request_target) Has been skipped
issue-labels / cascade (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 1m3s
requirements / merge-conditions (pull_request) Successful in 2s
issue-labels / release-notes (pull_request_target) Successful in 38s
testing / backend-checks (pull_request) Successful in 3m25s
testing / test-unit (pull_request) Successful in 6m36s
testing / test-remote-cacher (redict) (pull_request) Has been cancelled
testing / test-e2e (pull_request) Has been cancelled
testing / security-check (pull_request) Has been cancelled
testing / test-mysql (pull_request) Has been cancelled
testing / test-sqlite (pull_request) Has been cancelled
testing / test-remote-cacher (garnet) (pull_request) Has been cancelled
testing / test-remote-cacher (redis) (pull_request) Has been cancelled
testing / test-remote-cacher (valkey) (pull_request) Has been cancelled
testing / test-pgsql (pull_request) Has been cancelled
to 08a57ad70b
Some checks failed
requirements / merge-conditions (pull_request) Successful in 1s
issue-labels / release-notes (pull_request_target) Successful in 38s
testing / frontend-checks (pull_request) Successful in 55s
testing / backend-checks (pull_request) Successful in 3m12s
testing / test-remote-cacher (redis) (pull_request) Has been cancelled
testing / test-remote-cacher (valkey) (pull_request) Has been cancelled
testing / test-remote-cacher (garnet) (pull_request) Has been cancelled
testing / test-remote-cacher (redict) (pull_request) Has been cancelled
testing / security-check (pull_request) Has been cancelled
testing / test-sqlite (pull_request) Has been cancelled
testing / test-mysql (pull_request) Has been cancelled
testing / test-pgsql (pull_request) Has been cancelled
testing / test-e2e (pull_request) Has been cancelled
testing / test-unit (pull_request) Has been cancelled
2025-12-24 01:02:54 +01:00
Compare
Beowulf force-pushed beowulf/forgejo-codemirror from 08a57ad70b
Some checks failed
requirements / merge-conditions (pull_request) Successful in 1s
issue-labels / release-notes (pull_request_target) Successful in 38s
testing / frontend-checks (pull_request) Successful in 55s
testing / backend-checks (pull_request) Successful in 3m12s
testing / test-remote-cacher (redis) (pull_request) Has been cancelled
testing / test-remote-cacher (valkey) (pull_request) Has been cancelled
testing / test-remote-cacher (garnet) (pull_request) Has been cancelled
testing / test-remote-cacher (redict) (pull_request) Has been cancelled
testing / security-check (pull_request) Has been cancelled
testing / test-sqlite (pull_request) Has been cancelled
testing / test-mysql (pull_request) Has been cancelled
testing / test-pgsql (pull_request) Has been cancelled
testing / test-e2e (pull_request) Has been cancelled
testing / test-unit (pull_request) Has been cancelled
to 728da6419f
All checks were successful
testing / frontend-checks (pull_request) Successful in 1m35s
requirements / merge-conditions (pull_request) Successful in 2s
issue-labels / release-notes (pull_request_target) Successful in 38s
testing / backend-checks (pull_request) Successful in 4m17s
testing / test-unit (pull_request) Successful in 7m51s
testing / test-remote-cacher (redis) (pull_request) Successful in 3m24s
testing / test-remote-cacher (garnet) (pull_request) Successful in 3m20s
testing / test-remote-cacher (valkey) (pull_request) Successful in 3m22s
testing / test-remote-cacher (redict) (pull_request) Successful in 3m25s
testing / test-e2e (pull_request) Successful in 21m11s
testing / test-mysql (pull_request) Successful in 24m13s
testing / test-sqlite (pull_request) Successful in 29m15s
testing / test-pgsql (pull_request) Successful in 32m27s
testing / security-check (pull_request) Successful in 55s
2025-12-24 01:17:42 +01:00
Compare
Author
Owner

The e2e tests should be pretty reliable now and locally I have a stable 100% success rate.

@Gusted we can cherry-pick/squash the canges in !8370 or continue with this PR - I let you decide, I'm fine with both. If we keep this PR, I will alter squash the commits, but for now I keep the single commits for easier review.

The e2e tests should be pretty reliable now and locally I have a stable 100% success rate. @Gusted we can cherry-pick/squash the canges in !8370 or continue with this PR - I let you decide, I'm fine with both. If we keep this PR, I will alter squash the commits, but for now I keep the single commits for easier review.
Beowulf changed title from WIP: feat(ui): replace Monaco with CodeMirror to feat(ui): replace Monaco with CodeMirror 2025-12-24 01:20:32 +01:00
Member

Unrelated to the technical implementation: I wonder a bit about the overall development (incl. security patches) of CodeMirror when looking at the commit history. It has seen ~ 10 commits in the last 2 years. While there are no open PRs, it seems not much is happening it all, which is somewhat concerning in terms of security and the effort which is being put in to migrate to it.

Unrelated to the technical implementation: I wonder a bit about the overall development (incl. security patches) of CodeMirror when looking at the [commit history](https://github.com/codemirror/dev/commits/main/). It has seen ~ 10 commits in the last 2 years. While there are no open PRs, it seems not much is happening it all, which is somewhat concerning in terms of security and the effort which is being put in to migrate to it.
Owner

@pat-s wrote in #10559 (comment):

Unrelated to the technical implementation: I wonder a bit about the overall development (incl. security patches) of CodeMirror when looking at the commit history. It has seen ~ 10 commits in the last 2 years. While there are no open PRs, it seems not much is happening it all, which is somewhat concerning in terms of security and the effort which is being put in to migrate to it.

This repository is not being used to develop code. Take a look at the other packages of codemirror.

@pat-s wrote in https://codeberg.org/forgejo/forgejo/pulls/10559#issuecomment-9301178: > Unrelated to the technical implementation: I wonder a bit about the overall development (incl. security patches) of CodeMirror when looking at the [commit history](https://github.com/codemirror/dev/commits/main/). It has seen ~ 10 commits in the last 2 years. While there are no open PRs, it seems not much is happening it all, which is somewhat concerning in terms of security and the effort which is being put in to migrate to it. This repository is not being used to develop code. Take a look at the other packages of codemirror.
Member

Ah, thanks, didn't realize it's split across many repos and dev isn't representative even though it has all the stars.

Ah, thanks, didn't realize it's split across many repos and `dev` isn't representative even though it has all the stars.
@ -0,0 +1,198 @@
// @watch start
Owner

Missing copyright headers.

Missing copyright headers.
Beowulf marked this conversation as resolved
@ -0,0 +195,4 @@
await page.keyboard.press('ControlOrMeta+F', {delay: 5});
await expect(searchField).toHaveCount(0);
});
Owner

There's some logic to switch the language when you change the file extension, this might be something to test a easy one would be that when you rename a file to .md that the "Preview changes" tab is shown.

There's some logic to switch the language when you change the file extension, this might be something to test a easy one would be that when you rename a file to `.md` that the "Preview changes" tab is shown.
Beowulf marked this conversation as resolved
@ -0,0 +1,237 @@
import type {SearchQuery} from '@codemirror/search';
Owner

Ha, I forgot copyright headers myself. Feel free to have this work licensed under GPL-3.0-or-later.

Ha, I forgot copyright headers myself. Feel free to have this work licensed under GPL-3.0-or-later.
Beowulf marked this conversation as resolved
Owner

At this point the implementation is pretty solid. Markdown preview needs some styling fixes.

At this point the implementation is pretty solid. Markdown preview needs some styling fixes.
Beowulf force-pushed beowulf/forgejo-codemirror from 728da6419f
All checks were successful
testing / frontend-checks (pull_request) Successful in 1m35s
requirements / merge-conditions (pull_request) Successful in 2s
issue-labels / release-notes (pull_request_target) Successful in 38s
testing / backend-checks (pull_request) Successful in 4m17s
testing / test-unit (pull_request) Successful in 7m51s
testing / test-remote-cacher (redis) (pull_request) Successful in 3m24s
testing / test-remote-cacher (garnet) (pull_request) Successful in 3m20s
testing / test-remote-cacher (valkey) (pull_request) Successful in 3m22s
testing / test-remote-cacher (redict) (pull_request) Successful in 3m25s
testing / test-e2e (pull_request) Successful in 21m11s
testing / test-mysql (pull_request) Successful in 24m13s
testing / test-sqlite (pull_request) Successful in 29m15s
testing / test-pgsql (pull_request) Successful in 32m27s
testing / security-check (pull_request) Successful in 55s
to 67731c016d
All checks were successful
requirements / merge-conditions (pull_request) Successful in 2s
issue-labels / release-notes (pull_request_target) Successful in 55s
testing / frontend-checks (pull_request) Successful in 1m31s
testing / backend-checks (pull_request) Successful in 8m24s
Integration tests for the release process / release-simulation (pull_request) Successful in 10m4s
testing / test-unit (pull_request) Successful in 7m47s
testing / test-e2e (pull_request) Successful in 22m0s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m45s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m47s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m50s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m28s
testing / test-mysql (pull_request) Successful in 25m45s
testing / test-sqlite (pull_request) Successful in 28m17s
testing / test-pgsql (pull_request) Successful in 32m26s
testing / security-check (pull_request) Successful in 1m7s
2025-12-29 10:28:56 +01:00
Compare
Author
Owner

@0ko wrote in #10559 (comment):

Markdown preview needs some styling fixes.

Just some padding around the content, or have you also seen something else?

@0ko wrote in https://codeberg.org/forgejo/forgejo/pulls/10559#issuecomment-9324023: > Markdown preview needs some styling fixes. Just some padding around the content, or have you also seen something else?
Owner

Well yes, but I needed to asses the root cause, e.g. whether it was caused by some orphaned CSS selectors.

Well yes, but I needed to asses the root cause, e.g. whether it was caused by some orphaned CSS selectors.
@ -31,2 +15,2 @@
.monaco-scrollable-element > .scrollbar > .slider:active {
background: var(--color-primary-dark-2) !important;
.edit.form .ui.segment {
padding: 0;
Owner

I doesn't seem like this rule is needed.

For preventing unwanted padding in editor tab, there's already this from fileeditor.css

.repository.file.editor .tab[data-tab="write"] {
  padding: 0 !important;
}
I doesn't seem like this rule is needed. For preventing unwanted padding in editor tab, there's already this from `fileeditor.css` ``` .repository.file.editor .tab[data-tab="write"] { padding: 0 !important; } ```
Beowulf marked this conversation as resolved
Owner

The conversion from tabs to switch works good, but need to remove class attached from segments so they are rounded properly.

The conversion from tabs to switch works good, but need to remove class `attached` from segments so they are rounded properly.
Beowulf force-pushed beowulf/forgejo-codemirror from e822eec684
Some checks failed
requirements / merge-conditions (pull_request) Successful in 2s
testing / frontend-checks (pull_request) Failing after 22s
issue-labels / release-notes (pull_request_target) Successful in 36s
Integration tests for the release process / release-simulation (pull_request) Has been cancelled
testing / backend-checks (pull_request) Successful in 3m37s
testing / test-unit (pull_request) Has been skipped
testing / test-e2e (pull_request) Has been skipped
testing / test-mysql (pull_request) Has been skipped
testing / test-pgsql (pull_request) Has been skipped
testing / test-sqlite (pull_request) Has been skipped
testing / test-remote-cacher (redis) (pull_request) Has been skipped
testing / test-remote-cacher (valkey) (pull_request) Has been skipped
testing / test-remote-cacher (garnet) (pull_request) Has been skipped
testing / test-remote-cacher (redict) (pull_request) Has been skipped
testing / security-check (pull_request) Has been skipped
to 4d8c0b2bd5
Some checks failed
requirements / merge-conditions (pull_request) Successful in 1s
testing / test-unit (pull_request) Has been cancelled
testing / backend-checks (pull_request) Has been cancelled
testing / test-e2e (pull_request) Has been cancelled
testing / test-remote-cacher (redis) (pull_request) Has been cancelled
testing / test-remote-cacher (valkey) (pull_request) Has been cancelled
testing / test-remote-cacher (garnet) (pull_request) Has been cancelled
testing / test-remote-cacher (redict) (pull_request) Has been cancelled
testing / test-mysql (pull_request) Has been cancelled
testing / test-pgsql (pull_request) Has been cancelled
testing / test-sqlite (pull_request) Has been cancelled
testing / security-check (pull_request) Has been cancelled
testing / frontend-checks (pull_request) Has been cancelled
issue-labels / release-notes (pull_request_target) Successful in 35s
Integration tests for the release process / release-simulation (pull_request) Successful in 7m47s
2025-12-29 22:10:24 +01:00
Compare
Beowulf force-pushed beowulf/forgejo-codemirror from 4d8c0b2bd5
Some checks failed
requirements / merge-conditions (pull_request) Successful in 1s
testing / test-unit (pull_request) Has been cancelled
testing / backend-checks (pull_request) Has been cancelled
testing / test-e2e (pull_request) Has been cancelled
testing / test-remote-cacher (redis) (pull_request) Has been cancelled
testing / test-remote-cacher (valkey) (pull_request) Has been cancelled
testing / test-remote-cacher (garnet) (pull_request) Has been cancelled
testing / test-remote-cacher (redict) (pull_request) Has been cancelled
testing / test-mysql (pull_request) Has been cancelled
testing / test-pgsql (pull_request) Has been cancelled
testing / test-sqlite (pull_request) Has been cancelled
testing / security-check (pull_request) Has been cancelled
testing / frontend-checks (pull_request) Has been cancelled
issue-labels / release-notes (pull_request_target) Successful in 35s
Integration tests for the release process / release-simulation (pull_request) Successful in 7m47s
to 1a0ebf322e
All checks were successful
requirements / merge-conditions (pull_request) Successful in 1s
issue-labels / release-notes (pull_request_target) Successful in 36s
testing / frontend-checks (pull_request) Successful in 54s
testing / backend-checks (pull_request) Successful in 2m58s
testing / test-unit (pull_request) Successful in 8m29s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m0s
testing / test-remote-cacher (valkey) (pull_request) Successful in 1m57s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m12s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m8s
testing / test-mysql (pull_request) Successful in 27m29s
testing / test-sqlite (pull_request) Successful in 31m28s
testing / test-pgsql (pull_request) Successful in 35m34s
testing / security-check (pull_request) Successful in 57s
testing / test-e2e (pull_request) Successful in 17m11s
2025-12-29 22:11:35 +01:00
Compare
Author
Owner

Resolved both of your comments @0ko & @Gusted

Resolved both of your comments @0ko & @Gusted
Author
Owner

First occurence (after adding them and making them (more) stable) that the e2e test failed randomly. 🤔

First occurence (after adding them and making them (more) stable) that the e2e test failed randomly. 🤔
Gusted approved these changes 2026-01-03 04:09:30 +01:00
Gusted left a comment
Owner

Many thanks for getting this over the finish line, the additions looks great.

Many thanks for getting this over the finish line, the additions looks great.
Owner

There's a merge conflict.

There's a merge conflict.
@ -34,2 +35,4 @@
</div>
<button class="secondary button" id="editor-find" type="button">{{svg "octicon-search"}}<span class="text not-mobile">Search</span></button>
</div>
<div class="ui bottom attached active tab segment" data-tab="write">
Owner

Remove attached so the conversion from tabular menu to switch looks good.

Remove `attached` so the conversion from `tabular menu` to `switch` looks good.
Beowulf marked this conversation as resolved
@ -41,3 +44,3 @@
<div class="editor-loading is-loading"></div>
{{template "shared/codemirror_container" .}}
</div>
<div class="ui bottom attached tab segment markup" data-tab="preview">
Owner

Ditto

Ditto
Beowulf marked this conversation as resolved
0ko approved these changes 2026-01-03 20:07:01 +01:00
0ko left a comment
Owner

Looks mergeable! Some patching work can be done later.

Looks mergeable! Some patching work can be done later.
Beowulf force-pushed beowulf/forgejo-codemirror from 1a0ebf322e
All checks were successful
requirements / merge-conditions (pull_request) Successful in 1s
issue-labels / release-notes (pull_request_target) Successful in 36s
testing / frontend-checks (pull_request) Successful in 54s
testing / backend-checks (pull_request) Successful in 2m58s
testing / test-unit (pull_request) Successful in 8m29s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m0s
testing / test-remote-cacher (valkey) (pull_request) Successful in 1m57s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m12s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m8s
testing / test-mysql (pull_request) Successful in 27m29s
testing / test-sqlite (pull_request) Successful in 31m28s
testing / test-pgsql (pull_request) Successful in 35m34s
testing / security-check (pull_request) Successful in 57s
testing / test-e2e (pull_request) Successful in 17m11s
to 200c5452ac
Some checks failed
issue-labels / release-notes (pull_request_target) Waiting to run
testing / backend-checks (pull_request) Has been cancelled
testing / frontend-checks (pull_request) Has been cancelled
testing / test-unit (pull_request) Has been cancelled
testing / test-e2e (pull_request) Has been cancelled
testing / test-remote-cacher (redis) (pull_request) Has been cancelled
testing / test-remote-cacher (valkey) (pull_request) Has been cancelled
testing / test-remote-cacher (garnet) (pull_request) Has been cancelled
testing / test-remote-cacher (redict) (pull_request) Has been cancelled
testing / test-mysql (pull_request) Has been cancelled
testing / test-pgsql (pull_request) Has been cancelled
testing / test-sqlite (pull_request) Has been cancelled
testing / security-check (pull_request) Has been cancelled
requirements / merge-conditions (pull_request) Successful in 26s
2026-01-04 21:59:08 +01:00
Compare
Beowulf force-pushed beowulf/forgejo-codemirror from 86e30db6fd
Some checks failed
requirements / merge-conditions (pull_request) Successful in 1s
testing / test-unit (pull_request) Has been cancelled
testing / test-e2e (pull_request) Has been cancelled
testing / test-remote-cacher (redis) (pull_request) Has been cancelled
testing / test-remote-cacher (valkey) (pull_request) Has been cancelled
testing / test-remote-cacher (garnet) (pull_request) Has been cancelled
testing / test-remote-cacher (redict) (pull_request) Has been cancelled
testing / test-mysql (pull_request) Has been cancelled
testing / test-pgsql (pull_request) Has been cancelled
testing / test-sqlite (pull_request) Has been cancelled
testing / security-check (pull_request) Has been cancelled
testing / frontend-checks (pull_request) Has been cancelled
testing / backend-checks (pull_request) Has been cancelled
issue-labels / release-notes (pull_request_target) Successful in 42s
to 4a324e99e4
Some checks failed
testing / frontend-checks (pull_request) Successful in 50s
testing / backend-checks (pull_request) Successful in 3m12s
testing / test-unit (pull_request) Successful in 6m17s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m1s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m3s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m3s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m3s
testing / test-e2e (pull_request) Successful in 21m16s
testing / test-mysql (pull_request) Successful in 23m46s
testing / test-sqlite (pull_request) Successful in 27m45s
testing / test-pgsql (pull_request) Successful in 32m1s
testing / security-check (pull_request) Successful in 42s
milestone / set (pull_request_target) Successful in 3s
requirements / merge-conditions (pull_request) Successful in 1s
issue-labels / cascade (pull_request_target) Has been skipped
issue-labels / backporting (pull_request_target) Failing after 19s
issue-labels / release-notes (pull_request_target) Successful in 31s
2026-01-04 23:16:15 +01:00
Compare
Author
Owner

Removed the attached class at three places (!10559 (commit 86e30db6fd)), rebased and resolved the merge conflict and squashed the commits together.

Removed the `attached` class at three places (https://codeberg.org/forgejo/forgejo/pulls/10559/commits/86e30db6fd03bc5f4603f17f67f4ee6e6bfeb7a8), rebased and resolved the merge conflict and squashed the commits together.
Gusted scheduled this pull request to auto merge when all checks succeed 2026-01-04 23:19:27 +01:00
Gusted canceled auto merging this pull request when all checks succeed 2026-01-04 23:20:30 +01:00
Gusted scheduled this pull request to auto merge when all checks succeed 2026-01-04 23:20:44 +01:00
Gusted merged commit 28e0af23fa into forgejo 2026-01-04 23:52:35 +01:00

The backport to v14.0/forgejo failed. Check the latest run for more details.

The backport to `v14.0/forgejo` failed. Check the latest run for more details.
viceice approved these changes 2026-01-05 08:50:10 +01:00
viceice left a comment
Owner

❤️

❤️
Owner

Removing the label because the manual v14 backport will be in the release notes

Removing the label because the manual v14 backport will be in the release notes

The backport to v14.0/forgejo failed. Check the latest run for more details.

The backport to `v14.0/forgejo` failed. Check the latest run for more details.
Sign in to join this conversation.
No reviewers
No labels
arch
riscv64
backport/v1.19
backport/v1.20
backport/v1.21/forgejo
backport/v10.0/forgejo
backport/v11.0/forgejo
backport/v12.0/forgejo
backport/v13.0/forgejo
backport/v14.0/forgejo
backport/v7.0/forgejo
backport/v8.0/forgejo
backport/v9.0/forgejo
breaking
bug
bug
confirmed
bug
duplicate
bug
needs-more-info
bug
new-report
bug
reported-upstream
code/actions
code/api
code/auth
code/auth/faidp
code/auth/farp
code/email
code/federation
code/git
code/migrations
code/packages
code/wiki
database
MySQL
database
PostgreSQL
database
SQLite
dependency-upgrade
dependency
certmagic
dependency
chart.js
dependency
Chi
dependency
Chroma
dependency
citation.js
dependency
codespell
dependency
css-loader
dependency
devcontainers
dependency
dropzone
dependency
editorconfig-checker
dependency
elasticsearch
dependency
enmime
dependency
F3
dependency
ForgeFed
dependency
garage
dependency
Git
dependency
git-backporting
dependency
Gitea
dependency
gitignore
dependency
go-ap
dependency
go-enry
dependency
go-gitlab
dependency
Go-org
dependency
go-rpmutils
dependency
go-sql-driver mysql
dependency
go-swagger
dependency
go-version
dependency
go-webauthn
dependency
gocron
dependency
Golang
dependency
goldmark
dependency
goquery
dependency
Goth
dependency
grpc-go
dependency
happy-dom
dependency
Helm
dependency
image-spec
dependency
jsonschema
dependency
KaTeX
dependency
lint
dependency
MariaDB
dependency
Mermaid
dependency
minio-go
dependency
misspell
dependency
Monaco
dependency
PDFobject
dependency
playwright
dependency
postcss
dependency
postcss-plugins
dependency
pprof
dependency
prometheus client_golang
dependency
protobuf
dependency
relative-time-element
dependency
renovate
dependency
reply
dependency
ssh
dependency
swagger-ui
dependency
tailwind
dependency
temporal-polyfill
dependency
terminal-to-html
dependency
tests-only
dependency
text-expander-element
dependency
urfave
dependency
vfsgen
dependency
vite
dependency
Woodpecker CI
dependency
x tools
dependency
XORM
Discussion
duplicate
enhancement/feature
forgejo/accessibility
forgejo/branding
forgejo/ci
forgejo/commit-graph
forgejo/documentation
forgejo/furnace cleanup
forgejo/i18n
forgejo/interop
forgejo/moderation
forgejo/privacy
forgejo/release
forgejo/scaling
forgejo/security
forgejo/ui
Gain
High
Gain
Nice to have
Gain
Undefined
Gain
Very High
good first issue
i18n/backport-stable
impact
large
impact
medium
impact
small
impact
unknown
Incompatible license
issue
closed
issue
do-not-exist-yet
issue
open
manual test
Manually tested during feature freeze
OS
FreeBSD
OS
Linux
OS
macOS
OS
Windows
problem
QA
regression
release blocker
Release Cycle
Feature Freeze
release-blocker
v7.0
release-blocker
v7.0.1
release-blocker
v7.0.2
release-blocker
v7.0.3
release-blocker
v7.0.4
release-blocker
v8.0.0
release-blocker/v9.0.0
run-all-playwright-tests
run-end-to-end-tests
test
manual
test
needed
test
needs-help
test
not-needed
test
present
untested
User research - time-tracker
valuable code
worth a release-note
User research - Accessibility
User research - Blocked
User research - Community
User research - Config (instance)
User research - Errors
User research - Filters
User research - Future backlog
User research - Git workflow
User research - Labels
User research - Moderation
User research - Needs input
User research - Notifications/Dashboard
User research - Rendering
User research - Repo creation
User research - Repo units
User research - Security
User research - Settings (in-app)
No milestone
No project
No assignees
7 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
forgejo/forgejo!10559
No description provided.