Contributing Guide

June 23, 2026 ยท View on GitHub

Welcome! We're so glad you're here and interested in contributing to Flatcar! ๐Ÿ’–

Table of Contents


As a newcomer, you're actually in the best position to help us improve! We'd really love your feedback on:

  • Confusing steps when setting up your developer environment
  • Missing information in our guides or documentation
  • Bugs or rough edges in our automation scripts

If something doesn't make sense or doesn't work, please let us know by opening a bug report โ€” we genuinely appreciate it and every bit of feedback helps make Flatcar better!


Ways to Contribute

There are so many ways to get involved! We welcome all kinds of contributions:

CategoryExamples
CodeNew features, bug fixes, builds, CI/CD
DocumentationGuides, tutorials, API docs
CommunityIssue triage, answering questions on Discord/Slack
Flatcar AppsCreate reference implementations for running services on Flatcar (e.g., Minecraft, Jitsi) โ€” great for learning!
OutreachBlog posts, talks, presentations, workshops
CoordinationRelease management, upstream project coordination (e.g., Flatcar CAPI, sysext initiative)
EventsBug fixing days, doc writing days, devrooms, meetups, conferences
DesignWeb design, maintaining the Flatcar website

Not everything happens through a GitHub pull request. Please come to our meetings or contact us to discuss how we can work together โ€” we'd love to meet you!


Getting Started

Thinking of contributing? Awesome! The best way to start is to engage with the project early โ€” drop a comment on an existing issue or open a new one. Let us know what you're interested in working on. This helps us help you, and it's often the key to getting your contribution accepted smoothly.

To report bugs or request features, just file an issue โ€” we're always happy to help point you in the right direction!

Finding Issues

Not sure where to start? No worries โ€” we've got you covered!

LabelDescription
good first issueExtra guidance to help you make your first contribution
help wantedIssues suitable for non-core maintainers

๐Ÿ’ก Tip: Don't see any issues with these labels? No problem! There's always something exciting to work on. Hop on Discord or join one of our Office Hours โ€” we'll find something that fits your interests and skill level.

๐ŸŒŸ Great for newcomers: Consider contributing a Flatcar App! A Flatcar App is a reference implementation showing how to run a specific service on Flatcar (e.g., Minecraft Server, Jitsi). It's a fantastic way to learn Flatcar hands-on while creating something awesome that helps other newcomers learn too!

Found something you'd like to work on? Excellent! Just leave a comment like "I'd like to work on this" โ€” that's all it takes to claim it.

Proposing New Features

Got an idea for a new feature or a big architectural change? We'd love to hear it! Don't be shy โ€” the best approach is to open an issue first so we can discuss it together before you invest time in implementation.

For package requests, use the "New Package Request" issue type and check out Adding New Packages for guidelines.


Repository Overview

The Flatcar project is spread across multiple repositories in the flatcar GitHub organisation. Here is a map of the key repos, grouped by function, to help you find where to contribute.

OS Image Build System

These repos are the beating heart of the OS image build system.

RepositoryDescription
scriptsImage build, SDK, and package management โ€” the main entry point for OS development
initsystemd boot files and early OS initialisation
bootengineEarly-boot initrd (dracut) modules
baselayoutBase filesystem layout
flatcar-build-scriptsExtra build helper scripts independent of the main scripts repo

Update and Reboot Infrastructure

Flatcar ships atomic, automatic updates. These repos implement the full update and reboot-coordination stack.

RepositoryDescription
update_engineUpdate daemon โ€” the Omaha protocol client running on each node
nebraskaWeb-based Omaha update server, dashboard, and release manager
ue-rsExperimental Rust implementation of the Omaha update client
locksmithReboot coordinator using etcd locks to prevent cluster-wide simultaneous reboots
flatcar-linux-update-operatorKubernetes operator that integrates the update engine with the Kubernetes node lifecycle
fleetlockGo client for the FleetLock reboot-coordination protocol

Node Configuration and Provisioning

Tools for bootstrapping and configuring nodes at first boot.

RepositoryDescription
ignitionFlatcar's fork of Ignition โ€” used for CAPI builds and development
coreos-cloudinitLegacy cloud-init configuration tool for Flatcar
container-linux-config-transpilerConverts human-friendly Container Linux Config YAML into Ignition JSON

System Extensions

Flatcar is minimal by design; system extensions let you layer software on top without modifying the read-only OS image.

RepositoryDescription
sysext-bakeryRecipes for building systemd-sysext images (Docker, containerd, Kubernetes, and more)

Testing and Tooling

RepositoryDescription
mantleTest framework (kola), image upload tools, and general glue utilities
toolboxInteractive debugging container that provides a mutable shell on a Flatcar node
update-ssh-keysManages authorized SSH keys from multiple sources
maydayGathers diagnostic support information from a running node
seismographDisk partition management tools
nss-altfilesNSS module that allows relocating /etc/passwd and related files

Deployment and Cloud

Templates, examples, and tooling for getting Flatcar running on cloud and on-prem infrastructure.

RepositoryDescription
flatcar-terraformTerraform examples for AWS, Azure, GCP, Equinix Metal, and more
flatcar-packer-qemuPacker templates for building QEMU and Vagrant images
flatcar-cloud-image-uploaderTooling for uploading Flatcar images to cloud providers

Cluster API Integration

RepositoryDescription
cluster-api-bootstrap-provider-kubeadm-ignitionCAPI bootstrap provider that provisions Flatcar nodes using Ignition configs generated by kubeadm

Flatcar Apps

Reference implementations showing how to run real-world services on Flatcar โ€” great for learning and as starting points for your own deployments.

RepositoryDescription
flatcar-app-minecraftContainerised PaperMC Minecraft server deployable on Azure and other clouds
flatcar-app-jitsiJitsi video-conferencing server automation
flatcar-mastodonAutomation for deploying a Mastodon node on Flatcar

Project and Community

RepositoryDescription
FlatcarCentral issue tracker, project documentation, governance, and release planning
flatcar-websiteSource for flatcar.org
flatcar-demosDemo scripts and artefacts from conferences and meetups
flatcar-tutorialHands-on tutorial material for newcomers

๐Ÿ’ก Starting out? scripts is where most OS-level contributions happen. sysext-bakery is a great low-barrier entry point for adding or updating software extensions.


Communication Channels

For all communication channels, community meetings, and social media links, see the Communication Channels section in the README. Come hang out with us on Discord!


Development

Development Environment Setup

Ready to dive into the code? Let's go! Our Developer Guides will walk you through the Flatcar SDK and common tasks like adding or upgrading packages. Start here:

These guides will give you a solid foundation for working with the SDK and help you submit PRs that sail through review!

Pull Request Lifecycle

Pull requests can be issued from repository branches (maintainers only) or from forks. The project treats all PRs equally for review and merge, regardless of origin.

Requirements:

  • Successful CI (including any required status checks the repository defines โ€” see Branch Protection and Merge Requirements)
  • At least one approving review from someone other than the PR author
  • CODEOWNERS review is required when owned paths are touched
  • All review threads must be resolved before merge
  • The most recent push must be approved by someone other than the author of that push (no self-approval of your own latest change)
  • Approvers may be co-authors (allowing reviewers to suggest changes)

Stages:

StageDescription
1. FiledPR is created. Draft PRs only undergo build+test when explicitly requested.
2. Ready for ReviewMaintainers can begin reviewing and approve CI runs. Authors may file directly in this stage if the PR is ready.
3. Under ReviewMaintainers add comments, request changes, and vet against Flatcar's mission and core principles.
4. Merged or ClosedPR is merged upon approval or closed without merge.

๐Ÿ’ก Tip: PR feeling stuck? Don't be shy โ€” reach out on Discord or bring it up in a community meeting. We're here to help and we want to see your contribution succeed!

Branch Protection and Merge Requirements

The rules below apply to every repository under the flatcar organisation. Individual repositories may add further requirements (for example, extra required CI checks) on top of these.

Review and merge rules

Applied to each repository's default branch:

RuleBehaviour
Pull request requiredDirect pushes to the default branch are blocked; changes must land via PR.
Approving reviewsAt least 1 approving review is required.
CODEOWNERS reviewRequired when changes touch a path owned in CODEOWNERS.
Stale review dismissalApprovals are not automatically dismissed when new commits are pushed, but the latest push must still be approved (see Last-push approval).
Last-push approvalThe most recent push must be approved by someone other than its author.
Review thread resolutionAll review conversations must be resolved before merge.
Branch deletionThe default branch cannot be deleted.

GitHub Copilot code review is also enabled on PRs targeting the default branch, including draft PRs, and re-runs on each new push.

Repository defaults

  • Merge strategy: merge commits only โ€” squash and rebase merges are disabled.
  • Auto-merge: disabled.
  • Update branch: PR authors may update their branch from the base branch via the GitHub UI.
  • Delete branch on merge: enabled โ€” head branches are removed automatically after merge.
  • Commit signoff: required โ€” commits must include a sign-off (use git commit -s, including for commits made via the GitHub web UI).

Authoring PRs

Here are some tips to make your PRs shine and get merged quickly:

Commit Best Practices

  • Atomic commits: Each commit should be self-contained and address a single logical change. See the Linux Kernel guide on separating changes.

  • Meaningful messages: Commit messages should explain why something is done, not just what. See describing changes.

  • Clean history: Use git rebase to squash and order commits logically. Don't retain messy development history.

  • No throwaway commits: Don't add code you'll change in a later commit. Squash related changes together.

  • Self-review: Give your own code a critical look before submitting โ€” you'll often spot things you missed, and reviewers will thank you!

PR Description

Think of your PR description as a cover letter. Help reviewers understand:

  • Explain why you're proposing the change
  • Provide an overview of the changes
  • List any unresolved questions or TODO items
  • Give reviewers the context they need

Commit Guidelines

Great commit messages make everyone's life easier (and make you look like a pro!). Here's the format we use:

<area>: <description of changes>

Detailed information about the commit message goes here.

The Rules

RuleDetails
Line lengthTitle โ‰ค 72 characters; body wrapped at 72 characters
Blank lineSeparate title and body with one empty line
Title moodUse imperative mood (e.g., "Add feature" not "Added feature")
Title punctuationNo period at the end
Body punctuationEnd sentences with periods

Examples

โœ… Good:

app-shells/bash: update ebuild to 5.3

Gentoo upstream has unmasked bash 5.3 and declared it stable.
This change updates the component to use the latest upstream ebuild.

โŒ Bad:

Update bash

Updated bash to the latest one.

Thanks for reading, and thank you so much for contributing! ๐Ÿ™ We're thrilled to have you as part of the Flatcar community. If you have any questions at all, don't hesitate to reach out โ€” we're always happy to help and can't wait to see what you build! ๐ŸŽ‰