{"id":19794209,"url":"https://github.com/openzim/freecodecamp","last_synced_at":"2025-05-01T02:30:59.057Z","repository":{"id":66279442,"uuid":"593650568","full_name":"openzim/freecodecamp","owner":"openzim","description":"FreeCodeCamp.org scraper (to ZIM)","archived":false,"fork":false,"pushed_at":"2024-02-29T10:40:40.000Z","size":24797,"stargazers_count":4,"open_issues_count":13,"forks_count":2,"subscribers_count":6,"default_branch":"main","last_synced_at":"2024-04-14T11:19:48.116Z","etag":null,"topics":["freecodecamp","offline","scraper","tutorial","zim"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/openzim.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-01-26T14:34:04.000Z","updated_at":"2024-02-29T10:50:43.000Z","dependencies_parsed_at":"2024-02-29T12:53:12.058Z","dependency_job_id":null,"html_url":"https://github.com/openzim/freecodecamp","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openzim%2Ffreecodecamp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openzim%2Ffreecodecamp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openzim%2Ffreecodecamp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openzim%2Ffreecodecamp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openzim","download_url":"https://codeload.github.com/openzim/freecodecamp/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251812307,"owners_count":21647884,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["freecodecamp","offline","scraper","tutorial","zim"],"created_at":"2024-11-12T07:12:31.811Z","updated_at":"2025-05-01T02:30:59.052Z","avatar_url":"https://github.com/openzim.png","language":"Python","readme":"# freeCodeCamp scraper\n\nThis scraper downloads selected [freeCodeCamp](https://www.freecodecamp.org/) courses and puts it in a\n[ZIM](https://openzim.org) file, a clean and user friendly format for storing content for offline usage.\n\n[![CodeFactor](https://www.codefactor.io/repository/github/openzim/freecodecamp/badge)](https://www.codefactor.io/repository/github/openzim/freecodecamp)\n[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)\n[![codecov](https://codecov.io/gh/openzim/freecodecamp/branch/main/graph/badge.svg)](https://codecov.io/gh/openzim/freecodecamp)\n[![PyPI version shields.io](https://img.shields.io/pypi/v/fcc2zim.svg)](https://pypi.org/project/fcc2zim/)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/fcc2zim.svg)](https://pypi.org/project/fcc2zim/)\n[![Docker](https://ghcr-badge.egpl.dev/openzim/freecodecamp/latest_tag?label=docker)](https://ghcr.io/openzim/freecodecamp)\n\n## Architecture\n\nThis project consists of two major components:\n\n- `zimui` - A Vue.JS application specially crafted to:\n  - be embeded inside the ZIM and serve as main entry point (through compilation for offline usage with Vite)\n  - present FCC curriculum, including solving exercices\n  - be compatible with most ZIM readers\n- `scraper` - The Python tool that build FCC ZIM. It is responsible to:\n  - fetch FCC curriculum and package it into a proper format\n  - embed client can read, as well as our zim builder\n\n## Dependencies\n\nAside Node.JS and Python dependencies which are managed, other binary dependencies comes from Python [zimscraperlib](https://github.com/openzim/python-scraperlib/)\n\n## Development\n\nThis project adheres to openZIM's [Contribution Guidelines](https://github.com/openzim/overview/wiki/Contributing).\n\nThis project has implemented openZIM's [Python bootstrap, conventions and policies](https://github.com/openzim/_python-bootstrap/blob/main/docs/Policy.md) **v1.0.3**.\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md).\n\n### Prerequisites\n\n- Node 20.x\n- Python 3.11\n\n### Running scraper locally\n\nYou have to:\n\n- build the `zimui` frontend which will be embededed inside the ZIM (and redo it every time you make modifications to the `zimui`)\n- run the `scraper` to retrieve FCC curriculum and build the ZIM\n\nSample commands:\n\n```\ncd zimui\nyarn install\nyarn build\ncd ../scraper\nhatch run fcc2zim --language eng --course \"regular-expressions,basic-javascript,basic-data-structures,debugging,functional-programming,object-oriented-programming,basic-algorithm-scripting,intermediate-algorithm-scripting,javascript-algorithms-and-data-structures-projects\" --name \"fcc_en_javascript\" --title \"freeCodeCamp Javascript\" --description \"FCC Javascript Courses\"\n```\n\n### Running scraper with Docker\n\nRun from official version (published on GHCR.io) ; ZIM will be available in the `output` sub-folder of current working directory.\n\n```\ndocker run --rm -it -v $(pwd)/output:/output ghcr.io/openzim/freecodecamp:latest fcc2zim --language eng --course \"regular-expressions,basic-javascript,basic-data-structures,debugging,functional-programming,object-oriented-programming,basic-algorithm-scripting,intermediate-algorithm-scripting,javascript-algorithms-and-data-structures-projects\" --name \"fcc_en_javascript\" --title \"freeCodeCamp Javascript\" --description \"FCC Javascript Courses\"\n```\n\n## Course Options and Limitations\n\nCurrently this scraper only supports challenge types 1, 4 and 5 (challenge types can be found in the markdown file describing the challenge). This means courses from `javascript-algorithms-and-data-structures`, `project-euler`, `rosetta-code` and most of `coding-interview-prep` curriculum (frontend projects are type 3 and are not working).\n\nA list of courses is passed to the scraper as a comma seperated list of 'course slugs'.\n\nWhen you pass a course with an unsupported challenge to the scraper, the ZIM will still create but an error message will be displayed instead of the challenge with wrong type.\n\nYou can find a list of course slugs in the [freeCodeCamp curriculum folder](https://github.com/freeCodeCamp/freeCodeCamp/tree/main/curriculum/challenges/english)\n\nIn docker example above, see the `--course` argument : `regular-expressions,basic-javascript,basic-data-structures,debugging,functional-programming,object-oriented-programming,basic-algorithm-scripting,intermediate-algorithm-scripting,javascript-algorithms-and-data-structures-projects`\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenzim%2Ffreecodecamp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopenzim%2Ffreecodecamp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenzim%2Ffreecodecamp/lists"}