RepoPilot

EbookFoundation/free-programming-books

:books: Freely available programming books

Mixed

Mixed signals — read the receipts

ConcernsDependency

non-standard license (CC-BY-4.0); no tests detected in the complete Git tree…

HealthyFork & modify

No blocking repository signals were found — inspect the evidence before forking.

HealthyLearn from

Documented and popular — useful reference codebase to read through.

MixedDeploy as-is

Scorecard "Branch-Protection" is 0/10; dependency CVE scan unavailable

  • Non-standard license (CC-BY-4.0) — review terms
  • No tests detected in the complete Git tree
  • Scorecard: default branch unprotected (0/10)
  • Last commit 2d ago
  • 79+ active contributors
  • Distributed ownership (top contributor 6% of recent commits)
  • CC-BY-4.0 licensed
  • CI configured

What would improve this?

  • Use as dependency Concerns to Mixed if: clarify license terms

Computed from maintenance signals — commit recency, contributor breadth, bus factor, license, CI, tests, cross-checked against OpenSSF Scorecard

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Want this for your own repo?

Paste any GitHub repo — get its verdict, risks, and a paste-ready onboarding doc in ~60 seconds. Free, no sign-up.

Embed the "Forkable" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Forkable
[![RepoPilot: Forkable](https://repopilot.app/api/badge/ebookfoundation/free-programming-books?axis=fork)](https://repopilot.app/r/ebookfoundation/free-programming-books)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card

This card auto-renders when someone shares https://repopilot.app/r/ebookfoundation/free-programming-books on X, Slack, or LinkedIn.

Ask AI about ebookfoundation/free-programming-books

Grounded in the actual source code. Pick a starter question or write your own.

Or write your own question

Onboarding doc

Onboarding: EbookFoundation/free-programming-books

Generated by RepoPilot · 2026-08-03 · Source

Verdict

Mixed — Mixed signals — read the receipts

  • Last commit 2d ago
  • 79+ active contributors
  • Distributed ownership (top contributor 6% of recent commits)
  • CC-BY-4.0 licensed
  • CI configured
  • ⚠ Non-standard license (CC-BY-4.0) — review terms
  • ⚠ No tests detected in the complete Git tree
  • ⚠ Scorecard: default branch unprotected (0/10)

Computed from maintenance signals — commit recency, contributor breadth, bus factor, license, CI, tests, cross-checked against OpenSSF Scorecard

TL;DR

A curated, community-maintained catalog of free programming books and learning resources organized by language (40+ languages) and topic, published as both Markdown files in the books/ directory and served via a dynamic search interface at ebookfoundation.github.io. It aggregates freely available books, tutorials, and educational materials from across the web with working links and minimal curation to ensure quality. Flat structure: books/ directory contains 40+ language-specific markdown files (free-programming-books-{lang-code}.md) structured as categories → book lists with title, author, and URL; parallel casts/ directory mirrors this for podcasts/screencasts. _config.yml configures Jekyll for GitHub Pages hosting, and _includes/head-custom.html provides custom styling. No monorepo or application code—pure content organized by language code.

LLM-derived; treat as a starting point, not verified fact.

Who it's for

Self-taught programmers, students, educators, and developers in non-English speaking countries who want free, vetted learning materials in their native language; also contributors who add, verify, and maintain book listings across language communities.

LLM-derived; treat as a starting point, not verified fact.

Maturity & risk

Highly mature and community-driven: 50k+ stars on GitHub, originating from a 2011 StackOverflow post, with active global contribution across 40+ language files (free-programming-books-{lang}.md). The project shows sustained maintenance with regular PR merges, but exact commit recency and test coverage are not visible from the provided metadata—typical for a curated content repo rather than software library.

Standard open source risks apply.

LLM-derived; treat as a starting point, not verified fact.

Active areas of work

Active community contribution visible through Hacktoberfest 2025 stats badge and continuous PR merging for new book additions and URL updates across language files. The project is in steady-state maintenance mode: accepting contributions to existing language files, occasionally adding new languages, and keeping the dynamic search site (separate repository) synchronized.

LLM-derived; treat as a starting point, not verified fact.

Get running

Clone the repository: git clone https://github.com/EbookFoundation/free-programming-books.git then cd free-programming-books. No build or installation step required—content is plain markdown. To preview the Jekyll site locally: bundle install && bundle exec jekyll serve (requires Ruby/Jekyll installed). Edit markdown files directly and test by viewing changes in your text editor or via the Jekyll preview.

Daily commands: To run the Jekyll preview locally: cd free-programming-books && bundle install && bundle exec jekyll serve --livereload. Site will be available at http://localhost:4000. To validate markdown syntax without serving: use any markdown linter. No runtime dependencies, build process, or environment variables required.

Map of the codebase

  • README.md — Primary entry point documenting the project's mission, structure, and contribution guidelines for all languages and content types.
  • books/free-programming-books-en.md — Canonical English reference file establishing the markdown structure, categorization schema, and link format that all other language variants must follow.
  • books/free-programming-books-langs.md — Master index listing all supported languages and their corresponding file mappings, essential for navigation and language discovery.
  • books/free-programming-books-subjects.md — Subject-based organization file providing cross-language topic indexing and discovery mechanism for learners.
  • _config.yml — Jekyll configuration file controlling site build, theme, and deployment settings for GitHub Pages hosting.
  • books/free-programming-books-zh.md — Demonstrates multi-byte language support and serves as template for non-Latin script implementations.

Components & responsibilities

  • Language-specific book lists (Markdown) — Each free-programming-books-[lang].md file maintains curated, categorized book links for one language.
    • Failure mode: Broken links, outdated resources, or inconsistent formatting reduces discoverability and trust.
  • Language index (langs.md) (Markdown with structured reference links) — Master registry mapping language codes to book/course/cast files for navigation.
    • Failure mode: Missing or incorrect language mappings prevent users from finding content in their language.
  • Subject index (subjects.md) (Markdown link aggregation) — Cross-language topic organization enabling discovery by programming skill/domain rather than language.
    • Failure mode: Stale or incomplete subject categorization reduces accessibility for topic-focused learners.
  • Jekyll/GitHub Pages build pipeline (Jekyll, GitHub Actions, GitHub Pages) — Renders markdown to static HTML and deploys to web via GitHub Pages automation.
    • Failure mode: Build failures or misconfigurations prevent site updates; no fallback rendering mechanism.
  • External search engine (Separate search implementation (not in this repo)) — Separate ebookfoundation search site indexes and provides full-text query over markdown content.
    • Failure mode: Search unavailable; users must browse static site or language indexes.
  • Course and podcast catalogs (Markdown) — Parallel free-courses-[lang].md and free-podcasts-screencasts-[lang].md files organizing educational media.
    • Failure mode: Outdated or broken media links reduce value for learners seeking alternative content formats.

Data flow

  • Contributor via GitHubbooks/free-programming-books-[lang].md — Pull requests add or update book entries and links.
  • Markdown content filesJekyll build process — Jekyll parses all markdown and converts to HTML during site generation.
  • Static HTML outputGitHub Pages CDN — Rendered HTML deployed globally via GitHub Pages for low-latency access.
  • GitHub Pages HTMLExternal search indexer — Separate search service crawls and indexes site content for query fulfillment.
  • User queriesebookfoundation search site — Users search by language, subject, or keyword via the dedicated search interface.

How to make changes

Add a New Programming Book to English List

  1. Open the English books file for editing (books/free-programming-books-en.md)
  2. Find the appropriate subject category (e.g., Web Development, Machine Learning) or create one following the existing markdown header format (### Category Name) (books/free-programming-books-en.md)
  3. Add a new link entry following the pattern: * Book Title - Brief description (Author if known) (books/free-programming-books-en.md)
  4. Verify the link is active and book is genuinely free before submitting a pull request (books/free-programming-books-en.md)

Translate Books List to a New Language

  1. Copy the English books file to a new language variant file (e.g., free-programming-books-pt.md for Portuguese) (books/free-programming-books-en.md)
  2. Translate all category headers, descriptions, and metadata while preserving link URLs (books/free-programming-books-[lang].md)
  3. Add new language entry to the master language index file (books/free-programming-books-langs.md)
  4. Submit pull request with new language variant following contribution guidelines from README (README.md)

Add a New Course Resource

  1. Open the appropriate language courses file (or create if missing) (courses/free-courses-en.md)
  2. Locate the subject category or add new category header following markdown conventions (courses/free-courses-en.md)
  3. Append course entry with title, URL, and brief description in list format (courses/free-courses-en.md)
  4. Verify course is currently free and active before submitting contribution (courses/free-courses-en.md)

Why these technologies

  • Markdown (.md files) — Human-readable, version-control friendly format enabling decentralized contributions via Git/GitHub.
  • Jekyll + GitHub Pages — Zero-cost hosting, automatic builds from markdown, familiar workflow for open-source contributors.
  • Git/GitHub — Enables collaborative curation, change tracking, and community contributions at scale across 50+ languages.
  • Static site generation — No backend required; eliminates scalability concerns and security surface for a read-heavy resource directory.

Trade-offs already made

  • Markdown-based content instead of database

    • Why: Simplicity and decentralized editing workflow via GitHub PRs
    • Consequence: Limited dynamic search/filtering (offloaded to separate search site), manual content synchronization across languages.
  • Language-specific files rather than single polyglot file

    • Why: Easier translation management and independent language community ownership
    • Consequence: Content duplication; must maintain consistency across 50+ files manually.
  • GitHub-hosted static content without backend APIs

    • Why: Eliminates infrastructure costs and complexity
    • Consequence: Search functionality requires separate external implementation (ebookfoundation.github.io/search).

Non-goals (don't propose these)

  • Does not provide real-time content moderation or automated link validation.
  • Does not include user authentication, preferences, or personalization.
  • Does not host book files directly; only curates and links to external resources.
  • Not designed for automated content ingestion; curation is manual and community-driven.
  • Does not track download statistics or usage metrics per resource.

Code metrics

  • Avg cyclomatic complexity: ~2 — Repo is primarily static content curation with no algorithmic complexity; structure is flat directory of markdown files with simple Jekyll templating.
  • Largest file: books/free-programming-books-en.md (3,500 lines)
  • Estimated quality issues: ~4 — No code per se; issues are content consistency (duplicate links, broken URLs, inconsistent formatting across language variants) and process gaps (no automated validation).

Anti-patterns to avoid

  • Inconsistent link format across languages (Medium)books/free-programming-books-*.md (multiple files): Some language variants use different markdown link syntax or list formatting, making cross-language tooling fragile.
  • Duplicate content across 50+ language files (High)books/ and courses/ and casts/ directories: Maintaining synchronized content updates across all language variants is error-prone; changes in English may not propagate.
  • No automated link validation in CI (Medium)Repository (missing step): Dead or redirected links can accumulate since contributions are not checked for URL viability before merge.
  • Manual language index maintenance (Low)books/free-programming-books-langs.md: New language files must be manually registered in langs.md; missing or stale entries prevent discoverability.

Performance hotspots

  • GitHub PR review process (Manual review bottleneck) — All contributions require human review; no automated quality gates for link validity, formatting, or duplication.
  • Content duplication across 50+ language files (Synchronization overhead) — Updates to structure or shared entries must be replicated manually in every language variant.
  • Search functionality (external) (Feature decomposition) — Search relies on a separate external implementation; this repo has no native indexing or query capability.
  • Markdown parsing and rendering (Build time scaling) — Jekyll build processes all markdown; large repo growth (current 244 files) may slow site regeneration.

Traps & gotchas

No hidden technical traps typical of a content repository. Main gotchas: (1) Link verification is manual—no automated CI checks for URL liveness, so broken links persist until caught by contributors; (2) Language code inconsistencies: some use ISO 639-1 codes (en, fr), others use regional variants (pt_BR, zh) with underscores, requiring careful naming when adding new languages; (3) Markdown formatting must be strict for Jekyll rendering and search indexing—inconsistent spacing in [Title](url) - Author format breaks parsing; (4) No central schema validation, so book entries can drift in format across different language files unless manually reviewed.

Architecture

Concepts to learn

  • Markdown-as-Source-of-Truth — In this repo, plain markdown files are both the primary data store and publication source; understanding how markdown structure directly maps to Jekyll HTML output and search indexing is critical for maintaining consistency
  • Static Site Generation (SSG) / Jekyll — The repo uses Jekyll to transform markdown into a static HTML site hosted on GitHub Pages with no runtime server; this is why contributions are pull requests on markdown files, not database inserts
  • Language Localization via File Naming Convention — Multilingual content is organized using ISO 639 language codes and regional suffixes (pt_BR vs pt_PT) embedded in filenames rather than a unified database; maintaining this pattern is essential when adding new languages
  • Link Rot & Content Decay — A curated links catalog naturally decays as external resources move or disappear; understanding this problem and the manual effort required to maintain it is why community contribution is essential to this project's longevity
  • Community Curation vs Algorithmic Indexing — This project relies on human reviewers to validate books are free and quality, not automated crawling; this creates bottlenecks but ensures higher signal-to-noise ratio than algorithmic search engines
  • Hacktoberfest Community Events — The repo uses Hacktoberfest stats badges to encourage October contribution surges; understanding how seasonal events drive spikes in community maintenance is relevant to onboarding and release timing
  • GitHub Pages Publishing Pipeline — Changes to the books/ markdown files automatically trigger Jekyll rebuild and publish to ebookfoundation.github.io; this means PRs are the only deployment mechanism and there is no staging environment for testing
  • EbookFoundation/free-programming-books-search — Official companion repo providing the dynamic full-text search interface for this book catalog; indexes and serves the markdown content with JavaScript frontend
  • awesome-selfhosted/awesome-selfhosted — Similar community-curated list format for self-hosted software alternatives; demonstrates same content-first, link-aggregation approach applied to infrastructure tools
  • sindresorhus/awesome — Parent list of curated GitHub awesome lists; establishes the 'awesome list' format and community standards that free-programming-books follows and references
  • github/gitignore — Parallel large-scale, community-maintained GitHub reference repo with 100k+ stars; demonstrates how GitHub excels at distributed curation of content, not code
  • torvalds/linux — Historical predecessor: the free-programming-books project itself originated as a clone of a StackOverflow answer and grew into an independent reference, mirroring how open-source communities evolve knowledge assets

PR ideas

Click to expand

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add validation script to check for broken links and malformed markdown across all book files

The repo contains 50+ markdown files with hundreds of book entries, each with URLs and metadata. Currently there's no automated validation to catch broken links, missing descriptions, or formatting inconsistencies. This would prevent low-quality contributions and ensure all resources are actually accessible.

  • [ ] Create a new Node.js/Python script in a scripts/ directory to parse all books/, casts/, and courses/ markdown files
  • [ ] Implement URL validation (HEAD requests with timeout handling) to detect 404s and redirects
  • [ ] Check for markdown formatting consistency (missing titles, descriptions, or proper link syntax)
  • [ ] Add a GitHub Actions workflow (e.g., .github/workflows/validate-links.yml) to run this script on PRs
  • [ ] Document the script usage in CONTRIBUTING.md with examples of how to run it locally

Create a metadata schema and add front-matter validation for language-specific book files

Each books/free-programming-books-XX.md file has implicit conventions (language code in filename, structure) but no explicit schema or validation. Adding structured validation with language code verification would catch typos in locale codes (e.g., pt_BR vs pt-BR) and ensure consistency across all 50+ files.

  • [ ] Define a JSON schema file (e.g., scripts/schema/book-file-schema.json) specifying expected structure, language code patterns, and required metadata
  • [ ] Create a validation script that checks each book file's language code matches its filename
  • [ ] Verify all language codes in filenames match ISO 639-1 or IANA language tag standards
  • [ ] Add pre-commit hook documentation or GitHub Actions workflow to enforce this on PRs
  • [ ] Run validation against existing files and create an issue to fix any non-compliant files found

Add a GitHub Actions workflow to detect duplicate book entries across all language files

With 50+ language-specific files and thousands of book entries, duplicate submissions (same book URL appearing multiple times) are likely but hard to catch manually. An automated duplicate detection workflow would improve data quality and prevent maintenance burden.

  • [ ] Create a workflow file (.github/workflows/check-duplicates.yml) that triggers on PR events
  • [ ] Write a script that extracts all URLs from all book/cast/course files and compares them using a hash set
  • [ ] Flag duplicate URLs with a report showing which files contain the duplicates and line numbers
  • [ ] Post results as a PR comment to help contributors identify and remove duplicates before merge
  • [ ] Document this check in CONTRIBUTING.md so contributors understand the validation

Good first issues

  • Verify and fix dead links in one language file: Pick books/free-programming-books-{language}.md, test 10–20 book URLs, and submit a PR removing or updating broken links with working alternatives. Low barrier, high impact for maintainability.
  • Standardize author attribution format: Some entries use - [Title](url) without author, others use - [Title](url) - Author. Pick a language file and audit, then propose a consistent format PR with examples of before/after consistency.
  • Add missing language to free-programming-books-langs.md index: Check if a new language file exists (e.g., free-programming-books-it.md) but is not listed in the master langs.md registry, then add it with a PR. One-line contribution with quick win.

Top contributors

Click to expand

Recent commits

Click to expand
  • a032f45 — Add The Agentic AI Hub to Artificial Intelligence (#13383) (idoshamun)
  • 30f7d7c — Add Software Architecture in the AI & Cloud Era (Software Architecture) (#13382) (oleksiyp)
  • dc1da4a — Add free Spanish programming courses (Certmundo) (#13380) (guilhermecarlos)
  • 2a0e856 — Add Vim Book (#13378) (aylar-ghezelbash)
  • 7bf8388 — Add Python & Data Analysis Course to Python courses (#13371) (abderrahim-lectures)
  • 281dfc4 — fix: upgrade http:// to https:// in README (#13365) (hanu-14)
  • f916b4a — Add Java Standard (Wikibooks) to German list (#13363) (JulianGStudium)
  • f170148 — Add Software Engineering — The Easy Way to Software Engineering courses (#13362) (thetpmguy)
  • b259f09 — Add TheCodeForge to DevOps courses (#13353) (tracedynamics)
  • aea7df4 — Fix dead cheatsheet links with Wayback Machine archives (#13350) (1022khr-ux)

Security observations

Click to expand

The codebase is a static documentation repository (free programming books list) with minimal attack surface. No dynamic code execution, backend services, or dependencies are present. Primary concerns are external resource loading and missing security headers for the GitHub Pages deployment. The repository follows good practices by using Markdown files for content distribution without executable code or user input handling. Recommended improvements focus on hardening the web deployment layer rather than code-level vulnerabilities.

  • Low · Potential XSS via External CDN Resources — README.md, _includes/head-custom.html. The README references external CDN resources (cdn.rawgit.com) for badge images and styling. While these are third-party CDNs, relying on external resources could introduce risks if the CDN is compromised or if subresource integrity is not verified. Fix: Implement Subresource Integrity (SRI) hashes for all external CDN resources. Consider self-hosting critical assets or using trusted CDNs with SRI verification enabled.
  • Low · Missing Security Headers Configuration — _config.yml. The Jekyll configuration (_config.yml) does not show explicit security headers (Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, etc.) that should be set for the hosted GitHub Pages site. Fix: Add security headers configuration to the Jekyll build. For GitHub Pages, consider using a _headers file or configuring headers through repository settings. Include CSP, X-Frame-Options, X-Content-Type-Options, and HSTS headers.
  • Low · No Content Security Policy Visible — _includes/head-custom.html. No explicit Content Security Policy is configured in the head template or Jekyll configuration, which could allow injection attacks if user-generated content or dynamic content is ever added. Fix: Implement a strict Content Security Policy header that restricts inline scripts, external script sources, and other potentially dangerous content execution.

LLM-derived; treat as a starting point, not a security audit.

The exported doc (Copy CLAUDE.md / Download / .cursor/rules) also includes an agent protocol and a verification script written for AI coding agents — omitted here to keep this view scannable.

Embed this chat in your README

Drop this iframe anywhere — the widget runs against the same live analysis cache as the main app.

<iframe
  src="https://repopilot.app/embed/ebookfoundation/free-programming-books"
  width="100%" height="500"
  style="border:1px solid #d0d7de; border-radius:8px;"
  allow="microphone"
  loading="lazy"
></iframe>