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 a flag to enable sftp [#f74b](./issues/close/f74b-sftp-flag-enable.md)
18- simplify release with a script [#dba0](./issues/close/dba0-simplify-release.md)
19- fix bug: updating plugin conf run a worktree but then commit was not dispatched to other plugins
20- fix bug: when a plugin was added multiple times in plugins.yml, only first was loaded
21- fix bug: repositories already created had bad extensions and objectformat in `.git/config` 22- fix bug: don't try to use plugin without purl
23- after sendReport, plugins can render in web/cache for commits generated during sendReport
24- group report [#601a](./issues/close/601a-group-reports.md) by using newly pull-iterator
25- better plugins fs management, a plugin mounted without fs couldn't access files until close
26- fill users.yml with first commit name/email when a new user push a new branch, like that stigma plugin can find the user [#91a1](./issues/close/91a1-bad-signed-new-branch.md)
27- add sftp handle to read/write in project web directory. Only user with right to write in defaultBranch can write in webContent
28- callFunc can have a `configuration` for the plugin to call
29- when a plugin is called by another, gitroot call `init` of the plugin (with `InitKind=funccall`) before calling the func
30- add httClient to make httpRequest from plugin
31- introduce `schedule` a way to launch plugins on regular time
32- **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` 33- new plugin-sdk for [zig](https://ziglang.org/) in [libs/zig](./app/libs/zig/plugin/build.zig.zon)
34- users management:
35- rework group to be able to make a `contributors` group where users can share branches, but not commit to `main` 36- 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.
37- **BREAKING** plugin-sdk are generated from sdkgenerator [#8fba](./issues/8fba-generate-plugin-sdk.md)
38- go: `CmdStats.TotalCPUTimeMs` become `CmdStats.TotalCpuTimeMs` 39- go: delete deprecated methods
40-`ModifyContent(filepath, content string)` use `Worktree().WriteContent(filepath, content string)` 41-`ModifyWebContent(filepath, content string)` use `Webcontent().WriteContent(filepath, content string)` 42-`ReplaceWebContent(filepath, oldContent, content string)` use `Webcontent().ReplaceContent(filepath, oldContent, content string)` 43-`ModifyCacheContent(filepath, content string)` use `Cache().WriteContent(filepath, content string)` 44- ts: all models are generated from go
45- ts: delete all `static build()` use `constructor` instead
46- rust: all models are generated from go, only imports impacted
47- repair `app/testsuite/demo.sh` with new purl plugin
48- **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)
49- 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` 50- in plugin-sdk callFunc to other plugin replace pluginName (e.g. `ladybug`) by `pkg:gitroot/gitroot/ladybug` (optional version)
51- will generate new plugin data directory from `gitrootData/data/plugins/ladybug` to `gitrootData/data/plugins/gitroot-ladybug` 52- will generate new plugin cache directory from `gitrootData/data/cache/repo1/ladybug` to `gitrootData/data/cache/repo1/gitroot-ladybug` 53- will generate new user from `ladybug@localhost` to `gitroot-ladybug@localhost` 54- rebase go-git [graft](./grafts/rebaseGoGit.md) and [graft2](./grafts/rebaseGoGit2.md)
55- clean force-push scenario (no more found acestor) [#4f8d](./issues/close/4f8d-found-ancestor-observer.md)
56- delete lof of todo about branches/checkout/HEAD
57- start use of sideband
58- 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)
59- repaired existing tests (many were failing as they hadn't been run regularly)
60- the flaky [testsuite](./app/testsuite/runtest.sh) should now be more stable
61 62## 0.4.0 (22/04/2026) [is last](https://gitroot.dev/releases/gitroot-last)
63 64Commit: `0d57f5943dde9102f43ea08a2c047f824b5559d5` 65 66[gitroot-0.4.0-linux-amd64](https://gitroot.dev/releases/0.4.0/gitroot-0.4.0-linux-amd64) sha256 `4f0fb91ce26c61361f820d268974cf95a1d7baa1bcfc5f78b3a7b4f37d8b4fed` 67[gitroot-0.4.0-linux-arm64](https://gitroot.dev/releases/0.4.0/gitroot-0.4.0-linux-arm64) sha256 `9ee4abc4888d2578fa107958b10272e97210a3a7dc7e13addddee221e4e900d2` 68[gitroot-0.4.0-darwin-amd64](https://gitroot.dev/releases/0.4.0/gitroot-0.4.0-darwin-amd64) sha256 `a09a675aec206afcf6984740e695172a55080ca37b668d26b9454f6b358e6e5d` 69[gitroot-0.4.0-darwin-arm64](https://gitroot.dev/releases/0.4.0/gitroot-0.4.0-darwin-arm64) sha256 `86bc8393e55cff929ca20628841f379fc031378cf8399a9fde5a2e1a56cd2c4b` 70 71### GitRoot
72 73- run plugins in order of project not root
74- if a plugin has no file impacted, it will not run anymore
75- sync plugin inactive plugin in sub repositories
76- integrate `pollen` and `hop` plugin in [tests](./app/testsuite/runtest.sh)
77- **BREAKING** plugin sdk changes:
78- create [model.File](app/libs/golang/plugin/model/file.go)
79- from `AddFile(path string)` to `AddFile(file model.File)` 80- from `ModFile(fromPath string, toPath string)` to `ModFile(file model.File)` 81- from `DelFile(path string)` to `DelFile(file model.File)` 82- new plugin api:
83-`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.
84-`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.
85-`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`.
86-`CopyFile(fromFs model.FsBase, fromPath string, toFs model.FsBase, toPath string) error` copy a file from an fs to another
87-`DeleteFile(fromFs model.FsBase, filename string) error` delete a file
88-`MoveFile(fromFs model.FsBase, fromPath string, toFs model.FsBase, toPath string) error` move a file fron a fs to another
89-`ReplaceContent(fromFs model.FsBase, filepath string, oldContent string, content string) error ` replace content of a file
90-`WriteContent(fromFs model.FsBase, filepath string, content string) error` write to a file
91- deprecated plugin api:
92-`ModifyContent(filepath, content string)` use `Worktree().WriteContent(filepath, content string)` 93-`ModifyWebContent(filepath, content string)` use `Webcontent().WriteContent(filepath, content string)` 94-`ReplaceWebContent(filepath, oldContent, content string)` use `Webcontent().ReplaceContent(filepath, oldContent, content string)` 95-`ModifyCacheContent(filepath, content string)` use `Cache().WriteContent(filepath, content string)` 96- new executors features:
97- stats of sub cmd [#ea2f](./issues/close/v0.4.0/ea2f-executor-stats-v2.md)
98- ssh stats [#d9ee](./issues/close/v0.4.0/d9ee-ssh-executor-stats.md)
99- can have cache [#94af](./issues/94af-executor-cache.md)
100- can have artifacts [#9ea8](./issues/close/v0.4.0/9ea8-executor-artifacts.md)
101- set env var correctly
102- fix bug: materialize working tree of good branche
103- **BREAKING** Removed the requirement to sign commits and push using the same SSH key.
104- GitRoot no longer generates `.gitroot/init.sh` and `.gitroot/allowed_signers` files.
105- Users can now push unsigned commits or commits from other authors (enabling rebases with plugin commits).
106- The `stigma` plugin can be used to restore this functionality with the following behavior:
107- Generates `.gitroot/init.sh` and `.gitroot/allowed_signers` files.
108- Maintains the `.gitroot/allowed_signers` file with all valid keys.
109- Reports unsigned commits as warnings.
110- Reports invalidly signed commits as errors.
111- start to clean tests by adding libs and cmd in testsuite.
112- add [plugins](./plugins/) section
113114### Plugins
115116- stigma: assists in configuring, verifying, and reporting on commit signatures.
117- move changelog to [own directory](./app/plugins/stigma/index.md)
118- hop
119- 0.0.2 compatible with gitroot plugin-sdk 0.4.0
120- rework report layout
121- **BREAKING** add `pipelinesToWebDir` in conf to make artifacts and logs accessible in web, set empty to desable, `/pipelines` by default
122- move changelog to [own directory](./app/plugins/hop/index.md)
123- pollen
124- 0.0.3 compatible with gitroot plugin-sdk 0.4.0
125- move changelog to [own directory](./app/plugins/pollen/index.md)
126- ladybug:
127- 0.0.4 compatible with gitroot plugin-sdk 0.4.0
128- move changelog to [own directory](./app/plugins/ladybug/index.md)
129- silo:
130- 0.0.4 compatible with gitroot plugin-sdk 0.4.0
131- clean cache when conf has changed [#4f54](./issues/close/v0.4.0/4f54-change-global-conf.md)
132- move changelog to [own directory](./app/plugins/silo/index.md)
133- grafter:
134- 0.0.4 compatible with gitroot plugin-sdk 0.4.0
135- move changelog to [own directory](./app/plugins/grafter/index.md)
136- apex:
137- 0.0.4 compatible with gitroot plugin-sdk 0.4.0
138- render files in other branches than main [#de9a](./issues/close/v0.4.0/de9a-apex-branch-graft.md)
139- emit report when render a file from other branch
140- fix bug: rendering of local link [#bf18](./issues/close/v0.4.0/bf18-apex-local-link.md)
141- fix bug: impossible to put some metadata in apex [#71d7](./issues/close/v0.4.0/71d7-apex-metadata-not-possible.md)
142- **BREAKING** don't render markdown by default. Install `apex_markdown` plugin to do it. And `apex_code` to hilight code in markdown.
143- **BREAKING** install `apex_code` plugin to render worktree with hilight on dource files.
144- depends on `apex_markdown` and `apex_code` which are optional dependencies
145- add layouts to extend representation of data [#bbf1](./issues/close/v0.4.0/bbf1-apex-layout-materialization.md)
146- move changelog to [own directory](./app/plugins/apex/index.md)
147- 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.
148- depends on `apex_code` to render code
149- depends on `apex_mermaid` to render mermaid charts
150- add rust, typescript and json icon
151- move changelog to [own directory](./app/plugins/apex/markdown/index.md)
152- apex_code: export func `renderCode` with args `code` the code to render and `lang` the language of the code. Return `html` the result.
153- move changelog to [own directory](./app/plugins/apex/code/index.md)
154- apex_mermaid: export func `renderCode` with args `code` the code mermaid to render. Return `html` (svg) the result.
155- move changelog to [own directory](./app/plugins/apex_mermaid/index.md)
156157## 0.3.0 (20/12/2025)
158159Commit: `11ec919c30bb10bb73560e624f772675d1f34c91`160161[gitroot-0.3.0-linux-amd64](https://gitroot.dev/releases/0.3.0/gitroot-0.3.0-linux-amd64) sha256 `9697a5a5b3ae2ecab339450908705bf53e393154d3d2c3ebed8b5f89cd0cee5e`162[gitroot-0.3.0-linux-arm64](https://gitroot.dev/releases/0.3.0/gitroot-0.3.0-linux-arm64) sha256 `e268cb95136f6f871d2090c1240c8d3952a58312fd4211b40646b553264ac32b`163[gitroot-0.3.0-darwin-amd64](https://gitroot.dev/releases/0.3.0/gitroot-0.3.0-darwin-amd64) sha256 `91eb4f5568acff907f99a51c38e14a443b65cae369c0451d033cc6b1a4bfa667`164[gitroot-0.3.0-darwin-arm64](https://gitroot.dev/releases/0.3.0/gitroot-0.3.0-darwin-arm64) sha256 `4b64f6807d01230ae6d2e4b89fa42c245ea9bf924a81d5eb5f929c6b12bfd5f7`165166### GitRoot
167168- Add [🗨 Contact](./contact.md) page
169- Use mise tasks thanks to Zon Orti the #3 contributor 🚀
170- 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.
171- add `reporter` interface to plugin sdk, to prevent GitRoot that a plugin can report something to user. See grafter as the first use case.
172- **BREAKING** add `execconf` in forgeConf, permit to enable one kind of executor and to set it's conf
173- **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)
174- implement the first `updater` wich handle the previous breaking
175- add [rust](https://rust-lang.org/) lib to build plugin
176- add `Exec([]commands)` method for plugin, need exec permission
177- allow to name `malloc` and `free` function in wasn guest `gitrootAlloc` and `gitrootFree`178- garbage memory of plugin between 2 calls
179- use [mise](https://mise.jdx.dev/) to simplify dev environment and update go, tinygo and node to latest version
180181### Plugins
182183- hop: execute process on host [hop-0.0.1.wasm](https://gitroot.dev/releases/0.3.0/hop-0.0.1.wasm) _sha256: b67e9418702648a493f40d4f5375b51a6ade2812382ddc43c4a1133d8c5c3b44_184- use the new report api
185- pollen: [pollen-0.0.2.wasm](https://gitroot.dev/releases/0.3.0/hop-0.0.2.wasm) _sha256: e6e94e93514d3fe1e65506f5ac72a01b84b792bc6c07009eadc194942fc63ca1_186- 0.0.2 compatible with gitroot plugin-sdk 0.3.0
187- ladybug: [ladybug-0.0.3.wasm](https://gitroot.dev/releases/0.3.0/ladybug-0.0.3.wasm) _sha256: adfaf88dc15ca5d53019ff194a32abec9c914c6cdf676ef4de589c1a4cfd12d4_188- 0.0.3 compatible with gitroot plugin-sdk 0.3.0
189- silo: [silo-0.0.3.wasm](https://gitroot.dev/releases/0.3.0/silo-0.0.3.wasm) _sha256: f38f8b71b68eddd1ce895a645e8c27052aab1f7607fc8182beb66b4e3e0fd2df_190- 0.0.3 compatible with gitroot plugin-sdk 0.3.0
191- grafter: [grafter-0.0.3.wasm](https://gitroot.dev/releases/0.3.0/grafter-0.0.3.wasm) _sha256: 9d63e0a232ea8dcdbd28ffc5793b56eada5981fc85296dfb8fd7342b3379d4e2_192- 0.0.3 compatible with gitroot plugin-sdk 0.3.0
193- implement reporter api to display hop reports
194- apex: [apex-0.0.3.wasm](https://gitroot.dev/releases/0.3.0/apex-0.0.3.wasm) _sha256: 3f7e22f834ce7e16231f6fa08495517c1ec021cb801b9b2885345a8deb16ebf0_195- 0.0.3 compatible with gitroot plugin-sdk 0.3.0
196- add favicon configuration [#8c3f](./issues/close/8c3f-apex-favicon.md)
197- add html metadata configuration
198- fix bug: 404 page not found is styled [#4c5b](./issues/close/v0.3.0/4c5b-web-path-slash.md)
199- fix bug: current menu is now hilighted and marked with `aria-current="page"` [#6eeb](./issues/close/v0.3.0/6eeb-apex-current-page.md)
200- **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
201202## 0.2.0 (18/09/2025)
203204Commit: `089d7caca0dfd7ac079aa92021b5f896e9f0fdb1`205206[gitroot-0.2.0-linux-amd64](https://gitroot.dev/releases/0.2.0/gitroot-0.2.0-linux-amd64) sha256 `91c37b86a36253dc9a25f89c772035ab8445fc7c2f8f330128cb12425cb9b2f6`207[gitroot-0.2.0-linux-arm64](https://gitroot.dev/releases/0.2.0/gitroot-0.2.0-linux-arm64) sha256 `d866ac45007f94d4d9967915efcff6181a32fe0791e50845620c6152f8dc1651`208[gitroot-0.2.0-darwin-amd64](https://gitroot.dev/releases/0.2.0/gitroot-0.2.0-darwin-amd64) sha256 `a8784f3b82c7814e36066c5dda7e540920378159654658dc7777c4fe73d1b59d`209[gitroot-0.2.0-darwin-arm64](https://gitroot.dev/releases/0.2.0/gitroot-0.2.0-darwin-arm64) sha256 `70f23407a13b8dd20852382906c05dc2aa268f74cbef31358cec861cba89f04c`210211### GitRoot
212213- add [assemblyscript](https://www.assemblyscript.org/) lib to build plugin
214- add `ReplaceWebContentBuilder(filename, old, new)` method for plugin, need mod permission
215- after a merge delete branch and clean users.yml
216- cross compilation [#70d0](./issues/close/70d0-cross-compile.md)
217- add `Commits(from string, to string) ([]Commit, error)` method for plugin to access commits between 2 hash
218- check that the plugin is compatible with current version
219- update plugins: change URL in `plugins.yml` of root repository
220- download plugins from http(s) and checksum them
221- compile plugins AOT and keep compilation
222- garbage collect plugins after execution [#f1ab](./issues/close/v0.2.0/f1ab-garbabe-collecte-plugins.md)
223- fix empty FS after execution [#95b0](./issues/close/v0.2.0/95b0-plugins-fs-bug.md)
224225### Plugins
226227- pollen: rss generator [pollen-0.0.1.wasm](https://gitroot.dev/releases/0.2.0/pollen-0.0.1.wasm) _sha256: 49cd8e1846b1612a0d5686918b502fe29e070e7bf9613c1ba9a1dfe5417d0f2a_228- ladybug: [ladybug-0.0.2.wasm](https://gitroot.dev/releases/0.2.0/ladybug-0.0.2.wasm) _sha256: 0c755bb2dc5cc037216b29ba1709875afee425ee429b6be97f0d5e137067acff_229- 0.0.2 compatible with gitroot
230- fix bug: do not delete `---` in body of files
231- silo: [silo-0.0.2.wasm](https://gitroot.dev/releases/0.2.0/silo-0.0.2.wasm) _sha256: 66fe44b4e0984154bda0867a9b35ea39b0be3d92a89e4e542b70472fadf2f78e_232- 0.0.2 compatible with gitroot
233- create an empty board when nothing to display [#a7ca](./issues/close/v0.2.0/a7ca-silo-empty-board.md)
234- fix bug: move of file delete old item [#7a80](./issues/close/v0.2.0/7a80-silo-move-bug.md)
235- grafter: [grafter-0.0.2.wasm](https://gitroot.dev/releases/0.2.0/grafter-0.0.2.wasm) _sha256: 9ce5e36af1fd53a6547ec51d55356a661a05ae617b16ef97b1eae0dd0cce22c0_236- 0.0.2 compatible with gitroot
237- better diff
238- **BREAKING** change state of graft in metadata
239- apex: [apex-0.0.2.wasm](https://gitroot.dev/releases/0.2.0/apex-0.0.2.wasm) _sha256: 4c7d1b84f768a6aea11393ea2bc116a7be30fd12380fd7e11f283d5970028119_240- 0.0.2 compatible with gitroot
241- add line heading
242- generate branches page and one page by branch with commits
243244## 0.1.0 (20/05/2025)
245246Initial GitRoot version 🎉
247248Commit: `fa6d1600606efdc590eb2f0411305e971fdd854d`249250[gitroot-0.1.0-linux-amd64](https://gitroot.dev/releases/0.1.0/gitroot-0.1.0-linux-amd64) sha256 `e70d24e2631708ae4b778f9f60de03fad5087dd1fb2845955a9ed5c758a5ca0a`251[gitroot-0.1.0-darwin-amd64](https://gitroot.dev/releases/0.1.0/gitroot-0.1.0-darwin-amd64) sha256 `622abd155657f2b3674b9fab71de2438774005054deb30301787d3a1ff37ff1a`252[gitroot-0.1.0-darwin-arm64](https://gitroot.dev/releases/0.1.0/gitroot-0.1.0-darwin-arm64) sha256 `7946ad03f109c7d9cdb93fc6ec1b0838b10dde3c7bf67d4254374f5f9b9b19a5`253254### GitRoot
255256- launch GitRoot by specifying where to store data (all data will be written in this path)
257- accept git commands through ssh (clone, pull and pull)
258- manage users (who can write in which repositories)
259- install and activate plugins
260- repositories can be viewed online
261262### Plugins
263264- 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_265- 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_266- 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_267- 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_