Craft your forge, Build your project, Grow your community freely
1<!--
2SPDX-FileCopyrightText: 2025 Romain Maneschi <romain@gitroot.dev>
3 4SPDX-License-Identifier: EUPL-1.2
5--> 6 7# Changelog
8 9This file is made for human readers. It contain important (not all) changes made for a release, as well as the release date. Each version contains a link to all closed issues into the current version and a link to the binary corresponding to the version.
10 11At any time, you can find the latest GitRoot binary for linux amd64 at [https://gitroot.dev/releases/gitroot-last](https://gitroot.dev/releases/gitroot-last).
12 13## unreleased
14 15### GitRoot
16 17- add sftp handle to read/write in project web directory. Only user with right to write in defqultBranch can write in webContent
18- callFunc can have a `configuration` for the plugin to call
19- when a plugin is called by another, gitroot call `init` of the plugin (with `InitKind=funccall`) before calling the func
20- add httClient to make httpRequest from plugin
21- introduce `schedule` a way to launch plugins on regular time
22- **BREAKING** `init` plugin function change signature from `func Init(repoName string, confHasChanged bool, serializedConf string)` to `func Init(repoName string, initKind model.InitKind, serializedConf string)` where InitKind can be `confHasChange`, `diff`, `schedule` or `funccall` 23- new plugin-sdk for [zig](https://ziglang.org/) in [libs/zig](./app/libs/zig/plugin/build.zig.zon)
24- users management:
25- rework group to be able to make a `contributors` group where users can share branches, but not commit to `main` 26- add `NbMaxBranchesPerProjectBeforeRejectingAnonymous` in forgeConfig.yml and `NbMaxBranchesBeforeRejectingAnonymous` in repoConfiguration.yml to avoid spam from anonymous users. By default it's 10, meaning that when your repo has 10 branches (who have added them doesn't matter), anonymous user can't push new branch. But know users (present in users.yml) can. Both values, in forgeConf and in repo must pass. If forgeConf is 2, even if repo is 100, max nb branch will be 2 (inverse is true too). To made it limitless put `-1`. And `0` means no anonymous is allowd to create branch.
27- **BREAKING** plugin-sdk are generated from sdkgenerator [#8fba](./issues/8fba-generate-plugin-sdk.md)
28- go: `CmdStats.TotalCPUTimeMs` become `CmdStats.TotalCpuTimeMs` 29- go: delete deprecated methods
30-`ModifyContent(filepath, content string)` use `Worktree().WriteContent(filepath, content string)` 31-`ModifyWebContent(filepath, content string)` use `Webcontent().WriteContent(filepath, content string)` 32-`ReplaceWebContent(filepath, oldContent, content string)` use `Webcontent().ReplaceContent(filepath, oldContent, content string)` 33-`ModifyCacheContent(filepath, content string)` use `Cache().WriteContent(filepath, content string)` 34- ts: all models are generated from go
35- ts: delete all `static build()` use `constructor` instead
36- rust: all models are generated from go, only imports impacted
37- repair `app/testsuite/demo.sh` with new purl plugin
38- **BREAKING** use [PURL](https://github.com/package-url/purl-spec) to define plugin [#4e8f](./issues/close/4e8f-purl-as-plugin-url.md) and [#5dd3](./issues/close/5dd3-plugin-scope.md)
39- in `.gitroot/plugins.yml` replace url, checksum, name and version with: `- purl: pkg:gitroot/gitroot/ladybug@0.4.0?registry=gitroot.dev%2Freleases%2F0.4.0&checksum=sha256:7409837469ce89d5c9fd8dd48236764650f48523ff4d81295967154977a01635` 40- in plugin-sdk callFunc to other plugin replace pluginName (e.g. `ladybug`) by `pkg:gitroot/gitroot/ladybug` (optional version)
41- will generate new plugin data directory from `gitrootData/data/plugins/ladybug` to `gitrootData/data/plugins/gitroot-ladybug` 42- will generate new plugin cache directory from `gitrootData/data/cache/repo1/ladybug` to `gitrootData/data/cache/repo1/gitroot-ladybug` 43- will generate new user from `ladybug@localhost` to `gitroot-ladybug@localhost` 44- rebase go-git [graft](./grafts/rebaseGoGit.md) and [graft2](./grafts/rebaseGoGit2.md)
45- clean force-push scenario (no more found acestor) [#4f8d](./issues/close/4f8d-found-ancestor-observer.md)
46- delete lof of todo about branches/checkout/HEAD
47- start use of sideband
48- configured the Hop plugin to run tests on gitroot.dev [#3a5e](./issues/close/3a5e-release-0.4.0.md) - [graft](./grafts/make_hop_working.md)
49- repaired existing tests (many were failing as they hadn't been run regularly)
50- the flaky [testsuite](./app/testsuite/runtest.sh) should now be more stable
51 52## 0.4.0 (22/04/2026) [is last](https://gitroot.dev/releases/gitroot-last)
53 54Commit: `0d57f5943dde9102f43ea08a2c047f824b5559d5` 55 56[gitroot-0.4.0-linux-amd64](https://gitroot.dev/releases/0.4.0/gitroot-0.4.0-linux-amd64) sha256 `4f0fb91ce26c61361f820d268974cf95a1d7baa1bcfc5f78b3a7b4f37d8b4fed` 57[gitroot-0.4.0-linux-arm64](https://gitroot.dev/releases/0.4.0/gitroot-0.4.0-linux-arm64) sha256 `9ee4abc4888d2578fa107958b10272e97210a3a7dc7e13addddee221e4e900d2` 58[gitroot-0.4.0-darwin-amd64](https://gitroot.dev/releases/0.4.0/gitroot-0.4.0-darwin-amd64) sha256 `a09a675aec206afcf6984740e695172a55080ca37b668d26b9454f6b358e6e5d` 59[gitroot-0.4.0-darwin-arm64](https://gitroot.dev/releases/0.4.0/gitroot-0.4.0-darwin-arm64) sha256 `86bc8393e55cff929ca20628841f379fc031378cf8399a9fde5a2e1a56cd2c4b` 60 61### GitRoot
62 63- run plugins in order of project not root
64- if a plugin has no file impacted, it will not run anymore
65- sync plugin inactive plugin in sub repositories
66- integrate `pollen` and `hop` plugin in [tests](./app/testsuite/runtest.sh)
67- **BREAKING** plugin sdk changes:
68- create [model.File](app/libs/golang/plugin/model/file.go)
69- from `AddFile(path string)` to `AddFile(file model.File)` 70- from `ModFile(fromPath string, toPath string)` to `ModFile(file model.File)` 71- from `DelFile(path string)` to `DelFile(file model.File)` 72- new plugin api:
73-`ExportFunc(name string, callback func(args map[string]string) (map[string]string, error))` permit to export a function, when another plugin will call it, the callback will be called with args. Only string are permitted. Can return multiple values but only strings like args.
74-`CanCallFunc(plugin string, name string, args map[string]string) bool` check if a plugin can call a function. If plugin is not installed/activated, has not the func or user has disable the call to it, you will get a false.
75-`CallFunc(plugin string, name string, args map[string]string) (map[string]string, error)` permit to call the function of another plugin. If the plugin don't exist or the plugin has not exported this function the rror will be `plugin or method not found`.
76-`CopyFile(fromFs model.FsBase, fromPath string, toFs model.FsBase, toPath string) error` copy a file from an fs to another
77-`DeleteFile(fromFs model.FsBase, filename string) error` delete a file
78-`MoveFile(fromFs model.FsBase, fromPath string, toFs model.FsBase, toPath string) error` move a file fron a fs to another
79-`ReplaceContent(fromFs model.FsBase, filepath string, oldContent string, content string) error ` replace content of a file
80-`WriteContent(fromFs model.FsBase, filepath string, content string) error` write to a file
81- deprecated plugin api:
82-`ModifyContent(filepath, content string)` use `Worktree().WriteContent(filepath, content string)` 83-`ModifyWebContent(filepath, content string)` use `Webcontent().WriteContent(filepath, content string)` 84-`ReplaceWebContent(filepath, oldContent, content string)` use `Webcontent().ReplaceContent(filepath, oldContent, content string)` 85-`ModifyCacheContent(filepath, content string)` use `Cache().WriteContent(filepath, content string)` 86- new executors features:
87- stats of sub cmd [#ea2f](./issues/close/v0.4.0/ea2f-executor-stats-v2.md)
88- ssh stats [#d9ee](./issues/close/v0.4.0/d9ee-ssh-executor-stats.md)
89- can have cache [#94af](./issues/94af-executor-cache.md)
90- can have artifacts [#9ea8](./issues/close/v0.4.0/9ea8-executor-artifacts.md)
91- set env var correctly
92- fix bug: materialize working tree of good branche
93- **BREAKING** Removed the requirement to sign commits and push using the same SSH key.
94- GitRoot no longer generates `.gitroot/init.sh` and `.gitroot/allowed_signers` files.
95- Users can now push unsigned commits or commits from other authors (enabling rebases with plugin commits).
96- The `stigma` plugin can be used to restore this functionality with the following behavior:
97- Generates `.gitroot/init.sh` and `.gitroot/allowed_signers` files.
98- Maintains the `.gitroot/allowed_signers` file with all valid keys.
99- Reports unsigned commits as warnings.
100- Reports invalidly signed commits as errors.
101- start to clean tests by adding libs and cmd in testsuite.
102- add [plugins](./plugins/) section
103104### Plugins
105106- stigma: assists in configuring, verifying, and reporting on commit signatures.
107- move changelog to [own directory](./app/plugins/stigma/index.md)
108- hop
109- 0.0.2 compatible with gitroot plugin-sdk 0.4.0
110- rework report layout
111- **BREAKING** add `pipelinesToWebDir` in conf to make artifacts and logs accessible in web, set empty to desable, `/pipelines` by default
112- move changelog to [own directory](./app/plugins/hop/index.md)
113- pollen
114- 0.0.3 compatible with gitroot plugin-sdk 0.4.0
115- move changelog to [own directory](./app/plugins/pollen/index.md)
116- ladybug:
117- 0.0.4 compatible with gitroot plugin-sdk 0.4.0
118- move changelog to [own directory](./app/plugins/ladybug/index.md)
119- silo:
120- 0.0.4 compatible with gitroot plugin-sdk 0.4.0
121- clean cache when conf has changed [#4f54](./issues/close/v0.4.0/4f54-change-global-conf.md)
122- move changelog to [own directory](./app/plugins/silo/index.md)
123- grafter:
124- 0.0.4 compatible with gitroot plugin-sdk 0.4.0
125- move changelog to [own directory](./app/plugins/grafter/index.md)
126- apex:
127- 0.0.4 compatible with gitroot plugin-sdk 0.4.0
128- render files in other branches than main [#de9a](./issues/close/v0.4.0/de9a-apex-branch-graft.md)
129- emit report when render a file from other branch
130- fix bug: rendering of local link [#bf18](./issues/close/v0.4.0/bf18-apex-local-link.md)
131- fix bug: impossible to put some metadata in apex [#71d7](./issues/close/v0.4.0/71d7-apex-metadata-not-possible.md)
132- **BREAKING** don't render markdown by default. Install `apex_markdown` plugin to do it. And `apex_code` to hilight code in markdown.
133- **BREAKING** install `apex_code` plugin to render worktree with hilight on dource files.
134- depends on `apex_markdown` and `apex_code` which are optional dependencies
135- add layouts to extend representation of data [#bbf1](./issues/close/v0.4.0/bbf1-apex-layout-materialization.md)
136- move changelog to [own directory](./app/plugins/apex/index.md)
137- apex_markdown: export func `renderMd` with args `fp` the filepath of the mardown and `md` the content. Return `html` the result and `metas` the metadata.
138- depends on `apex_code` to render code
139- depends on `apex_mermaid` to render mermaid charts
140- add rust, typescript and json icon
141- move changelog to [own directory](./app/plugins/apex/markdown/index.md)
142- apex_code: export func `renderCode` with args `code` the code to render and `lang` the language of the code. Return `html` the result.
143- move changelog to [own directory](./app/plugins/apex/code/index.md)
144- apex_mermaid: export func `renderCode` with args `code` the code mermaid to render. Return `html` (svg) the result.
145- move changelog to [own directory](./app/plugins/apex_mermaid/index.md)
146147## 0.3.0 (20/12/2025)
148149Commit: `11ec919c30bb10bb73560e624f772675d1f34c91`150151[gitroot-0.3.0-linux-amd64](https://gitroot.dev/releases/0.3.0/gitroot-0.3.0-linux-amd64) sha256 `9697a5a5b3ae2ecab339450908705bf53e393154d3d2c3ebed8b5f89cd0cee5e`152[gitroot-0.3.0-linux-arm64](https://gitroot.dev/releases/0.3.0/gitroot-0.3.0-linux-arm64) sha256 `e268cb95136f6f871d2090c1240c8d3952a58312fd4211b40646b553264ac32b`153[gitroot-0.3.0-darwin-amd64](https://gitroot.dev/releases/0.3.0/gitroot-0.3.0-darwin-amd64) sha256 `91eb4f5568acff907f99a51c38e14a443b65cae369c0451d033cc6b1a4bfa667`154[gitroot-0.3.0-darwin-arm64](https://gitroot.dev/releases/0.3.0/gitroot-0.3.0-darwin-arm64) sha256 `4b64f6807d01230ae6d2e4b89fa42c245ea9bf924a81d5eb5f929c6b12bfd5f7`155156### GitRoot
157158- Add [🗨 Contact](./contact.md) page
159- Use mise tasks thanks to Zon Orti the #3 contributor 🚀
160- add in the plugin sdk the `report()` api, to be able to report something to user. Don't use it to report bad behavior, `log()` and `logError()` are here for that.
161- add `reporter` interface to plugin sdk, to prevent GitRoot that a plugin can report something to user. See grafter as the first use case.
162- **BREAKING** add `execconf` in forgeConf, permit to enable one kind of executor and to set it's conf
163- **BREAKING** add `externalsshaddr` and `externalhttpaddr` property in forgeConf, permit to display `git clone ssh://gitroot.dev/` in web for example [#a716](./issues/close/a716-conf-external-addr.md)
164- implement the first `updater` wich handle the previous breaking
165- add [rust](https://rust-lang.org/) lib to build plugin
166- add `Exec([]commands)` method for plugin, need exec permission
167- allow to name `malloc` and `free` function in wasn guest `gitrootAlloc` and `gitrootFree`168- garbage memory of plugin between 2 calls
169- use [mise](https://mise.jdx.dev/) to simplify dev environment and update go, tinygo and node to latest version
170171### Plugins
172173- hop: execute process on host [hop-0.0.1.wasm](https://gitroot.dev/releases/0.3.0/hop-0.0.1.wasm) _sha256: b67e9418702648a493f40d4f5375b51a6ade2812382ddc43c4a1133d8c5c3b44_174- use the new report api
175- pollen: [pollen-0.0.2.wasm](https://gitroot.dev/releases/0.3.0/hop-0.0.2.wasm) _sha256: e6e94e93514d3fe1e65506f5ac72a01b84b792bc6c07009eadc194942fc63ca1_176- 0.0.2 compatible with gitroot plugin-sdk 0.3.0
177- ladybug: [ladybug-0.0.3.wasm](https://gitroot.dev/releases/0.3.0/ladybug-0.0.3.wasm) _sha256: adfaf88dc15ca5d53019ff194a32abec9c914c6cdf676ef4de589c1a4cfd12d4_178- 0.0.3 compatible with gitroot plugin-sdk 0.3.0
179- silo: [silo-0.0.3.wasm](https://gitroot.dev/releases/0.3.0/silo-0.0.3.wasm) _sha256: f38f8b71b68eddd1ce895a645e8c27052aab1f7607fc8182beb66b4e3e0fd2df_180- 0.0.3 compatible with gitroot plugin-sdk 0.3.0
181- grafter: [grafter-0.0.3.wasm](https://gitroot.dev/releases/0.3.0/grafter-0.0.3.wasm) _sha256: 9d63e0a232ea8dcdbd28ffc5793b56eada5981fc85296dfb8fd7342b3379d4e2_182- 0.0.3 compatible with gitroot plugin-sdk 0.3.0
183- implement reporter api to display hop reports
184- apex: [apex-0.0.3.wasm](https://gitroot.dev/releases/0.3.0/apex-0.0.3.wasm) _sha256: 3f7e22f834ce7e16231f6fa08495517c1ec021cb801b9b2885345a8deb16ebf0_185- 0.0.3 compatible with gitroot plugin-sdk 0.3.0
186- add favicon configuration [#8c3f](./issues/close/8c3f-apex-favicon.md)
187- add html metadata configuration
188- fix bug: 404 page not found is styled [#4c5b](./issues/close/v0.3.0/4c5b-web-path-slash.md)
189- fix bug: current menu is now hilighted and marked with `aria-current="page"` [#6eeb](./issues/close/v0.3.0/6eeb-apex-current-page.md)
190- **BREAKING** don't render metadata by default, file should have `apexRenderMetadatas: true` in metadata to allow it, not final solution but good enough for now
191192## 0.2.0 (18/09/2025)
193194Commit: `089d7caca0dfd7ac079aa92021b5f896e9f0fdb1`195196[gitroot-0.2.0-linux-amd64](https://gitroot.dev/releases/0.2.0/gitroot-0.2.0-linux-amd64) sha256 `91c37b86a36253dc9a25f89c772035ab8445fc7c2f8f330128cb12425cb9b2f6`197[gitroot-0.2.0-linux-arm64](https://gitroot.dev/releases/0.2.0/gitroot-0.2.0-linux-arm64) sha256 `d866ac45007f94d4d9967915efcff6181a32fe0791e50845620c6152f8dc1651`198[gitroot-0.2.0-darwin-amd64](https://gitroot.dev/releases/0.2.0/gitroot-0.2.0-darwin-amd64) sha256 `a8784f3b82c7814e36066c5dda7e540920378159654658dc7777c4fe73d1b59d`199[gitroot-0.2.0-darwin-arm64](https://gitroot.dev/releases/0.2.0/gitroot-0.2.0-darwin-arm64) sha256 `70f23407a13b8dd20852382906c05dc2aa268f74cbef31358cec861cba89f04c`200201### GitRoot
202203- add [assemblyscript](https://www.assemblyscript.org/) lib to build plugin
204- add `ReplaceWebContentBuilder(filename, old, new)` method for plugin, need mod permission
205- after a merge delete branch and clean users.yml
206- cross compilation [#70d0](./issues/close/70d0-cross-compile.md)
207- add `Commits(from string, to string) ([]Commit, error)` method for plugin to access commits between 2 hash
208- check that the plugin is compatible with current version
209- update plugins: change URL in `plugins.yml` of root repository
210- download plugins from http(s) and checksum them
211- compile plugins AOT and keep compilation
212- garbage collect plugins after execution [#f1ab](./issues/close/v0.2.0/f1ab-garbabe-collecte-plugins.md)
213- fix empty FS after execution [#95b0](./issues/close/v0.2.0/95b0-plugins-fs-bug.md)
214215### Plugins
216217- pollen: rss generator [pollen-0.0.1.wasm](https://gitroot.dev/releases/0.2.0/pollen-0.0.1.wasm) _sha256: 49cd8e1846b1612a0d5686918b502fe29e070e7bf9613c1ba9a1dfe5417d0f2a_218- ladybug: [ladybug-0.0.2.wasm](https://gitroot.dev/releases/0.2.0/ladybug-0.0.2.wasm) _sha256: 0c755bb2dc5cc037216b29ba1709875afee425ee429b6be97f0d5e137067acff_219- 0.0.2 compatible with gitroot
220- fix bug: do not delete `---` in body of files
221- silo: [silo-0.0.2.wasm](https://gitroot.dev/releases/0.2.0/silo-0.0.2.wasm) _sha256: 66fe44b4e0984154bda0867a9b35ea39b0be3d92a89e4e542b70472fadf2f78e_222- 0.0.2 compatible with gitroot
223- create an empty board when nothing to display [#a7ca](./issues/close/v0.2.0/a7ca-silo-empty-board.md)
224- fix bug: move of file delete old item [#7a80](./issues/close/v0.2.0/7a80-silo-move-bug.md)
225- grafter: [grafter-0.0.2.wasm](https://gitroot.dev/releases/0.2.0/grafter-0.0.2.wasm) _sha256: 9ce5e36af1fd53a6547ec51d55356a661a05ae617b16ef97b1eae0dd0cce22c0_226- 0.0.2 compatible with gitroot
227- better diff
228- **BREAKING** change state of graft in metadata
229- apex: [apex-0.0.2.wasm](https://gitroot.dev/releases/0.2.0/apex-0.0.2.wasm) _sha256: 4c7d1b84f768a6aea11393ea2bc116a7be30fd12380fd7e11f283d5970028119_230- 0.0.2 compatible with gitroot
231- add line heading
232- generate branches page and one page by branch with commits
233234## 0.1.0 (20/05/2025)
235236Initial GitRoot version 🎉
237238Commit: `fa6d1600606efdc590eb2f0411305e971fdd854d`239240[gitroot-0.1.0-linux-amd64](https://gitroot.dev/releases/0.1.0/gitroot-0.1.0-linux-amd64) sha256 `e70d24e2631708ae4b778f9f60de03fad5087dd1fb2845955a9ed5c758a5ca0a`241[gitroot-0.1.0-darwin-amd64](https://gitroot.dev/releases/0.1.0/gitroot-0.1.0-darwin-amd64) sha256 `622abd155657f2b3674b9fab71de2438774005054deb30301787d3a1ff37ff1a`242[gitroot-0.1.0-darwin-arm64](https://gitroot.dev/releases/0.1.0/gitroot-0.1.0-darwin-arm64) sha256 `7946ad03f109c7d9cdb93fc6ec1b0838b10dde3c7bf67d4254374f5f9b9b19a5`243244### GitRoot
245246- launch GitRoot by specifying where to store data (all data will be written in this path)
247- accept git commands through ssh (clone, pull and pull)
248- manage users (who can write in which repositories)
249- install and activate plugins
250- repositories can be viewed online
251252### Plugins
253254- ladybug: add properties to md files [ladybug-0.0.1.wasm](https://gitroot.dev/releases/0.1.0/ladybug-0.0.1.wasm) _sha256: af00a9f14a27399f383d0cc23415e14e7d6180c167d1504018f11166346ebb55_255- silo: regroup, filter, sort files in a new md file in git [silo-0.0.1.wasm](https://gitroot.dev/releases/0.1.0/silo-0.0.1.wasm) _sha256: 99bc06d9d6f020c5df216fd6134306079aec26eacee9ad9bbabbc259097e618a_256- grafter: manage, review and merge of branches in git [grafter-0.0.1.wasm](https://gitroot.dev/releases/0.1.0/grafter-0.0.1.wasm) _sha256: 6645615df36a9938adac300d8d46fe298f8f53fb2e69713a495b83b0f114f40a_257- apex: transform md file to html one and write them in web, optionally generate worktree [apex-0.0.1.wasm](https://gitroot.dev/releases/0.1.0/apex-0.0.1.wasm) _sha256: 9570f005ad70be04eab3c900acd11d5c2ccf48fef5d4c17536c9cf79c8fd333e_