Skip to content

Commit eb71fbc

Browse files
committed
chore: add open-source licensing, community docs, and tooling
- relicense: AGPL-3.0 root + ingest service, Apache-2.0 per-library; LICENSING.md and CLA.md - community docs: README, CONTRIBUTING, CODE_OF_CONDUCT, SECURITY, SUPPORT - .github: issue/PR templates, dependabot, CodeQL, Scorecard, dependency-review, links, pr-title, CLA assistant, dependabot auto-merge - husky pre-commit/commit-msg/pre-push hooks + commitlint
1 parent 5f03ad2 commit eb71fbc

36 files changed

Lines changed: 3906 additions & 288 deletions

.github/CODEOWNERS

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Code owners for OpenConditions.
2+
# These owners are automatically requested for review on matching pull requests.
3+
# See https://docs.github.com/repositories/managing-your-repositories-permissions/about-code-owners
4+
#
5+
# More specific rules below override earlier ones for a given path.
6+
7+
# Default owner for everything in the repo.
8+
* @Medformatik
9+
10+
# Governance / legal / community-health files warrant extra care.
11+
/LICENSE @Medformatik
12+
/LICENSING.md @Medformatik
13+
/CLA.md @Medformatik
14+
/CODE_OF_CONDUCT.md @Medformatik
15+
/SECURITY.md @Medformatik
16+
/.github/ @Medformatik

.github/FUNDING.yml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Funding links shown on the repo's "Sponsor" button.
2+
# https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/displaying-a-sponsor-button-in-your-repository
3+
#
4+
# Each key maps to one platform; values are your account/slug there. A button
5+
# only appears for platforms you've actually set up, so unused keys can stay
6+
# commented out. `github` requires GitHub Sponsors to be enabled for the account.
7+
8+
github: [Medformatik]
9+
# patreon: openconditions
10+
# open_collective: openconditions
11+
# ko_fi: openconditions
12+
# liberapay: openconditions
13+
# buy_me_a_coffee: openconditions
14+
# tidelift: npm/@openconditions/core
15+
# polar: openconditions
16+
# custom: ["https://openconditions.org/donate"]
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
name: 🐛 Bug report
2+
description: Report a defect in OpenConditions
3+
title: "[Bug]: "
4+
labels: [bug, needs-triage]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
Thanks for taking the time to file a bug. Please fill out as much as you can —
10+
incomplete reports are slower to act on and may be closed.
11+
12+
- 🔒 **Security issue?** Do **not** file it here — see [SECURITY.md](https://github.com/openconditions/openconditions/blob/main/SECURITY.md).
13+
- ❓ **Question or idea?** Please use [Discussions](https://github.com/openconditions/openconditions/discussions) instead.
14+
- type: checkboxes
15+
id: preflight
16+
attributes:
17+
label: Before you start
18+
options:
19+
- label: I searched [existing issues](https://github.com/openconditions/openconditions/issues?q=is%3Aissue) and this isn't a duplicate.
20+
required: true
21+
- label: I'm on the latest `main` or the most recent release (older versions aren't patched).
22+
required: true
23+
- label: This is a bug in OpenConditions itself, not in an upstream feed or a third-party API.
24+
required: true
25+
- type: textarea
26+
id: what-happened
27+
attributes:
28+
label: What happened?
29+
description: A clear, concise description of the bug — what you expected and what actually occurred.
30+
validations:
31+
required: true
32+
- type: textarea
33+
id: repro
34+
attributes:
35+
label: Steps to reproduce
36+
placeholder: |
37+
1. Configure feed source '...'
38+
2. Run the ingest / call the emitter '...'
39+
3. See error
40+
validations:
41+
required: true
42+
- type: dropdown
43+
id: component
44+
attributes:
45+
label: Affected component
46+
description: Which part of OpenConditions? Pick the closest.
47+
options:
48+
- Ingest service (services/ingest)
49+
- OpenLR resolver (services/openlr-resolver)
50+
- "@openconditions/core"
51+
- "@openconditions/roads"
52+
- "@openconditions/publishers"
53+
- "@openconditions/openlr"
54+
- OpenMapX integration (integrations/road-conditions-openconditions)
55+
- Documentation
56+
- Other / not sure
57+
validations:
58+
required: true
59+
- type: input
60+
id: feed-source
61+
attributes:
62+
label: Specific feed source / package id
63+
description: If the component above is a feed source or package, name it.
64+
placeholder: "roads/open511-bc, publishers/datex2, …"
65+
- type: input
66+
id: version
67+
attributes:
68+
label: Version / commit
69+
description: Tag, release, or short SHA from `git rev-parse --short HEAD`.
70+
validations:
71+
required: true
72+
- type: input
73+
id: last-working
74+
attributes:
75+
label: Last working version
76+
description: If this used to work, the last version/commit where it did (helps us bisect). Leave blank if unknown.
77+
- type: textarea
78+
id: environment
79+
attributes:
80+
label: Environment
81+
description: Required for ingest/resolver reports. Tell us how you run it and which feeds are configured.
82+
placeholder: |
83+
OS: macOS 15.0 / Ubuntu 24.04
84+
Node: 24.x
85+
pnpm: 11.x
86+
Python: 3.12 (if a resolver issue)
87+
Docker: 27.x (if running the containers)
88+
Feeds configured: ndw, open511-bc, wzdx-us, …
89+
PostGIS: version / where it runs
90+
render: text
91+
- type: textarea
92+
id: logs
93+
attributes:
94+
label: Relevant logs and/or screenshots
95+
description: |
96+
Paste relevant log output (ingest logs, resolver logs, API errors) or attach screenshots.
97+
**Redact secrets, tokens, and `.env` values.**
98+
render: shell

.github/ISSUE_TEMPLATE/config.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
blank_issues_enabled: false
2+
contact_links:
3+
- name: 💬 Question or discussion
4+
url: https://github.com/openconditions/openconditions/discussions
5+
about: For usage questions, feed-source ideas, and general discussion, please use Discussions instead of opening an issue.
6+
- name: 🔒 Security vulnerability
7+
url: https://github.com/openconditions/openconditions/security/advisories/new
8+
about: Report security issues privately via a draft GitHub Security Advisory. See SECURITY.md for the full process.
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
name: ✨ Feature request
2+
description: Suggest a new capability or improvement
3+
title: "[Feature]: "
4+
labels: [enhancement, needs-triage]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
Thanks for the idea! A few pointers first:
10+
11+
- 🛰️ **Requesting a new feed source** (a public open-data conditions feed)?
12+
Use the **🛰️ New feed source** template instead — it asks the right questions.
13+
- 💬 Not sure yet, or want to gauge interest? Float it in
14+
[Discussions](https://github.com/openconditions/openconditions/discussions) first.
15+
- 🛠️ Planning to implement it yourself? Please open this issue **before** writing code so we can
16+
agree on the approach.
17+
- type: checkboxes
18+
id: preflight
19+
attributes:
20+
label: Before you start
21+
options:
22+
- label: I searched existing issues and discussions and this isn't already proposed.
23+
required: true
24+
- type: textarea
25+
id: problem
26+
attributes:
27+
label: What problem does this solve?
28+
description: The user need or pain point. Who hits it, and when?
29+
placeholder: "As a self-hoster / data consumer, I want … so that …"
30+
validations:
31+
required: true
32+
- type: textarea
33+
id: proposal
34+
attributes:
35+
label: Proposed solution
36+
description: What should OpenConditions do? Be concrete — model field, parser/emitter shape, API shape, CLI flag, etc.
37+
validations:
38+
required: true
39+
- type: textarea
40+
id: alternatives
41+
attributes:
42+
label: Alternatives considered
43+
description: Other approaches you weighed and why you set them aside.
44+
- type: dropdown
45+
id: scope
46+
attributes:
47+
label: Area
48+
options:
49+
- Canonical model (@openconditions/core)
50+
- Feed parsers (@openconditions/roads)
51+
- Emitters / publishers (@openconditions/publishers)
52+
- OpenLR (@openconditions/openlr / services/openlr-resolver)
53+
- Ingest service (services/ingest)
54+
- OpenMapX integration
55+
- Documentation
56+
- Other / cross-cutting
57+
validations:
58+
required: true
59+
- type: dropdown
60+
id: contribution
61+
attributes:
62+
label: Would you like to work on this?
63+
options:
64+
- "Yes — I'd like to open a PR"
65+
- "Maybe, with some guidance"
66+
- "No — just suggesting"
67+
validations:
68+
required: true
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
name: 🛰️ New feed source
2+
description: Request (or propose to build) support for a new live-conditions feed source
3+
title: "[Feed]: "
4+
labels: [enhancement, feed-source, needs-triage]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
OpenConditions turns public open-data feeds (road incidents, roadworks, closures, hazards,
10+
congestion) into canonical observations. Use this form to request a new feed source, or to
11+
propose building it yourself.
12+
13+
Helpful background: a feed source is a parser plus a `FeedSource` entry in
14+
[`@openconditions/roads`](https://github.com/openconditions/openconditions/tree/main/packages/roads).
15+
- type: input
16+
id: feed-name
17+
attributes:
18+
label: Feed name
19+
placeholder: "e.g. NDW (Netherlands), DriveBC Open511, US Work Zone Data Exchange"
20+
validations:
21+
required: true
22+
- type: input
23+
id: coverage
24+
attributes:
25+
label: Country / region
26+
description: Which country or region does this feed cover?
27+
placeholder: "e.g. Netherlands, British Columbia (CA), United States"
28+
validations:
29+
required: true
30+
- type: input
31+
id: portal-url
32+
attributes:
33+
label: Open-data portal URL
34+
description: Link to the feed endpoint or the open-data portal page describing it.
35+
placeholder: "https://…"
36+
validations:
37+
required: true
38+
- type: dropdown
39+
id: format
40+
attributes:
41+
label: Data format
42+
description: What wire format does the feed publish?
43+
options:
44+
- DATEX II
45+
- Open511
46+
- WZDx (Work Zone Data Exchange)
47+
- GeoJSON
48+
- Other
49+
validations:
50+
required: true
51+
- type: textarea
52+
id: license
53+
attributes:
54+
label: Data license & attribution
55+
description: |
56+
**Important.** OpenConditions is built on open data and tracks attribution per source. What
57+
license or terms of use govern this feed, and what attribution does it require? Link the
58+
license if you can.
59+
placeholder: "e.g. CC-BY-4.0 (requires '© …'), public domain, proprietary ToS at …"
60+
validations:
61+
required: true
62+
- type: dropdown
63+
id: api-key
64+
attributes:
65+
label: Does it require an API key?
66+
options:
67+
- "No — fully open, no key required"
68+
- "Yes — free API key / registration required"
69+
- "Yes — paid / metered API key required"
70+
- Unknown
71+
validations:
72+
required: true
73+
- type: dropdown
74+
id: contribution
75+
attributes:
76+
label: Would you like to build it?
77+
options:
78+
- "Yes — I'd like to open a PR"
79+
- "Maybe, with some guidance"
80+
- "No — just requesting"
81+
validations:
82+
required: true

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<!--
2+
Thanks for the PR!
3+
4+
Title: Conventional Commits format (e.g. `feat(roads): add the Open511 parser for the BC feed`).
5+
The `pr-title` GitHub Action will reject non-conformant titles.
6+
7+
For anything non-trivial, please open an issue first so we can align on approach.
8+
Mark the PR as a Draft if it isn't ready for review yet.
9+
10+
Before opening, make sure the checks CI runs pass locally:
11+
pnpm lint && pnpm typecheck && pnpm test
12+
(Python: cd services/openlr-resolver && ruff check . && python -m pytest)
13+
14+
See CONTRIBUTING.md for the full workflow. The CLA bot will prompt on your
15+
first PR (see CLA.md).
16+
-->
17+
18+
## Summary
19+
20+
<!-- What does this change, and why? 1–3 bullets. -->
21+
22+
-
23+
24+
## Related issues
25+
26+
<!-- Link issues this addresses. "Fixes #123" auto-closes them on merge. -->
27+
28+
Fixes #

.github/dependabot.yml

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
version: 2
2+
updates:
3+
- package-ecosystem: npm
4+
directory: "/"
5+
schedule:
6+
interval: weekly
7+
day: monday
8+
time: "06:00"
9+
timezone: Europe/Berlin
10+
open-pull-requests-limit: 10
11+
versioning-strategy: increase-if-necessary
12+
labels: [dependencies]
13+
commit-message:
14+
prefix: chore
15+
include: scope
16+
groups:
17+
eslint-and-formatters:
18+
patterns:
19+
- "eslint*"
20+
- "prettier*"
21+
typescript-toolchain:
22+
patterns:
23+
- "typescript"
24+
- "@types/*"
25+
- "tsx"
26+
- "tsup"
27+
turbo:
28+
patterns:
29+
- "turbo"
30+
test-toolchain:
31+
patterns:
32+
- "vitest"
33+
- "@vitest/*"
34+
- "testcontainers"
35+
36+
- package-ecosystem: github-actions
37+
directory: "/"
38+
schedule:
39+
interval: weekly
40+
day: monday
41+
time: "06:00"
42+
timezone: Europe/Berlin
43+
open-pull-requests-limit: 5
44+
labels: [dependencies, ci]
45+
commit-message:
46+
prefix: ci
47+
48+
- package-ecosystem: pip
49+
directory: "/services/openlr-resolver"
50+
schedule:
51+
interval: weekly
52+
day: monday
53+
time: "06:00"
54+
timezone: Europe/Berlin
55+
open-pull-requests-limit: 5
56+
labels: [dependencies, python]
57+
commit-message:
58+
prefix: chore
59+
include: scope
60+
61+
- package-ecosystem: docker
62+
# Cover every Dockerfile so the digest-pinned base images get bumped (a
63+
# frozen digest only stays secure if something keeps it current).
64+
directories:
65+
- "/services/ingest"
66+
- "/services/openlr-resolver"
67+
schedule:
68+
interval: weekly
69+
day: monday
70+
time: "06:00"
71+
timezone: Europe/Berlin
72+
open-pull-requests-limit: 5
73+
labels: [dependencies, docker]
74+
commit-message:
75+
prefix: chore
76+
include: scope

0 commit comments

Comments
 (0)