GitRoot

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
103
104### Plugins
105
106- 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)
146
147## 0.3.0 (20/12/2025)
148
149Commit: `11ec919c30bb10bb73560e624f772675d1f34c91`
150
151[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`
155
156### GitRoot
157
158- 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
170
171### Plugins
172
173- 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
191
192## 0.2.0 (18/09/2025)
193
194Commit: `089d7caca0dfd7ac079aa92021b5f896e9f0fdb1`
195
196[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`
200
201### GitRoot
202
203- 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)
214
215### Plugins
216
217- 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
233
234## 0.1.0 (20/05/2025)
235
236Initial GitRoot version 🎉
237
238Commit: `fa6d1600606efdc590eb2f0411305e971fdd854d`
239
240[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`
243
244### GitRoot
245
246- 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
251
252### Plugins
253
254- 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_