# Commons Hub Brussels open data: changelog

What changed in the open dataset (https://commonshub.brussels/opendata), newest first. **Breaking** means an existing reader
has to change. Also as JSON (https://commonshub.brussels/opendata/changelog.json) and as an Atom feed
(https://commonshub.brussels/opendata/changelog.xml).

## 2026-10-06 · Praise feed, and the text of contributions

**Added**

- Each month has `praise.json`: the thank-yous posted in 💝praise, newest first, in the same shape as
  `contributions.json` (who, whom they mentioned, when, the text, reactions, photos). Bots and empty messages are left out.
- `contributions.json` and `praise.json` now carry the message `content` (mentions as @Name, Discord codes resolved,
  IBANs and personal emails masked), `reactions` with each emoji and count, and the `avatarUrl` of authors and mentions.
- `latest/public/praise.json` covers the last 60 days. Both channels are public by the community's choice.

*Source: chb 3.34.1.*

## 2026-10-06 · Members from Odoo subscriptions

**Changed · breaking**

- `members.json` now follows the Odoo subscriptions (Stripe only for members not yet on one).
- Each member's `status` is `active`, `grace` (unpaid or paused, still a member until `graceEndsAt`, 15 days at
  most) or `lapsed`; Stripe's raw statuses (`past_due`, `canceled`, …) are no longer used. `statusSince` says
  since when.
- `summary.activeMembers` counts members in good standing (active + grace); new `graceMembers` and `lapsedMembers`.
- The public file names organisation members only (`organizationName`); individuals are counted, and named only
  in the members tier.

*Source: chb 3.32.1, website #141.*

## 2026-10-06 · Members are back

**Fixed**

- Every month's `members.json` had been empty since 2 October (the membership data was not being fetched). It is
  restored for the whole history, and active subscriptions count in every month they were active.
- No `members.json` is written for months that have not started.

*Source: chb 3.31.3, website #139.*

## 2026-10-06 · Photos from the potluck, heartbeat and park cleaning

**Added**

- Photos posted in #potluck, #heartbeat and #park-cleaning are now public, like #contributions and #general:
  in `images.json` and `YYYY/MM/public/images/`.

*Source: chb 3.31.0.*

## 2026-10-05 · New room prices

**Changed**

- `rooms.md`: Ostrom €130, Satoshi €60, Mush Room €40, Angel €50 per hour, excluding VAT.

*Source: chb 3.28.1, website #134.*

## 2026-10-05 · Tokens issued

**Added**

- Each month has `tokens-issued.json`: every community token minted, with when, how many, to whom (Discord
  name) and why (from the token bot's annotation). `latest/public/tokens-issued.json` covers the last 60 days.
- No wallet addresses or transaction ids are published.

*Source: chb 3.28.0.*

## 2026-10-04 · Contributions feed

**Added**

- Each month has `contributions.json`: the #contributions messages, newest first, with who posted, who was
  mentioned (thanked), when, reactions and the public photos. No message text.
- `latest/public/contributions.json` covers the last 60 days.

*Source: chb 3.27.0.*

## 2026-10-03 · Excluded transactions (test mints)

**Added**

- A transaction can be excluded from every total while staying listed for transparency: `metadata.excluded`
  holds the reason.
- Exclusions come from trusted Nostr annotations (`["exclude","<reason>"]`) or chb's settings.
- The 2025 CHT test mints (1 million in January, 2 trillion in September) and their burns are excluded: token
  totals in `summary.json` and `contributors.json` drop from about 2 trillion to the real figures (2025: 4,032.5
  minted, 1,102.2 burnt).

*Source: chb 3.26.0, website #109.*

## 2026-10-03 · Members' annotations count

**Added**

Annotations signed by a member's browser key now count when the website attests that key (kind 31926) with
the `member` or `steward` role for the Commons Hub Discord server. Removing the role or the key from the
attestation revokes it at the next hourly pull. Members reclassify transactions from the year and month
reports: every category opens its transactions.

*Source: chb 3.25.0, website #108.*

## 2026-10-03 · Categories from the books, a published taxonomy, and coverage

**Added**

- Transactions left uncategorised by rules take their category from how the bank line is booked in Odoo
  (the invoice, bill, journal entry or account it is reconciled with): `metadata.categorySource: "odoo"`, and
  the matched documents' URIs in `metadata.documents`. Bills settling an invoice accrued the year before get
  `accrual` ("Previous-year invoices").
- VAT payments, local taxes, salaries and outgoing refunds are categorised by their reference while Odoo has
  not reconciled them.
- The taxonomy (slug, label, direction, group, PCMN accounts) is at `https://commonshub.brussels/opendata/latest/categories.json`.
- Each month's `summary.json` reports `coverage` (`uncategorisedShare`, 0–1). For 2025, uncategorised money fell
  from about €116k in / €185k out to €6k / €1k.
- A bank journal's opening-balance row is no longer counted as income (`opening_balance`, type `INTERNAL`).

*Source: chb 3.24.0, 3.24.1, 3.24.2.*

## 2026-10-03 · Role accounts are private in the ledger

**Changed**

Accounts named after a role that one person holds (e.g. "Current account director", "C/C gérant") are now
treated like accounts named after a person: in `accounts-chart.json` they are labelled "Account of an
individual" (`individual: true`) and in `ledger-balances.json` they are merged into their group's
"individuals" row. Totals are unchanged.

*Source: chb 3.23.0.*

## 2026-10-03 · Chart of accounts and ledger balances

**Added**

- `https://commonshub.brussels/opendata/latest/accounts-chart.json`: the full chart of accounts used in Odoo (Belgian PCMN), with labels in
  English, French and Dutch, class and group; `used` marks the accounts with entries.
- `https://commonshub.brussels/opendata/{YYYY}/ledger-balances.json`: for every account, the opening balance, debit, credit and closing
  balance of posted entries that year, refreshed hourly from Odoo.
- Accounts named after a person (current accounts, a person's fees) are merged per group with a neutral
  label, and payroll is a single line, so no individual amount can be read. Totals are exact and identical
  for every audience.

*Source: chb 3.22.0.*

## 2026-10-03 · Annual accounts filed with the National Bank

**Added**

New file `annual-accounts.json` per year (under the year the fiscal period **ends**) and in `/latest/`
(every fiscal year): period, filing status, NBB register status, key figures and every figure by NBB code, the
filed abbreviated balance sheet and profit and loss as PDF (`https://commonshub.brussels/opendata/2025/annual-accounts/…`, with sha256), and
consistency checks. Published: fiscal year 2025, and fiscal year "2023" (1 July 2023 – 31 December 2024) under
`/2024/` with class totals only (`figuresSource: "internal-balance"`). **Read `checks[]` before using the
figures**: both years have known inconsistencies under review.

*Source: chb 3.20.0, 3.21.0, website #102.*

## 2026-10-03 · One identifier per accounting document: its Odoo URI

**Changed · breaking**

Every bill, credit note, invoice and expense claim is identified everywhere by
`odoo:<host>:<db>:<model>:<id>` (`account.move`, or `hr.expense` for a claim not booked yet):
- new `uri` on every entry of `expenses.json` and `pending-bills.json`, and on `bookings.json` `rentals[]`;
- `customers.json`: `invoices` is now the **list of invoice URIs**; the count moved to `invoiceCount` (breaking);
- `id` (`b-…`, `x-…`) is deprecated and will be removed in a later chb release: use `uri`.

*Source: chb 3.18.0.*

## 2026-10-03 · Community annotations reach the published files

**Changed**

Tags published on Nostr (kind 1111 with a lowercase `i`: `category`, `collective`, `event`, `spread`,
description) are applied by chb at the next hourly run to `transactions.json` (description in
`metadata.note`), `expenses.json`, `pending-bills.json` and room rentals, when the author is trusted: the
website's key, chb's key, or anyone they follow. Comments (uppercase `I`) are never applied. How to annotate:
the *Contribute back* section of the skill. This removes the "Nostr tags do not reach the published files"
known bug.

*Source: chb 3.18.0, 3.19.0, website #97.*

## 2026-10-03 · The skill is now at /opendata.md; /opendata is a web page

**Changed**

`https://commonshub.brussels/opendata` is now the same documentation rendered as HTML. Agents load the markdown skill from
`https://commonshub.brussels/opendata.md` (also still at `https://commonshub.brussels/opendata/SKILL.md`). The JSON API under `https://commonshub.brussels/opendata/…` is unchanged.

*Source: website #99.*

## 2026-10-03 · Monthly time series, data annotations and summaries

**Added**

- `https://commonshub.brussels/opendata/monthly.json` and `https://commonshub.brussels/opendata/{YYYY}/monthly.json`: one row per month (money in/out without internal
  transfers, expenses, invoiced income, bookings, events, door, members, tokens) and `coverage` per section.
- `https://commonshub.brussels/opendata/annotations.json`: known one-off events in the data (test mints, incidents, changes of method) and
  known bugs at the source, also attached to the monthly rows as `notes[]`.
- `https://commonshub.brussels/finance.md`, `https://commonshub.brussels/economy.md`, `https://commonshub.brussels/community.md`: the last twelve months as markdown.
- `https://commonshub.brussels/DATA.md` now redirects to the open data; `/data/` and `/api/` are internal to the website.

*Source: website #96.*

## 2026-10-02 · Every month and every year has every file

**Changed**

From the first month of data to the last, every month has every month file and every year every year
file, older months included; a period with nothing to report has the file with empty lists
(`"expenses": []`). A 404 now only means the period is not generated yet, or the path is not part of the open
dataset.

*Source: chb 3.17.0.*

## 2026-10-02 · Licensed under the Open Database License (ODbL 1.0)

**Added**

`license` in `index.json` and a `Link: <…>; rel="license"` header on every response. Attribution and
share-alike apply to derived databases; see the *Licence* section of the skill.

*Source: website #94.*

## 2026-10-02 · Expenses, vendors, customers and bookings; month bills.json removed

**Added · breaking**

New per month and per year: `expenses.json` (every bill, credit note and expense claim, line by line),
`vendors.json`, `customers.json` and `bookings.json` (room occupancy and rental revenue). Organisations
are named; private individuals appear by type only. The month `bills.json` is **removed**: read
`expenses.json`. Privacy fix: public `transactions.json` no longer carries bank narrations (payer names,
account numbers).

*Source: chb 3.16.0.*

## 2026-10-02 · Open-data API and skill

**Added**

The public tier of the chb dataset as a read-only JSON API at `https://commonshub.brussels/opendata`, with a skill for agents. Included
from the start: transactions, summaries, events, door and membership counts, `vat.json` (quarterly VAT
returns), `pending-bills.json` (bills still to pay) and `hashes.json` (integrity manifests).

*Source: website #94.*
