{"id":43547098,"url":"https://github.com/openstax/openstax-cms","last_synced_at":"2026-06-14T22:01:39.063Z","repository":{"id":2674315,"uuid":"45121064","full_name":"openstax/openstax-cms","owner":"openstax","description":"The OpenStax CMS, built using Wagtail on top of Django.","archived":false,"fork":false,"pushed_at":"2026-06-12T20:42:07.000Z","size":11874,"stargazers_count":110,"open_issues_count":12,"forks_count":18,"subscribers_count":27,"default_branch":"main","last_synced_at":"2026-06-12T22:22:23.763Z","etag":null,"topics":["django","hacktoberfest","python","wagtail"],"latest_commit_sha":null,"homepage":"https://openstax.org","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/openstax.png","metadata":{"files":{"readme":"README.md","changelog":"news/__init__.py","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2015-10-28T15:13:14.000Z","updated_at":"2026-06-11T00:52:05.000Z","dependencies_parsed_at":"2023-10-31T17:33:04.797Z","dependency_job_id":"98160446-920c-4263-bc7a-b48db6ddbe69","html_url":"https://github.com/openstax/openstax-cms","commit_stats":null,"previous_names":[],"tags_count":332,"template":false,"template_full_name":null,"purl":"pkg:github/openstax/openstax-cms","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openstax%2Fopenstax-cms","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openstax%2Fopenstax-cms/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openstax%2Fopenstax-cms/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openstax%2Fopenstax-cms/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openstax","download_url":"https://codeload.github.com/openstax/openstax-cms/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openstax%2Fopenstax-cms/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34339195,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-14T02:00:07.365Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["django","hacktoberfest","python","wagtail"],"created_at":"2026-02-03T19:01:00.478Z","updated_at":"2026-06-14T22:01:39.058Z","avatar_url":"https://github.com/openstax.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![OpenStax](https://img.shields.io/badge/OpenStax-Web-00A6C9?style=for-the-badge\u0026logo=openstax\u0026logoColor=white)](https://openstax.org)\\\n[![codecov](https://codecov.io/gh/openstax/openstax-cms/branch/main/graph/badge.svg?token=hHMb4KUGYC)](https://codecov.io/gh/openstax/openstax-cms)\n[![CI](https://github.com/openstax/openstax-cms/actions/workflows/tests.yml/badge.svg)](https://github.com/openstax/openstax-cms/actions/workflows/tests.yml)\n![](https://codebuild.us-west-2.amazonaws.com/badges?uuid=eyJlbmNyeXB0ZWREYXRhIjoiek9QM293aWxTZkdOZ0kwb00yTlZPaFJqck53RENqMFFaWGNGS2xQZFpEbThaOENrWnFUQmd2cFZIdHJoUkNFekN6Z3ozc2d3MFh6dlBaT29nNVcrM2RBPSIsIml2UGFyYW1ldGVyU3BlYyI6IklqT2p6T3NwT1pHVVVKRU0iLCJtYXRlcmlhbFNldFNlcmlhbCI6MX0%3D\u0026branch=main)\n![](https://img.shields.io/github/v/tag/openstax/openstax-cms?label=latest%20tag)\n\n\nOpenStax CMS\n=======================\n\nBuilt using [Wagtail CMS](http://wagtail.io) on top of [Django Framework](https://www.djangoproject.com). All installation instructions assume you already have [Homebrew](http://brew.sh) installed. If you are not running on MacOSX or a Linux distribution, see the hyperlinks for dependencies.\n\nDependencies\n=======================\n* [PostgreSQL](http://www.postgresql.org) (≥ 13)  \n```bash\nbrew install postgresql\n```\n* [Python](https://www.python.org/) (≥ 3.11)\n* [PIP](https://github.com/pypa/pip)\n```bash\nbrew install python3\n```\n\nInstallation\n=======================\nVerify you have Python ≥ 3.11 installed:  \n```bash\npython --version\npython3 --version\n```\n\nStart PostgreSQL:\n```bash\nbrew services start postgresql\n```\nThis will also make sure PostgreSQL service starts on boot.\n\nCreate a database (this is also a shell script), which is named as `oscms_prodcms`. However, it can be renamed as long as the change is reflected on the appropriate field in `openstax/settings/base.py`:\n```bash\ncreatedb oscms_prodcms\n```\n\nNow we can install the repository. Run the following commands line by line:\n\n```bash\ngit clone https://github.com/openstax/openstax-cms\ncd openstax-cms/\n```\n\nWork inside a virtualenv (recommended — keeps deps off your system Python). With\n[virtualenvwrapper](https://virtualenvwrapper.readthedocs.io):\n\n```bash\nmkvirtualenv openstax-cms   # first time; thereafter: workon openstax-cms\n```\n\nThen install dependencies:\n\n```bash\npip3 install -r requirements/dev.txt\n```\n\nAfter all the modules in requirements are installed, run the migration script:\n\n```bash\npython3 manage.py migrate\n```\n\nIf you've made changes to Django models and need to create a new migration:\n\n```bash\npython3 manage.py makemigrations\n```\n\n**Note:** If you encounter import errors when running `makemigrations`, you may need to create a local settings file first:\n```bash\ncp openstax/settings/local.py.example openstax/settings/local.py\n```\n\nNow, create a superuser. Run the following command and then proceed with the instructions:\n\n```bash\npython3 manage.py createsuperuser\n```\n\nFinally, start the server:\n\n```bash\npython3 manage.py runserver\n```\n\nTesting\n=======================\nTo test OpenStax CMS on a local device, you need to overwrite some settings. This can be streamlined by introducing `local.py` in `openstax/settings/`. Any changes on or additions to `local.py` will overwrite settings. Make copy of `local.py.example` and rename it to `local.py`:\nAlternatively, and maybe more conveniently, use a `.env` file in the project root to set environmental variables.\n\n```bash\ncd openstax/settings/\ncp local.py.example local.py\n```\n\nRun the tests:\n```bash\npython3 manage.py test --settings=openstax.settings.test\n```\n\n## Postman API Testing\nTo test the API, use can request access to the OpenStax Postman account.  \nThe collection is available [here](https://www.postman.com/openstax/workspace/cms/overview).\n\nSQLite Support\n=======================\nSQLite is supported as an alternative to PostgreSQL. In order to switch to SQLite, change the `DATABASES` setting\nin `openstax/settings/base.py` to use `'django.db.backends.sqlite3'`, and set `NAME` to be the full path of your database file, as you would with a regular Django project.\n\nDocker\n=======================\nTo run the CMS in Docker containers:\n\n```bash\ndocker-compose up\n```\n\nThe CMS code directory from your host machine is mounted in the `app` container at `/code`. To drop into a bash terminal in the `app` container:\n\n```bash\ndocker-compose exec -e DJANGO_SETTINGS_MODULE=openstax.settings.docker app bash\n```\n\nThis command has been wrapped in a tiny script:\n\n```bash\n./docker/bash\n```\n\nFrom within the bash shell, you can run the tests:\n\n```bash\npython3 manage.py test --keepdb\n```\n\nor pound on a specific test:\n\n```bash\npython3 manage.py test --keepdb books.tests.BookTests.test_can_create_book\n```\n\nThe `--keepdb` option reuses the test database from run to run so you don't have to wait for it to recreate the database and run the migrations every time.\n\nTo debug tests, you can insert the normal `import pdb; pdb.set_trace()` lines in your code and test runs from the bash environment will show you the debugger.\n\nAPI Endpoints\n=======================\n[View the Wiki Page](https://github.com/openstax/openstax-cms/wiki/API-Endpoints) for the list of all available API endpoints and their descriptions.\n\nDocumentation\n=============\n* [CMS Editing Documentation](https://openstax.atlassian.net/wiki/spaces/BIT/pages/2193391617/CMS+Editing)\n* [CMS Branching and Releases](https://openstax.atlassian.net/wiki/spaces/BIT/pages/2207219713/CMS+Branching+and+Releases)\n* [CMS Pull Requests](https://openstax.atlassian.net/wiki/spaces/BIT/pages/2207252512/CMS+Pull+Requests)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenstax%2Fopenstax-cms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopenstax%2Fopenstax-cms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenstax%2Fopenstax-cms/lists"}