MSBA-161 · Lesson 12 of 12 · 20 min
Case study: running an open source project
▶ Video coming soon A video version of this lesson is on the way.
The last session, on April 8, 2027, was about the project that had been in the background all spring: open-trail-report, a simple, open format for describing trail conditions, such as closures, washouts, ice and water levels, that any website or app could read. Malik Osei had started it two years earlier in his personal account, as a hobby. TrailCheck used it, two university hydrology groups used its data, and a parks volunteer network in northern New England wanted to. It had 140 stars, 11 contributors and one exhausted maintainer. Malik and Tidewater had agreed that the project would move into the tidewater-guides organization, stay open source, and be run properly. This lesson follows the plan the team made that day, which uses almost every topic in the course.
Step 1: move the repository into the organization
A repository can be transferred from a personal account to an organization by its owner, if the person has permission to create repositories in the organization. A transfer keeps the repository's history, issues, pull requests, wiki, stars and watchers, and GitHub redirects the old address to the new one, so existing links and clones keep working, although contributors should update their remotes. Malik transferred malik-osei/open-trail-report to tidewater-guides/open-trail-report. Because his personal repository had only owner and collaborator access, lesson 2's roles now became available, and lesson 1's teams could replace individual grants.
| Before the transfer | After the transfer |
|---|---|
| Owned by Malik's personal account | Owned by the tidewater-guides organization |
| Malik plus 2 collaborators with the same access | A maintainers team with Maintain, reviewers with Triage |
| No branch protection | A ruleset on main from lesson 3 |
| No security policy | Organization defaults plus a project SECURITY.md |
| Funding through an external page only | FUNDING.yml with GitHub Sponsors |
Step 2: settle the license
The project had an MIT license for the code, a short license that permits reuse, including in commercial products, as long as the copyright notice is kept. The trail reports themselves were a different matter: data is not code, and the volunteer network wanted to know whether it could republish reports. The team added a second license, a Creative Commons Attribution license, for the data folder, and explained in the README which license covers which files. Because the project had outside contributors, they also added a short statement to CONTRIBUTING.md that contributions are accepted under the project's licenses, so the rights to new contributions are clear. A license is the one community file that cannot come from organization defaults (lesson 5), so it lives in the repository itself.
Step 3: governance and community files
Next came the files that tell strangers how the project works. The organization's .github repository already supplied the code of conduct, contributing guide and support file (lesson 5). The project added its own GOVERNANCE.md, with the roles from lesson 5: contributor, reviewer, maintainer and lead. It added a SECURITY.md specific to the validator, and turned on private vulnerability reporting (lesson 7). It also added a CITATION.cff file for the researchers, issue forms for new report types and bug reports, and a pull request template asking for a sample data file with every format change.
| File | Source | Purpose for open-trail-report |
|---|---|---|
| LICENSE and data/LICENSE | Repository | MIT for code, Creative Commons Attribution for data |
| CODE_OF_CONDUCT.md | Organization default | Shared standard and reporting contacts |
| CONTRIBUTING.md | Repository, extending the default | How to propose a format change, with samples |
| GOVERNANCE.md | Repository | Roles and how decisions are made |
| SECURITY.md | Repository | Reporting weaknesses in the validator |
| CITATION.cff | Repository | How researchers cite the format |
| FUNDING.yml | Repository | Sponsor button for the maintainers |
Step 4: protection and automation
With outside contributors, review is the main safeguard. Priya applied the protect-main ruleset from lesson 3: pull requests with one approval from a code owner, dismissal of stale approvals, resolved conversations, a passing validate-data check, no force pushes or deletions, and signed commits. A tag ruleset protects release tags. Workflows from forks run without access to secrets, so contributors' pull requests are checked safely. The only outside actions in the workflow are pinned to commit identifiers (lesson 6), and Dependabot keeps them and the validator's dependencies current, with a weekly grouped update (lesson 8).
# .github/CODEOWNERS
* @tidewater-guides/maintainers-trail-report
/schema/ @malik-osei @priya-nair
/data/ @tidewater-guides/maintainers-trail-report @owen-tremblayStep 5: security from day one
Because open-trail-report is public, the main security features cost nothing: the dependency graph, Dependabot alerts and security updates, secret scanning with partner alerts, push protection, and CodeQL code scanning on the validator with the default setup. Priya turned all of them on with the organization's security configuration, set herself and Malik as the people to notify, and added the repository to the Monday alert review from lesson 7. The volunteer's leaked key in lesson 9 had come from this repository, so the contributing guide gained a line asking people to remove credentials from logs before pasting them.
Step 6: making it welcoming
Malik's experience was that most first-time contributors give up not because the work is hard but because nobody answers. The team agreed on four habits. Label small, well-described tasks good first issue and keep at least three open, because GitHub surfaces repositories with such issues to people looking for a first contribution. Reply to every new issue and pull request within three working days, even if only to say when a full review will happen. Thank contributors by name in the release notes. And keep the conversation about the format in Discussions, with an Ideas category for proposed new fields and a Q&A category for how-to questions, so issues stay a list of work.
Worked problem
Planning maintainer time
Last quarter the project received about 30 new issues and 18 pull requests. A first response to an issue takes about 10 minutes, and a review of a pull request about 30 minutes. If three maintainers share the work equally, how many hours does each spend on first responses and reviews per quarter, and per week over a 13-week quarter?
Show solution
- Issues: 30 x 10 = 300 minutes.
- Pull requests: 18 x 30 = 540 minutes.
- Total: 300 + 540 = 840 minutes, which is 14 hours.
- Per maintainer: 14 / 3, about 4.7 hours a quarter.
- Per week: 4.7 / 13, about 0.36 hours, or roughly 20 minutes.
Answer: About 4.7 hours each per quarter, roughly 20 minutes a week. Spread across three people, a sustainable load.
Step 7: releases and versioning
Data formats need stability, because other people's software reads them. The project adopted semantic versioning from MSBA-160: a new optional field is a minor release, such as 1.3.0; a correction to the documentation or validator that changes no data is a patch, such as 1.3.1; and anything that would make existing files invalid is a major release, such as 2.0.0, announced in Discussions at least two months ahead. Releases are created on GitHub from protected tags, with release notes generated from merged pull requests and edited by hand, and a sample data file attached to each release.
Step 8: funding with GitHub Sponsors
GitHub Sponsors lets individuals and organizations make one-time or monthly payments to developers and organizations whose open-source work they depend on. A sponsored account has a profile that explains what the money supports, with sponsorship tiers at different amounts, optional rewards such as a name in the README, and optional public goals. Sponsorships appear on the sponsor's and the sponsored person's profiles unless the sponsor chooses to be private. The FUNDING.yml file adds a Sponsor button to the repository that links to the profile and to any other funding pages. Malik set up a Sponsors profile; Tidewater became his first organization sponsor; and the two university groups asked their departments about doing the same.
Worked problem
A sponsorship goal
Malik sets a goal of 300 dollars a month to fund one day a month of maintenance. Tidewater sponsors at 100 dollars a month, and 14 individuals sponsor at 5 dollars each. How far is he toward the goal, and how many more 25-dollar sponsorships would reach it?
Show solution
- Individual sponsors: 14 x 5 = 70 dollars.
- Total: 100 + 70 = 170 dollars a month.
- 170 of 300 is a little over half, about 57 in 100.
- Remaining: 300 - 170 = 130 dollars; 130 / 25 = 5.2, so 6 more 25-dollar sponsorships would reach the goal.
Answer: He is at 170 of 300 dollars, a little over half; 6 more 25-dollar sponsorships would reach the goal.
Step 9: moderation and community health
Public projects attract the occasional hostile comment and, around a popular release, bursts of spam. Malik is the project's moderator (lesson 1), so he can hide comments, lock heated threads, block people who break the code of conduct, and set temporary interaction limits if a flood arrives. The team agreed that every moderation action gets a short, polite explanation, as lesson 5 recommended, and that conduct reports go to the shared mailbox so Malik is never the only person handling a report about someone he works with. The community profile under Insights now shows every recommended item complete.
Step 10: planning for succession
The reason Malik was exhausted was that the project had a bus factor of one: if he stopped, nobody else knew how to cut a release, answer a security report or decide on a format change. Moving the repository into an organization fixed ownership; it did not by itself fix knowledge. So the team wrote down every recurring maintainer task in a MAINTAINING.md file, each with the steps and the access it needs, and paired a second person with Malik on each task at least once before July. Owen took the data reviews and the release notes, Priya took security and the validator, and Malik kept the schema and the final say on format changes, as the governance file says.
| Maintainer task | How often | Primary | Backup |
|---|---|---|---|
| Triage new issues and discussions | Twice a week | Owen | Malik |
| Review pull requests to the schema | As needed | Malik | Priya |
| Review data contributions | As needed | Owen | Malik |
| Handle security reports and alerts | Monday slot and as needed | Priya | Malik |
| Cut a release and publish notes | About monthly | Owen | Priya |
| Moderate conduct issues | As needed | Malik | Grace (conduct mailbox) |
The same document says how a reviewer becomes a maintainer: after a sustained record of good reviews, an existing maintainer proposes them in a discussion, and the maintainers agree by consensus. Making the path visible matters as much as the rota. Contributors who can see how responsibility is earned are more likely to stay, and a project that adds a maintainer every year or two never ends up depending on one tired person again.
Step 11: knowing whether it is healthy
Finally, the team chose a few numbers to watch each quarter, all visible in the repository's Insights tab or easy to count: the time to first response on new issues and pull requests, the number of contributors who made their first contribution, the number of open good first issues, the share of pull requests merged versus closed without merging, open security alerts, and the number of dependents, other public repositories that use the format. Stars were noted but not targeted, because they measure interest rather than health.
| Measure | Before (January) | Target (July) |
|---|---|---|
| Median time to first response | 9 days | Under 3 working days |
| First-time contributors per quarter | 1 | 4 |
| Open good first issues | 0 | At least 3 |
| Maintainers | 1 | 3 |
| Open high or critical security alerts | 2 | 0 |
Looking back over the course
Owen closed the session by mapping each step back to the course. Organizations, teams and roles (lessons 1 and 2) gave the project an owner that would outlast any one person. Rulesets (lesson 3) made outside contributions safe to accept. Markdown and community health files (lessons 4 and 5) told strangers how to take part. Marketplace tools (lesson 6) were chosen by their permissions, not their popularity. The security features (lessons 7 to 9) watched dependencies and secrets for free. The plan (lesson 10) cost nothing extra because the work was public. And inner source (lesson 11) was the habit that made it natural for staff to contribute. The exam readiness course, MSBA-169, reviews all of it against the GH-900 skills outline before Owen's exam at the end of April.
Common mistakes
MistakeKeeping a project that others depend on in one person's personal account.
InsteadTransfer it to an organization so it has teams, roles and continuity.
MistakeUsing one license for code and data without checking it fits both.
InsteadChoose licenses that suit each kind of content and say which covers what.
MistakeMeasuring a project's health by its stars.
InsteadWatch response times, new contributors, open alerts and the number of maintainers.
MistakeLeaving contributors unanswered while reviews pile up.
InsteadShare the load among maintainers and promise a first response time.
Summary and key terms
- Transferring a repository to an organization keeps its history, issues and stars, and redirects the old address.
- Licenses must suit the content; code and data may need different ones, and licenses cannot be organization defaults.
- Governance, contributing, security and citation files, plus issue forms, tell contributors how the project works.
- Rulesets, code owners, safe workflows, pinned actions and Dependabot make outside contributions safe.
- GitHub Sponsors, with FUNDING.yml, lets people and companies fund maintainers through tiers and goals.
- Moderation tools and a few health measures, such as response time and new contributors, keep a project sustainable.
- Repository transfer
- Moving a repository to another account while keeping its history and redirecting its address.
- MIT License
- A short permissive open-source license that requires keeping the copyright notice.
- GitHub Sponsors
- A way to fund open-source developers and organizations through GitHub.
- Sponsorship tier
- A sponsorship amount with its own description and rewards.
- Semantic versioning
- Version numbers in the form major.minor.patch that signal the kind of change.
- Dependents
- Other repositories that use a project.
- Time to first response
- How long a new issue or pull request waits for its first reply.
Practice problems
Work each problem on paper first, then reveal the answer to check.
What happens to links to a repository's old address after it is transferred?
Show answer
GitHub redirects them to the new address.
Which file adds a Sponsor button to a repository?
Show answer
FUNDING.yml.
A change makes existing data files invalid. What kind of version number change is it?
Show answer
A major version change.
Lesson quiz · 5 questions
Score 60% or more to complete this lesson.
Create a free account to save your progress, take quizzes and earn a certificate.