Releases
18 releases keptcantara/source-code-portalGitHubgithub-actions[bot] (automation)
Changelog
Release notes
Changelog
- 74b9a080fc92920e2e557cf7cbb2437694762558: feat(web): optional Plausible Analytics, first party (AN1) (#83) (@oranheim)
cantara/source-code-portalGitHubgithub-actions[bot] (automation)
Changelog
Release notes
Changelog
- 3d028599f336be55c71d65142640bfb0ba7dd942: fix(snapshot): hide groups that hold no repository the viewer can see (P-112) (#81) (@oranheim)
cantara/source-code-portalGitHubgithub-actions[bot] (automation)
Changelog
Release notes
Changelog
- fa8b0603724c0636c854a06edbbdc926fed3f195: feat(catalog): a retired repository leaves its product for the Archive (#79) (@oranheim)
cantara/source-code-portalGitHubgithub-actions[bot] (automation)
Changelog
Release notes
Changelog
- 194610e972312e5c4090fd2782479a97ad1072e3: feat(enterprise): GitHub Enterprise and Entra ID, and the enterprise mode with each person's own access (EN1 to EN8) (#77) (@oranheim)
cantara/source-code-portalGitHubgithub-actions[bot] (automation)
Changelog
Release notes
Changelog
- 197e048ae1280571e01717a49032e1dbba50c5c3: feat(web): a theme for a deployment: colour tokens, logo, favicon and name from files (TH1) (#73) (@oranheim)
cantara/source-code-portalGitHubgithub-actions[bot] (automation)
Changelog
Release notes
Changelog
- f9be1802cb54adadf25b5fdd2e07e90b55c51834: feat(dev): repeatable upgrade and rollback rehearsal; one way of working for everyone (#59) (@oranheim)
- a53108169ded98407a3acf1e04e5750981470bc8: feat(forks): forks on demand (FK1 to FK3) (#68) (@oranheim)
- 6d2cdf34100ca268e99fa1e681c31d6c3c69c567: feat(personal): an Events step makes a GitHub App per account (EV3) (#57) (@oranheim)
- b520d9e61b738b614a691f91c1cb4d63db85f74a: feat(personal): first run in the browser, repositories sorted into products (PE3) (#51) (@oranheim)
- ceac52307ad459f4ba47ba0b8a95120ec6080707: feat(personal): products by drag and drop with calculated rules, progress for long work (PE4) (#54) (@oranheim)
- 97c5506496f8ac399e2630eec810919de3701ab9: feat(personal): scp personal, the personal edition's wizard, vault and loopback portal (PE1) (#49) (@oranheim)
- 64e472f0425b9a5c4c3d1f9654ffd1aeee74eac2: feat(personal): sign in with the GitHub CLI's login on the first-run page (#52) (@oranheim)
- b0f2b8d79c75b28b04d675829112330c989ba591: feat(personal): what is yours on the pull request and issue lists (PE2) (#50) (@oranheim)
- 1f83167fbba121e6132e7046ad1add0115806dac: feat(releases): release notes on the releases page and the repository and product panels (#47) (@oranheim)
- dfa0f0b4b91ab0a8a990f0e9dc915598fe8e0a1b: feat(security): the hardened profile's last gaps (H2): audit counter, opt-in verified email, route coverage (#65) (@oranheim)
- df6e0ee8549be8ec9091b2c31b9e2ae91ee803d5: feat(store): layouts and announcements live in SQLite; a killed instance comes back whole (SQ1) (#62) (@oranheim)
- 1d5a2dfd187a9dc26ec276cfcab590cfad934ee3: feat(store): migration 0002 with a copy first, repository visibility, one owner for an address (SM-a) (#48) (@oranheim)
- 8c0b30b2f4269871e6554043752c4c090f961e36: feat(store): one baseline schema marked SCP1; earlier generations are moved aside (SC1) (#69) (@oranheim)
- ef4ca768488d623e7ffaf212cf10b9f2d5091e7b: feat(sync): a mode per source and a cadence per subject (EV2) (#56) (@oranheim)
- 20d309c464ce58deb3abf54953711206790bd906: feat(sync): a push to another branch and deleted refs reach the history and the tags; releases of an unlogged source read every 30 minutes (EV5, issue 5) (#67) (@oranheim)
- 915b77fc677dfedf1ee08e65eca4abf0f483e0d1: feat(sync): the delivery log is read to its end or said to be cut; the status shows each log (EV4, issue 5) (#66) (@oranheim)
- ee21619a34df14b88077c9e19ee1d413eec2300a: feat(webhook): read the App's delivery log without a receiver (webhook.catch_up) (EV1) (#55) (@oranheim)
- 8cbde75587fdbbc6c7bc6d89028053e8e49c13af: fix(security): shared site isolation tests, neutrality guard, and the review's three low findings (#63) (@oranheim)
- 4f56d8347e805467d6024f144b9720dbbe7f585b: fix(setup): one entry per repository name, unique product names, clearer count (#53) (@oranheim)
- 4bc1df308f9d92010f62c656dcd3a07d08f680f1: fix: the review's findings since v2.2.9 (store mode, credential delete, releases, tags, stream, host) (#70) (@oranheim)
- 8a80277d351ff7096b22998849646331860f2c0f: refactor(ghlogin): GitHub's calls through the libraries (GL1); feat(security): the modes are kept apart (ML1) (#64) (@oranheim)
cantara/source-code-portalGitHubgithub-actions[bot] (automation)
Changelog
Release notes
Changelog
- a7482daee0fc52f78334f065ece3ada36b20d581: feat(web): filter panel, one row layout, packages in releases (#45) (@oranheim)
cantara/source-code-portalGitHubgithub-actions[bot] (automation)
Changelog
Release notes
Changelog
- 5e6712df1d5a725781974eaaab0e7c8f9637b70b: feat(insights): graphs; rename Alumni to Archive (#44) (@oranheim)
cantara/source-code-portalGitHubgithub-actions[bot] (automation)
Changelog
Release notes
Changelog
- 7855ff0d2ec0ad12f39b57d40bb3b31d152ea707: Merge pull request #36 from Cantara/feat/releases-insights-alumni (@oranheim)
- c03e60c56a87aa8c3ecc7f07372336a8a672145b: feat(alumni): list the retired repositories through GET /api/v1/alumni (@oranheim)
- 0d2f14a4ac0d1d5cf79cfcdb9796eff4fe600aae: feat(alumni): the /alumni page, its sitemap entry, docs and tests (@oranheim)
- a62f812da858c0dc5a155083beacfc215beebb1a: feat(insights): five insights derived from the snapshot (IN1, IN2); faster leak and twin tests (#40) (@oranheim)
- a247dbfdac1216aa54b4a7171307fe947a15225f: feat(releases): panels on a repository's and a group's page; the group's retired link (RL3, AL2) (#39) (@oranheim)
- 803ec330ac9ee3d8dcd3e5fa55a789b5d45b0da9: feat(releases): the recent releases of the fleet (RL1, RL2) (#37) (@oranheim)
- 82b5512c2a5402d4a04dea8f9278e3b1e340c5f7: feat: releases and retired repositories for agents, search and llms (RL3, AL2) (#38) (@oranheim)
- 418d868c82d7c96dc846e9a8654a73b70874a8f0: fix(insights): name each month and write the count over its bar; narrower tables (#42) (@oranheim)
cantara/source-code-portalGitHubgithub-actions[bot] (automation)
Changelog
Release notes
Changelog
- e7f3ea592650ed5cb892685b85c2f487e8315bf0: Merge pull request #34 from Cantara/chore/deps-round-3 (@oranheim)
- 4413827da08c1df5b586545d9a82a96a94c6b671: Merge pull request #35 from Cantara/chore/release-2.2.6 (@oranheim)
cantara/source-code-portalGitHubgithub-actions[bot] (automation)
Changelog
Release notes
Changelog
- a0eaeaeba128d56c0fc101caa38858cdf881ea93: Merge pull request #18 from Cantara/refactor/review-1 (@oranheim)
- 63e3f802db5824d88c08c8991786a61bee4a9f7d: Merge pull request #19 from Cantara/refactor/review-2 (@oranheim)
- 53249e0d7e968635029a3dbc5f486ba05a6c5985: Merge pull request #20 from Cantara/refactor/review-3 (@oranheim)
- be15b4a32267f613a7445e7b117b044f0a8bfa01: Merge pull request #21 from Cantara/review/go-core (@oranheim)
- 2d1ba8c1995e81e68c2f6d4fbcf63603ca933437: Merge pull request #22 from Cantara/review/go-features (@oranheim)
- a4280ec75ee84fb64949116ae0b7f0989020ba3b: Merge pull request #23 from Cantara/review/web-shared (@oranheim)
- a9c566f849c593d1618ec698f885689009166f4d: Merge pull request #24 from Cantara/review/web-features (@oranheim)
- e08203fd0e73fdbe11b16adc06aa3e5ccb060ada: Merge pull request #25 from Cantara/review/majors (@oranheim)
- b5b99291cd667a454d0c7605653fbf561374db0f: Merge pull request #27 from Cantara/review/regressions (@oranheim)
- ab05b95fab655c55fe80a0c1fa408f20001ec43f: Merge pull request #28 from Cantara/fix/event-confirm (@oranheim)
- 4cb02bc832504ce3902ff0757edb27d0c6416f18: Merge pull request #29 from Cantara/feat/durable-webhooks (@oranheim)
- 362ed43d8754904f2aa821359cc18a66e9e71bf5: Merge pull request #3 from Cantara/haah/analysis-2026-10-14 (@oranheim)
- b566a0fd321f4d930c20e2b6c748916b33fed8c5: Merge pull request #30 from Cantara/docs/guide-screenshots (@oranheim)
- 74affb88a4920aa21a412452cb9f8c7590100edd: Merge pull request #31 from Cantara/chore/tooling (@oranheim)
- 5c628795c43005a178bd7a0c4716448f41551f49: Merge pull request #32 from Cantara/chore/deps-renovate-2 (@oranheim)
- 9550107edc1cbe0e7a86cabe5872149647c53e7d: Merge pull request #33 from Cantara/chore/release-2.2.5 (@oranheim)
- 529c98b5d6ed7408c5838bc3839b219692b9a137: chore(renovate): TypeScript stays on 6 for the tooling API and on 7.0 for tsc (@oranheim)
- d475750619752c78fc340daffede3af2873d67dc: chore: complexity ceilings, a pre-commit hook, one golangci-lint version (@oranheim)
- 96152df59beef1be52f7ea27d49659028b5151fe: feat(webhook): a delivery is not lost: parked before the answer, replayed at the start, read from the App's delivery log (@oranheim)
- 716c91db5cce15a6e71c0e03bd1c25f57ae54796: fix(auth): a renewed old session keeps when it was first issued (@oranheim)
- efcdfa928321317c36521a44770a4142baf3c4eb: fix(auth): a sign-in ends sessionMax after it began, however it is renewed (@oranheim)
- c8acdd38122dddc88ad1a752c2c5a41c22452bb5: fix(auth,assistant): email_verified given as a string; the keep-alive ping ends before the handler returns (@oranheim)
- 953c5bb3407376a9827f62ea65a4ad80bc85b673: fix(cluster,filestore,jsonstream): no lead on an unread state map; a transient read error clears; a surrogate keeps its neighbour (@oranheim)
- 73e487b8eb01cb922f4556b380989b9ce3f019c1: fix(github,lru): the conditional cache is keyed by credential and bounded by bytes; the LRU counts every value (@oranheim)
- 4a921400a6e1280b1dbdca1c3cd50e1a6f0f5b77: fix(llms): the sitemap is built once per snapshot, the origin filled in per request (@oranheim)
- ab5501b5e8a59a229e8e26ef3f7e212fbad478c6: fix(snapshot): an index whose builder panics keeps its last good value; the batch is published (@oranheim)
- 6ff149f70fffa9286d6fee51ee978b6c79752ae7: fix(snapshot): an index with nothing to keep fails the build, as before (@oranheim)
- 6332d4c4fc2edaf09efad057360f6089ac164355: fix(untrusted): the format characters that are written stay (@oranheim)
- a35951806f0ad7b3bcb818d561f8089e16ef4ec9: fix(untrusted,tools,httpapi): every format character is stripped; schemas Check would skip are refused; one origin computation (@oranheim)
- 4db59194d1c1f4178d35b7f78bcaac1bf883dd5b: fix(web): shared pieces and the review's small defects (@oranheim)
- 3c601cd1216943cf25076ea4d15f66a4f8219720: fix(web): the features review's findings (@oranheim)
- 507466c5e4593c8a628f98ce28c92e1c51bc5242: fix(webhook): a parked event goes when its jobs have run; the parking write is synced; a confirming read only when the first found nothing new (@oranheim)
- 52773d7eace970198273e62d82753844d0734261: fix(webhook): only large deliveries wait for a slot (@oranheim)
- d5d005bd6a48ba59a20480069e45af9bac4e398e: fix(webhook,llms,packages): bounded bodies held, no shared cache for Host-derived files, bounded registry hosts (@oranheim)
- 968c31b1157769f3f115a97abcc03c0ea7b2e689: fix: new issues and pull requests show without waiting for the poll (@oranheim)
- 9ddab7dbdd692ad3e07d510f68d1cd0277a02935: fix: the media type is checked first again; the sitemap keeps the last origin filled; the cache key needs a credential; comments and changelog (@oranheim)
- 89baa6b43cc24543ed5443f0f8157c274e3a6a5d: perf(web): refresh once per 15 s, keep /me, no prefetch on dense links, read page 2 only when near (@oranheim)
- f64b9b67fcb6a3b907c6d0a70a542ee57be9072c: refactor(api): one scope package for the commits, pull requests and issues listings (@oranheim)
- 9417b25f14840e141d0094031c7769064b4bd881: refactor(dashboard): one section shell for the pull requests and the issues; changelog (@oranheim)
- 5e7c7d3377e57c0dac4ae9b24916cbdcb873bca2: refactor(lru): one typed LRU cache for the GitHub transport, the package registries and the image proxy (@oranheim)
- 78b61ed5047c7155d7f1598bee8901ec01755143: refactor(packages,badges): no release is an explicit error, not nil, nil (@oranheim)
- 248f284a245db3070668bda7475dee881a5c6ca2: refactor(present): split the presentation page into its screen, status, stream and controls (@oranheim)
- 9783ad97bc7fc0cc6eb097db4e5f969df574d830: refactor(scp): the repository hooks in order, not by index; changelog (@oranheim)
- 70d3f70a472facbfeaced5719c8de2ded13b6378: refactor(web): one paging hook for the commits, pull requests and issues lists; one repository queue panel (@oranheim)
- 601c4178ae686b0e36767a9c1f5652a89ea8cede: refactor(web): shared product and repository filter fields, one tile title (@oranheim)
- 152bd33e7da7bf70711eccd6242ae06b11beeadf: refactor: one portal origin, one JSON body reader, one label type (@oranheim)
The notes are cut here. Read all of them
cantara/source-code-portalGitHubgithub-actions[bot] (automation)
Changelog
Release notes
Changelog
- d7f088319eeb3f22531fc344680a1be65a0dc507: Merge #13: fewer webhook events, the security model, e2e without shared-state flakes (@oranheim)
- 5fc1bc71f33b517bd98e5d9f2794ab77ee3d42d8: Merge #14: faster, event-driven Go tests (@oranheim)
- 8ed025fa8facff81665bfd8a60fd93ec8c6a742d: Merge #15: the public cannot tell a portal with private repositories from one without (@oranheim)
- 39d0a22b1b96b582dcf5bcc2df43b30e9a336ddf: Merge #16: e2e deterministic by construction (@oranheim)
- 77e0dde115a1f0433aa2cc6f73efe51b2bf145ca: Merge #17: switch off the open pull requests or issues (@oranheim)
- 94c9cee2ce972623a03d6ba8523e98e5ca021eb7: Merge main into e2e-stable (@oranheim)
- c52fdf729f04a57e03bca849733ee9784a6450cd: Merge main into security-twin: the CI runner's slack on the time budgets (@oranheim)
- b5ceecd90202a9be14f0baaa8a1ec6c8fd0425c2: feat(dashboard): every side panel section hides by its own panel button; the latest commits first, then pull requests, then issues (@oranheim)
- 2e51d406f8a8f5c5784612b6d64f947bcf043cf4: feat(dashboard): the pull requests and the issues load more at the end of their scroll, as the latest commits do (@oranheim)
- e2ca9b5d2b66b2ef2ad5a540f2d3aff0ba1b06d3: feat(dashboard): the pull requests and the issues sections list the newest first, on the dashboard and /present (@oranheim)
- 4119629427a7c1ba2e7c6cd9b61505dd363deeb7: feat(dashboard): the side panel in sections: pull requests, issues and latest commits in thirds, each folding (@oranheim)
- 3c4dbbf7e5a0b37bb82c734728f1416fcd125e8f: feat(present): the pull requests and the issues drawn as the latest commits are, in the side column (@oranheim)
- 69d6c75a4f39435a4634105a325461e6ef5a7333: feat(present): the side column in sections: latest commits, pull requests and issues, each hiding; a compact status strip (@oranheim)
- 12751afa28e4c9d8aeb1877f81340499639fdb72: feat(web): /present, the fleet on one screen: health map, product tiles that fold, the commit column and the data's freshness (K1) (@oranheim)
- 90573402cb7e85edbab3019fdbfc5f02869bfa3c: feat(web): a Present icon in the header beside the theme menu; the presentation page's column header on one line; the guide-page skill and the Guide follow the rules API, the signals, the latest commits' dialog and the profiles (@oranheim)
- 73e7a1791b9e6ef8e68b92d975fd58084c759b32: feat(web): a finding's label is part of its link, and the latest commits read the next page at their end (@oranheim)
- 06947a43db980941cffe5fd948cb05c330fb89ca: feat(web): announcements are the dashboard's first row below the header and /present's below its strip; /present follows the reader's theme, a wall alone dark unless chosen (P-66) (@oranheim)
- 1904e48467a8d8e2814e00ef260f0f1fe9747293: feat(web): announcements sit above the fleet map, right below the fleet's numbers, on the dashboard and /present (@oranheim)
- 7f079cda665cf23c1482b6efece57d42d0ba80be: feat(web): one list of the fleet's signals for the dashboard and the presentation page (people, AI, automation, active, findings, in sync), the SCP brand linking to the dashboard, the tap bar at the bottom (P-61) (@oranheim)
- 5f616b13ecc8bcf2c8973b30d6b0b35817d7f87a: feat(web): open pull requests in the pages: /pulls in the header (whose turn first, the states as filters, works without JavaScript), the telemetry signal, the pulls element on the dashboard and /present, PRs columns, the group's and the repository's panels, the branch chip; Snyk's branches count as automation (PR2, P-68) (@oranheim)
- 36bf2c35d5ffecb698a6e44c0395a76738264150: feat(web): presentation profiles: Handheld portrait, Handheld landscape, Desk and Wall, each with its own commit column, Desk at 60% (K3, P-64) (@oranheim)
- 197e57192f4c2290eb3ed3940a860637d7a636f1: feat(web): the fleet's products as bare outlines, the products before the sync, a cloud for the sync and the commit kinds kept together (P-62) (@oranheim)
- c15c88e58d7fd5eeb52e3359c2b6728d14890ac3: feat(web): the group page's repositories are one table as the dashboard's products: a panel, aligned one-line rows, numbers right, every column sortable, health as ring and level, the status only when not up to date (@oranheim)
- 50dc99e9e0839d71c45b33dd121cda4e336d85eb: feat(web): the group table's release is the version alone with where it is from in its own column (GitHub, Maven, npm, ...); issues and findings are centred (@oranheim)
- 37ea7a9ffda97d2971867951624bf168397b4296: feat(web): the latest commits' label opens a dialog of the three kinds of work to show, remembered apart from the work that counts (P-63) (@oranheim)
- b5f47b0d9edb33ad506791139b2bcaeaa46ab368: feat(web): the presentation page folds by importance (good first, then the mildest to watch; attention never) and draws the fleet as one dense strip (@oranheim)
- 6dac40c7e981e6e14e9ecbf8acee3104a9118737: feat(web): the presentation page on a wall: tap bar, wake lock, web app manifest, reloads, burn-in shift, dark by default, design mode (K2) (@oranheim)
- 38ce8c060034229fd9d7f68ea589900fea80b8c8: feat(web): the presentation page splits by its profile, a window on half a monitor is a desk, the good products take richer tiles where there is room, and the shared screens are named (P-64) (@oranheim)
- 54dfd69d87f02c2384a21511641c8ee29d0b8759: feat(web): the presentation page's commit column as wide as its edge is dragged, the signals at its left kept by importance as they narrow, a double tap back to the usual width (P-60) (@oranheim)
- f21ed745b16e29bc1f52a1123029168ca5645f85: feat(web): the presentation page's commit column scrolls, reads older commits at its end and goes back to the newest after a minute (@oranheim)
- d10a9e2b014493a4b29792ef87885d6f63abf068: feat(web): the presentation page's commit subjects link to the commit on GitHub, as the dashboard's do (@oranheim)
- 58838ce3db89a7fbad07768bcf3ee90f38423919: feat(web): the presentation page's commits show the author's avatar where the column has room, and who beside when, the subject on a line of its own (@oranheim)
The notes are cut here. Read all of them
cantara/source-code-portalGitHubgithub-actions[bot] (automation)
Changelog
Release notes
Changelog
- 2b2c8efcecc94f919d9f5ecb3b4d23e1ada3c216: feat(llms): /opensearch.xml, and robots.txt keeps crawlers off the search pages (@oranheim)
- 5ffcbca8f4cb68495e804c15a1347751759ee4d4: feat(search): GET /api/v1/search and /search/suggest, the search tool for the assistant, MCP and WebMCP, status and metrics (Q2) (@oranheim)
- 4b47dccc682dd9bf2ce7044a54846c9433517383: feat(search): the search index in memory, a segment per repository reused by its content digest (Q1) (@oranheim)
- f7c9be8cc544285e07c9203416b63c14ced8c5f5: feat(snapshot): a content digest per repository, unchanged by a check that found nothing new (@oranheim)
- 5a175cd223d4b57ac29a6fa96c014b75af835137: feat(web): the search page and the header's search box with suggestions, OpenSearch and the SearchAction (Q3) (@oranheim)
cantara/source-code-portalGitHubgithub-actions[bot] (automation)
Changelog
Release notes
Changelog
- b4d42879108f1781a1c2a7af61025c83d8d1dc44: feat(mcp): the tool catalogue at /mcp over the Model Context Protocol, for tokens and the public view (W2) (@oranheim)
- 9c6861ffaa4bb18510422272e394bcd533cc6ebf: feat(tools): one tool catalogue for agents, the assistant on it, and the tools API (W1) (@oranheim)
- d88e843ad70c8b7aaff62fbc1efd03038beef7cc: feat(web): WebMCP, the portal's tools and the page's own for a browser's agent, and the Guide's agents section (W3) (@oranheim)
- 57d0317c6932975c08b65399704b9800403a3eeb: fix(httpapi): no Permissions-Policy entry for tools, whose default is self already and which Chrome warns about (@oranheim)
cantara/source-code-portalGitHubgithub-actions[bot] (automation)
Changelog
Release notes
Changelog
- cf994dfce515261121f9278dfdb61dc255b3cad6: feat(commits): a read that fails part-way keeps what it read, and a failing branch never costs the default one (@oranheim)
- 2fb0e33e626d08034e8f08935322b0e3af013102: feat(commits): the commit list is read as a stream in bounded memory, a message of any length keeping its start and its trailers (@oranheim)
- 30d0ef5bb5c4a77e51f75621e954ef4040be2f3d: feat(dashboard): a new reader counts every kind of work, automation included, until they narrow it in Settings (@oranheim)
- da132107151226f32031b4afe5d22d4208b36dc3: feat(github): trees stream, and the manifests search keeps only its directories and walks a truncated tree (@oranheim)
- b820fa1a3a078b081e70585735bc5efa0a96aded: feat(guide): two parts for readers and operators, a contents sidebar, pictures at their own size and the findings' icon legend (@oranheim)
- 3f618eab8c1081598b1b70701f607fb33344fece: feat(manifests): Cargo.toml and pyproject.toml, and the documents for every package manager (@oranheim)
- f821e5e510e34466214b1342f090b4421b6a401a: feat(packages): a private repository's packages are never named to a public registry, and providers can read the repository's tags (@oranheim)
- e8126d84b0f91d1c061a5261b40c64424ebf310a: feat(packages): package providers for Maven and npm, a shared registry client and the lookup job (@oranheim)
- 1e4eea8fe5fb4f1935831c6a8b2d7ad3a489f4ce: feat(packages): private registries with Basic, bearer or header credentials sent only to their own URL, and registries on a private network (@oranheim)
- 6411bfb8c55b24b3cb70e7c9d4de1474821c770e: feat(packages): providers for NuGet, RubyGems and Packagist (@oranheim)
- 67d8bd038c41df61a3d57640a2845548ef8c4ce6: feat(packages): providers for PyPI, Cargo, Go, Swift and CocoaPods, and Gradle builds for Maven (@oranheim)
- e3e387d00e43ae9a02de7042d94c97cea02b746d: feat(packages): wired in, a published package counts as a release, and the tests' registries never dial (@oranheim)
- 30c1c5aded28cc918bdefa32adeb4a277fb3bb22: feat(sync): a new release runs failed jobs again at its first start (@oranheim)
- 081535d49833b606f181337982e273454c4ae474: feat(web): a health score is a ring and a finding its kind's icon on its severity's tile, the points in its hint (@oranheim)
- 1a641902d00ff8d4f133bf3daa2f1b92989a2ea1: feat(web): a licence shows its short name and links its text, and the open issues link to GitHub (@oranheim)
- e69ddcbae8d2aa9c9d5858a4686abab393be7b83: feat(web): the header reads Guide, theme, Settings, and the theme is a menu with the chosen mode checked (@oranheim)
- 16f820b7e45cf181057a4cd841d8f3aa0f58ae20: feat(web): the release chip shows a published package where there is no GitHub release, and the repository page lists its packages (@oranheim)
- 5d101ad570724a98790f49834dadaa0c2c42668b: feat(web): the viewer is one account menu after the reader's icons, and the latest commits' fold sits at its title's end (@oranheim)
- dfd07ac98a56b9fa1924282900308a0be80238e7: fix(github): a response larger than the conditional cache's 1 MiB is read whole, not cut into malformed JSON (@oranheim)
- 1c94226b1749cde2fd6081f267305b12c325582d: refactor(egress): the public-only transport is core, for images and registries (@oranheim)
- 6090b982dbafdf64786bfe978ce92552a4afdd2d: style(guide): format the reordered sections (@oranheim)
cantara/source-code-portalGitHubgithub-actions[bot] (automation)
Changelog
Release notes
Changelog
- e0380d97a43f119121485c17e5495866b954ab91: feat(catalog): an unclaimed matcher for the repositories no other group selects (@oranheim)
- 8316a5e2ea822453eeb384d4499fef3518bb19f2: feat(commits): tell AI-assisted and agents' commits from people's own and from CI automation (@oranheim)
- 9d99db80f00277b49ae82c86ebf5c0c9e56e00a1: feat(dashboard): a landing page of signals: the fleet map, distilled products and people's commits (@oranheim)
- cbf6085c2000f1357277712b3c2537454e62febf: feat(dashboard): automation counts as work when the reader chooses it: the work that counts is any of by hand, with AI and by automation (@oranheim)
- 00f414d26fed1a52c40a620f09bcfbdee461d530: feat(dashboard): people by their GitHub login, the full name on hover (@oranheim)
- 0d74c0173d6aadc2b866cc6c289e0c0ce297044c: feat(dashboard): the fleet map's legend says its time ranges, and an about panel explains the rest (@oranheim)
- 148d9457ef87fbd05d422c1bb822732ec447e464: feat(dashboard): the latest commits are a side panel beside the products that folds away and resizes (@oranheim)
- f1ef99524e3a40dc1e97a27fbe1a3cd1530cd751: feat(dashboard): the reader chooses the work that counts (both, by hand, with AI) in a new Settings page (@oranheim)
- 3983c44fe7611ca86405d829ba44f1068cc571bd: feat(guide): a Getting started page explains the signals with screenshots, and a Claude Code plugin helps operators run a release (@oranheim)
- ff0e7d8abca0009e0263a552137d6941ad115da7: feat(layout): page layouts in a file-system store and a design mode for admins (@oranheim)
- a1d3771fa6b24a4fddcb374ac044dae23d54ed80: feat(web): every colour signal explains itself at once in a card, on hover, focus or a tap (@oranheim)
- 0dfef133cd3d3fa4cfa0f1316287dd609bdac7c2: feat(web): the theme, Settings and the Guide sit together at the header's right, as icons (@oranheim)
- 326b8d9d2bfcb725e9c99cae7adce8b993ded4d3: fix(commits): classify each commit once per snapshot; a narrow lens no longer dates members by their oldest commit (@oranheim)
- 0b06c2c6470b267047e581ca79e5d14b62036c05: fix(dashboard): after a return to the built-in layout the design mode says so, not that a layout was saved (@oranheim)
- 5f338e712902724a2cbbdffc62dc48de4a28afe6: fix(dashboard): the fleet map's about panel above the cards, the ranges compact (@oranheim)
- 45bdf182945ec7bee3ca0be41faad501008184cb: fix(web): a signal's hint is its name and at most three signals, no prose (@oranheim)
- da0d83ea20cf64a8af0635c39b1b142924c533e8: fix(web): the header's right reads Guide, Settings, then the theme (@oranheim)
cantara/source-code-portalGitHubgithub-actions[bot] (automation)
Changelog
Release notes
Changelog
- 26e3574bacf30a9cc4049f516a76f75d1e6e9d33: build(deps): Go 1.27.3 (GO-2026-6809, crypto/x509) (#12) (@totto)
- 11f2ddcd42cffa405dd9ab5fd942b2f743e9b859: build(deps): goldmark v2, Node 24.22.0, Playwright 1.64.1, distroless digest, Ubuntu 26.04 runners (#6) (@oranheim)
- 99596cbc93334cce1539174d8c5d33a3ce2bb5df: build(renovate): patch and minor updates merge themselves once CI is green; major updates wait for review (@oranheim)
- 0ff283b64a3665b2eab132e7c348b7154acd7f87: build(web): @axe-core/playwright 4.14.0, jsdom 30.1.3, vitest 5.0.5 (#10) (@oranheim)
- 0aa13824144407a7c7e7d95dd241648da005c859: build(web): next 16.4.1, react 19.3.1, @tanstack/react-query 5.104.3 (#7) (@oranheim)
- fe846e605eef45291b1577b32968fe2b9b35ae5d: chore(release): prepare 2.1.0 and drop the stray scp binary from the tree (@oranheim)
- c624dde0a17c16d80a997442a6a8b36f1023188d: chore(web): TypeScript 7 as tsc, Playwright 1.64 and the latest test libraries (@oranheim)
- 5b5898dd98e1251d70ad26d419e0b282eadb42cf: chore(web): declare the Apache-2.0 licence in package.json (@oranheim)
- 0156ebcc68e5b9573958c1417d70f6507ca668d7: chore(web): remove a local screenshot script (@oranheim)
- 675aa5fd9d97f8f3a16a2136b25976c023e78150: chore: ignore the Playwright MCP output folder (@oranheim)
- 6f95f9c19c697283cb6b15dd43b60c178307890c: chore: move renovate.json to .github/ and the CLAUDE.md import of AGENTS.md into .claude/CLAUDE.md (@oranheim)
- 3dfe9498301f71127475fde6caf13cf8ba15ffec: feat(access): access.require_auth, a portal for signed-in viewers only (@oranheim)
- c723e9f985639658faf3c8e88b917234703aa934: feat(access): an audit line for every request in the private view (@oranheim)
- afd3cd745217e9f4aed968a81a7acd6df3306307: feat(access): private repositories for permitted groups behind a trusted authenticating proxy (@oranheim)
- be12dad7985cc65b46a8c540e66e17de75c31205: feat(assistant): ask the portal through Anthropic, OpenAI, Gemini, OpenRouter or Ollama with read-only tools over the viewer's view, /ask and the admin provider test (@oranheim)
- 790758c9f16dc034eae6ccad4f9e165b041205d3: feat(auth): sign in through OIDC with PKCE or a bearer token, sealed stateless sessions, the admin role and /api/v1/me (@oranheim)
- 1fb9db06b2376b3f9ef542b09ecf3811ae6c6a5a: feat(catalog): a listing that misses a repository confirms it 30 seconds later (@oranheim)
- 45a3fe113550f815aa62c107f5c705fa1e67794d: feat(catalog): github.sources[].exclude keeps repositories out of the catalogue (@oranheim)
- f032ea66e22687fb7ae7709c0cbff43ec7d2289f: feat(catalog): the Java portal's addresses redirect to their successors (@oranheim)
- aaeb54b11d4042f0d3d615f92b7a717e9aa45107: feat(cli): scp config groups previews the groups on a repository listing; configure-scp skill for the owner (@oranheim)
- e5200f653dd4f236ecdbbf4018023b1e981be003: feat(cluster): several instances on Hazelcast with one leader, shared outcomes and webhook de-duplication (@oranheim)
- 5a3183cb73d8143d2cb1f23771b1bb857258fb38: feat(commits): keep the history of a repository: 500 default-branch commits, the newest branches and tags, in graph order, served by /repos/{owner}/{name}/history (@oranheim)
- d04dcc497952a2e3467881f5b0a84e0304438b75: feat(commits): list the default branch first among a history's labels and leave out Snyk's branches (@oranheim)
- 343df9b5607002b618b9980b70ab70f98cc56d25: feat(commits): numbered pages of a chosen size for the navigator and the timelines, the git graph laid out on the server (@oranheim)
- ed914336c4a2f991db0b9e8f79110d02815dd16e: feat(config): warn when a trusted proxy range is wider than one network while private repositories are served (@oranheim)
- dc632c5a2d782137245e0df52d1b03721aa58f53: feat(github): list user accounts too: an App's user installation, the token's own account with its private repositories, another user's public ones (@oranheim)
- 1332b455b12c3d61b97c79792838fa9c524b68d0: feat(health): score every repository and weigh each product, with the findings behind the score (@oranheim)
- dc2b9552a0a8e9df4a5a4e304730a6359bb52c7c: feat(live): image proxy for document images, server-sent snapshot events and a content-derived snapshot version (@oranheim)
- 32f1c59a1791b765a21c0f38e8d45e4a7ef95bdc: feat(llms): publish the catalogue as a KCP org hub at /knowledge.yaml (#4) (@totto)
- a6e75ff8d9793f80fd1a3ca0d51195eddf354fa5: feat(manifests): go.mod, package.json and pom.xml per repository with technology, dependencies and internal links (@oranheim)
- a169069b16c1ca2c92e817d0a50b6252476be35a: feat(seo): Open Graph text for link previews; M13 done at what a technical site needs (@oranheim)
- 09f46ceeedd92c42169127d1be9828604539a00c: feat(seo): one page address in Go and the web, JSON-LD graphs with breadcrumbs, and the sitemap and robots.txt from Go with lastmod (@oranheim)
- fca175761efcf7e006b12096f2f57fa380eed0d9: feat(web): badges on the dashboard cards and in the group table (@oranheim)
- 38e3d9df144e2b734015207f5b3017371ce9ada5: feat(web): complete breadcrumb trails, a repository under the first of its groups (RepoDetail.group) (@oranheim)
- b5995f89bf61f7602bc391663fa38254da588220: feat(web): draw a repository's commits as a git graph, with lanes for branches and merges (@oranheim)
- ca42dd17d13136a596dcd9084bfc5e50b875116e: feat(web): mission-control dashboard with every repository and its health badges per product (@oranheim)
- 30fe93762ab58e61f5770d29d542d87f9cd576d2: feat(web): server-rendered web UI on Next.js, supervised and proxied by scp serve (@oranheim)
- 340f89c5ef6d7e53858cbbf112179ee67ebe8c55: feat(web): show the portal's release next to its name in the header (@oranheim)
- da2981af15a3131f522d752c8fc0b6c2a280b0ed: feat(web): sign in from the header, the /signin page with single sign-on and the token form, the /admin status page (@oranheim)
- 77648610b95d70616135286cff96dfbbe13217f0: feat(web): the commit navigator: a repository's history as a virtualised git graph with labels, filters, keyboard and details; product timelines by day (@oranheim)
The notes are cut here. Read all of them
cantara/source-code-portalGitHubgithub-actions[bot] (automation)
Changelog
Release notes
Changelog
- f4a35d90d4d1d844271c9672cc1c831823d555c5: build(release): GoReleaser, signed multi-platform image and the release workflow; operator, repository and API guides (Ove Ranheim oranheim@gmail.com)
- e2c4c4885750d0a488a9762f23110bb2d4541045: chore(seed): reduce bootstrap.sh to a plain copy (Ove Ranheim oranheim@gmail.com)
- 0699f79a5900e93cebd6d1d9d41c3206356bbcb1: feat(api): /api/v1 groups, repos and snapshot from the OpenAPI contract; /readyz; serve wires store, snapshot, sync and catalogue (Ove Ranheim oranheim@gmail.com)
- db3c4c56b976b9e293b9dc31e8455393f4da25f1: feat(api): dashboard, paged commit feeds and repository detail with descriptor and commits; a shortened TTL applies at warm start (Ove Ranheim oranheim@gmail.com)
- 0f0470622a2cf5165a03c798b9abf57431425b5c: feat(badges): local flat SVG badges for repositories and groups; latest-release job (Ove Ranheim oranheim@gmail.com)
- 29b1a73fe3bc26e85826b20e9db78002a6c6f250: feat(catalog): discovery per source with admission filters, aliases and the two-miss removal rule; typed group matchers checked at startup (Ove Ranheim oranheim@gmail.com)
- 5e70fb138f9bba5e167227356ff40d8631d01043: feat(catalog): scp.yaml descriptor job with a bounded, field-by-field parser; .github/ wins, blob fetched only when its SHA changed (Ove Ranheim oranheim@gmail.com)
- 6c9dcbdb828934c2513f7f0bad8873a675e89752: feat(commits): latest default-branch commits per repository, cleaned and bounded; listings notify repositories whose pushed_at changed (Ove Ranheim oranheim@gmail.com)
- f4c5212b25c2ca9a51120a1677f9740ba570482a: feat(config,github): GitHub sources and catalogue groups; REST client with App or token auth, ETag replay, rate observation and error classes; fake GitHub for tests (Ove Ranheim oranheim@gmail.com)
- abe646eed237c21aa0eefac70a89807658e197cd: feat(docs): README and docs/ rendered to SafeHTML with a TOC; one sanitiser policy; stored HTML sanitised again at publish (Ove Ranheim oranheim@gmail.com)
- edad2164ae7a3dc604a63e9bd8a631bf71611528: feat(httpapi): middleware chain, CSP per response class, SPA fallback shapes, API negotiation and problems; public_url and trusted_proxies (Ove Ranheim oranheim@gmail.com)
- 9df6a3f864559cf4b53b6058d22a56c80ad6ff48: feat(llms): llms.txt, llms-full.txt, raw Markdown with scp front matter and Markdown answers to pages on Accept (Ove Ranheim oranheim@gmail.com)
- de8c8ca1c42ea58efe1248f02e0a22eec109ac4a: feat(ops): Prometheus metrics, operator status, dispatcher heartbeat for /livez, optional pprof on the admin listener (Ove Ranheim oranheim@gmail.com)
- 7f3f03f3ad8bbad0e8df313a438b97c69bafd866: feat(snapshot,github): commits and descriptor on repository entries, merged commit feeds; commits, trees and blobs from GitHub and the fake (Ove Ranheim oranheim@gmail.com)
- b2848f408554a116737fcf3d48ccfe43de675390: feat(snapshot,store): immutable snapshot with debounced publish; SQLite last-good store (Ove Ranheim oranheim@gmail.com)
- 75bda4478dba4f5d67947470278b11847de4beda: feat(sync): NotifySource for per-source jobs; installations refreshed every listing; webhook secret config; race-tolerant render bound (Ove Ranheim oranheim@gmail.com)
- 8c6a4ad0961529137b158b24584f7dc005389afb: feat(sync): job engine with keyed entries, priorities, concurrency and pace, rate budget reserves, retry backoff, source pauses and warm start (Ove Ranheim oranheim@gmail.com)
- 2b6ec328658c6b9e889672295f8d5bc74ba8cf68: feat(web): dashboard, group, repository, docs and commit pages with snapshot sync, Playwright smoke, axe and CSP gate (Ove Ranheim oranheim@gmail.com)
- 3b813de0fab3ac953072d25d669188254f2d61c9: feat(webhook): signed GitHub deliveries at /webhooks/github, deduplicated and routed to the sync engine; outage serves stale data (Ove Ranheim oranheim@gmail.com)
- 17f1d94b2273c4c56c8e8630afeefb5c235dae8a: feat: M0 skeleton (Ove Ranheim oranheim@gmail.com)
- 87049377a120310559feacbcf8a514b973a8e6b6: fix(image): include api/ in the build context for the embedded contract (Ove Ranheim oranheim@gmail.com)
- 2eeb46766106e76e08affe64041b98fff397ae0d: fix(seed): bootstrap.sh is a copy with one overwrite check (Ove Ranheim oranheim@gmail.com)
- da55774714821104a695f40f319d304e0c3903e8: fix(seed): lay the seed into this repository in place (Ove Ranheim oranheim@gmail.com)