# How to Add Resources for Languages Not Currently Listed in Free Programming Books

> Contribute new programming language resources to Free Programming Books. Learn how to add language specifics by forking the repo and submitting a pull request.

- Repository: [Free Ebook Foundation/free-programming-books](https://github.com/EbookFoundation/free-programming-books)
- Tags: how-to-guide
- Published: 2026-02-23

---

**Fork the EbookFoundation/free-programming-books repository, create a new markdown file in `books/free-programming-books-<lang>.md` using the ISO-639-1 language code, populate it with alphabetically sorted resources, update the README.md index table, and submit a pull request for automated linting.**

The EbookFoundation/free-programming-books repository maintains a curated collection of freely available programming resources through a modular file structure. When you need to add resources for languages not currently listed, you create a dedicated markdown file for that language and register it in the central index. This workflow ensures consistent formatting, automated validation via GitHub Actions, and seamless discoverability through the main README.

## Step-by-Step Workflow to Add Resources for New Languages

### Fork and Create the Language File

Begin by forking the repository to your GitHub account. Navigate to the `books/` directory and create a new file following the naming convention `free-programming-books-<lang>.md`, where `<lang>` is the ISO-639-1 language code or a widely recognized short name (e.g., [`free-programming-books-go.md`](https://github.com/EbookFoundation/free-programming-books/blob/main/free-programming-books-go.md) for Go).

Use an existing language file such as [`books/free-programming-books-python.md`](https://github.com/EbookFoundation/free-programming-books/blob/main/books/free-programming-books-python.md) as a template to ensure you follow the established markdown structure.

### Structure Your Resource List

Populate the new file with resources organized under logical headings such as **Books**, **Interactive Tutorials**, **Courses**, and **Communities**. Adhere to these formatting rules:

- List each resource on a single line using the format: `[Title](URL) – Description (Source/License)`
- Maintain **alphabetical order** within each section
- Ensure descriptions clearly indicate the format (PDF, HTML, video) and license when available

### Update the Master Index

Open [`README.md`](https://github.com/EbookFoundation/free-programming-books/blob/main/README.md) and locate the "Programming books" table. Add a new row linking to your language file using this format:

```markdown
| Language | Books | Courses | Interactive |
|----------|-------|---------|-------------|
| **Zeta** | [Zeta books](books/free-programming-books-zeta.md) | – | – |

```

Replace placeholder columns with actual links if you have included courses or interactive tutorials in your language file.

### Validate and Submit

Run the project's linter locally if possible, or rely on the automated checks. The repository includes a GitHub Actions workflow in [`.github/workflows/markdown-lint.yml`](https://github.com/EbookFoundation/free-programming-books/blob/main/.github/workflows/markdown-lint.yml) that validates Markdown syntax and link formatting for every pull request.

Commit your changes with a clear message such as "Add Zeta programming language resources", push to your fork, and open a pull request against the main repository. Include a concise description of the language, the resources added, and confirmation that you verified the links.

## File Naming and Location Standards

All language-specific resources reside in the `books/` directory at the repository root. The strict naming convention `free-programming-books-<lang>.md` enables automated parsing and consistent URL generation. When selecting the language identifier:

- Prefer ISO-639-1 two-letter codes (e.g., `es` for Spanish, `zh` for Chinese)
- Use widely recognized short names only when ISO codes are ambiguous or uncommon (e.g., `cpp` for C++)

## Required Markdown Format

The repository enforces a specific markdown structure to ensure compatibility with downstream tools and the website generator. Each language file must begin with an H1 heading containing the language name, followed by H2 sections for resource categories.

Example structure for a new language file:

```markdown

# Zeta Programming Language

## Books

- [The Zeta Language Handbook](https://example.com/zeta-handbook) – Free PDF (PDF)

## Interactive Tutorials

- [Zeta Playground](https://play.zeta-lang.org) – Browser‑based editor with tutorials (Free)

## Courses

- [Zeta for Beginners (Coursera)](https://www.coursera.org/learn/zeta-beginners) – Video series (Free audit)

## Communities

- [Zeta Reddit](https://reddit.com/r/zeta) – Subreddit for Q&A and resources (Free)

```

## Continuous Integration Checks

The project uses GitHub Actions to maintain quality standards. The workflow defined in [`.github/workflows/markdown-lint.yml`](https://github.com/EbookFoundation/free-programming-books/blob/main/.github/workflows/markdown-lint.yml) automatically triggers when you open a pull request, performing these validations:

- Markdown syntax compliance
- Link formatting consistency
- Alphabetical ordering verification within sections

Address any CI failures by adjusting formatting in your language file or README entry before requesting final review.

## Summary

- **Fork** the EbookFoundation/free-programming-books repository to your account
- **Create** a new file in `books/free-programming-books-<lang>.md` using ISO-639-1 language codes
- **Format** entries as `[Title](URL) – Description` with alphabetical ordering within sections
- **Update** [`README.md`](https://github.com/EbookFoundation/free-programming-books/blob/main/README.md) to include the new language in the programming books table
- **Submit** a pull request and resolve any automated linting feedback from [`.github/workflows/markdown-lint.yml`](https://github.com/EbookFoundation/free-programming-books/blob/main/.github/workflows/markdown-lint.yml)

## Frequently Asked Questions

### What file name should I use when adding resources for a new language?

Name the file `free-programming-books-<lang>.md` inside the `books/` directory, replacing `<lang>` with the ISO-639-1 two-letter language code (e.g., [`free-programming-books-ja.md`](https://github.com/EbookFoundation/free-programming-books/blob/main/free-programming-books-ja.md) for Japanese). If the ISO code is ambiguous or uncommon, use a widely recognized short name like `cpp` for C++.

### Do I need to update the README when adding a new language file?

Yes, you must register the new language in [`README.md`](https://github.com/EbookFoundation/free-programming-books/blob/main/README.md) by adding a row to the "Programming books" table. This entry links to your new language file and ensures the resources appear in the central index. Without this step, the language remains undiscoverable despite the file existing in the repository.

### How does the repository check my formatting automatically?

The repository runs a GitHub Actions workflow defined in [`.github/workflows/markdown-lint.yml`](https://github.com/EbookFoundation/free-programming-books/blob/main/.github/workflows/markdown-lint.yml) that triggers on every pull request. This CI job validates Markdown syntax, checks that resource entries follow the `[Title](URL) – Description` format, and verifies alphabetical ordering within sections. Fix any reported errors by adjusting your language file before maintainers review.

### Can I add resources for a programming language that only has one book?

Yes, the repository accepts languages with minimal resources as long as the content is freely available and legally distributable. Create the language file following the standard naming convention, populate it with the single resource under the appropriate heading, and add the entry to [`README.md`](https://github.com/EbookFoundation/free-programming-books/blob/main/README.md). The modular structure accommodates languages at any stage of growth, from a single tutorial to extensive libraries.