{"id":24648568,"url":"https://github.com/archlinux/archmanweb","last_synced_at":"2026-03-08T05:31:12.605Z","repository":{"id":55749821,"uuid":"101469880","full_name":"archlinux/archmanweb","owner":"archlinux","description":"Codebase for the Arch manual pages repository (read-only mirror)","archived":false,"fork":false,"pushed_at":"2023-03-11T22:04:07.000Z","size":314,"stargazers_count":27,"open_issues_count":6,"forks_count":11,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-11-12T06:05:23.007Z","etag":null,"topics":["manpages","repository","website"],"latest_commit_sha":null,"homepage":"https://gitlab.archlinux.org/archlinux/archmanweb","language":"Python","has_issues":false,"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/archlinux.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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}},"created_at":"2017-08-26T07:16:17.000Z","updated_at":"2025-08-23T14:44:44.000Z","dependencies_parsed_at":"2025-06-28T06:06:43.560Z","dependency_job_id":"1cfab84d-4320-4f83-90ac-3a8025b360f9","html_url":"https://github.com/archlinux/archmanweb","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/archlinux/archmanweb","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/archlinux%2Farchmanweb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/archlinux%2Farchmanweb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/archlinux%2Farchmanweb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/archlinux%2Farchmanweb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/archlinux","download_url":"https://codeload.github.com/archlinux/archmanweb/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/archlinux%2Farchmanweb/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30246724,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-08T00:58:18.660Z","status":"online","status_checked_at":"2026-03-08T02:00:06.215Z","response_time":56,"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":["manpages","repository","website"],"created_at":"2025-01-25T16:55:02.189Z","updated_at":"2026-03-08T05:31:12.573Z","avatar_url":"https://github.com/archlinux.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Arch manual pages\n\n## Git submodules\n\nMake sure that git submodules are initialized after cloning the repository:\n\n    git submodule update --init --recursive\n\nOr initialize the submodules while cloning:\n\n    git clone --recurse-submodules ssh://git@gitlab.archlinux.org:222/archlinux/archmanweb.git\n\n## Dependencies\n\n    pacman -S pyalpm python-chardet python-django python-django-csp python-psycopg2 python-requests python-xtarfile\n\n## Installation\n\n1. Copy `local_settings.py.example` to `local_settings.py` and edit `DEBUG = True` and the `SECRET_KEY` variable.\n\n2. Configure a connection to a [PostgreSQL](https://wiki.archlinux.org/index.php/PostgreSQL) database\n   in the [Django database settings](https://docs.djangoproject.com/en/3.1/ref/settings/#databases)\n   in the `local_settings.py` file.\n\n3. Make sure that the [pg_trgm](https://www.postgresql.org/docs/current/pgtrgm.html)\n   extension is [created](https://www.postgresql.org/docs/current/sql-createextension.html)\n   in the database. For example:\n\n        psql --username=\u003cusername\u003e --dbname=\u003cdbname\u003e --command \"create extension if not exists pg_trgm;\"\n\n4. Make migrations.\n\n        ./manage.py makemigrations\n\n5. Migrate changes.\n\n        ./manage.py migrate\n\n6. Build the [archlinux-common-style](https://gitlab.archlinux.org/archlinux/archlinux-common-style)\n   submodule.\n\n   A SASS compiler is needed. For example, install [sassc](https://archlinux.org/packages/community/x86_64/sassc/)\n   and run\n\n        cd archlinux-common-style\n        make SASS=sassc\n\n7. Start the development web server with `./manage.py runserver`. The site\n   should be available at http://localhost:8000, saying that there are 0 man\n   pages and 0 packages (because they were not imported yet). The server will\n   automatically reload when you make changes to the webapp code or templates.\n\n8. Run the `update.py` script to import some man pages. However, note that the\n   full import requires to download about 7.5 GiB of packages from a mirror of\n   the Arch repos and then the extraction takes about 20-30 minutes. (The volume\n   of all man pages is less than 300 MiB though.) If you won't need all man pages\n   for the development, you can run e.g. `update.py --only-repos core` to import\n   only man pages from the core repository (the smallest one, download size is\n   about 160 MiB) or even `update.py --only-packages coreutils man-pages`.\n\n## About\n\nThis website was created for the [man template](https://wiki.archlinux.org/index.php/Template:Man)\non the Arch wiki. Originally, the template replaced plain text, unclickable\nreferences to man pages with links to [man7.org](https://man7.org/linux/man-pages/),\nwhich contains a handful of manuals taken directly from upstream. Later, we\nconsidered switching to another site providing more manuals. Since we did not\nfind a suitable external site, we decided to build a new service to satisfy all\nour requirements:\n\n1. All man pages from official Arch packages are available. Old versions and\n   permalinks are not necessary.\n2. Functionality does not require Javascript.\n3. Pages are addressable by their name and section, both occurring exactly once\n   in the URL to avoid problems with pages such as\n   [ar(1)](https://man.archlinux.org/man/ar.1) and\n   [ar(1p)](https://man.archlinux.org/man/ar.1p).\n4. The URLs used by the _man_ template should not redirect to permalinks,\n   otherwise users would start copy-pasting them to the wiki and it would be\n   hard to check if they are the same as the canonical URLs.\n5. Human-readable subsection anchors.\n6. The page should clearly indicate the Arch package version containing the\n   page.\n\nSee the [original discussion](https://wiki.archlinux.org/index.php/Template_talk:Man#Sources)\nfor details.\n\nWe used a dynamic approach instead of building a website consisting of\ncompletely static pages. The main building blocks are the\n[Django web framework](https://www.djangoproject.com/), the\n[PostgreSQL](https://www.postgresql.org/) database server, the `mandoc` tool\nfrom the [mandoc toolset](http://mdocml.bsd.lv/) for the conversion to HTML and\nthe [pyalpm](https://github.com/archlinux/pyalpm) library for data extraction\nfrom the Arch repositories. The code is available in the\n[archmanweb](https://gitlab.archlinux.org/archlinux/archmanweb) repository at\nGitLab.\n\nOverall, this approach allows us to provide the following features without\nrebuilding the whole website from scratch:\n\n- Listings with custom filters and orderings.\n- Links to other versions of the same manual provided by different packages.\n- Links to similar manuals available in other sections or languages.\n- Searching in the names and descriptions of packages and manuals, similarly to\n  [apropos(1)](https://man.archlinux.org/man/apropos.1).\n\n### Similar projects\n\nSome similar projects, each using a different approach, are:\n\n- [manned.org](https://manned.org/) ([code](https://g.blicky.net/manned.git/),\n  [Arch BBS thread](https://bbs.archlinux.org/viewtopic.php?id=145382))\n- [man7.org](http://man7.org/linux/man-pages/) (no idea about website scripts)\n- [manpages.debian.org](https://manpages.debian.org/)\n  ([source](https://github.com/Debian/debiman/))\n- [man.openbsd.org](http://man.openbsd.org/) (runs with the mandoc CGI script)\n\n## Test cases\n\nThese links serve as test cases to ensure that all features still work, they\nare not useful to regular users.\n\n### URLs with dots\n\n- \u003ca href=\"https://man.archlinux.org/man/intro\"\u003eintro\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/intro.1\"\u003eintro.1\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/intro.1.en\"\u003eintro.1.en\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/intro.en\"\u003eintro.en\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/systemd.service\"\u003esystemd.service\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/systemd.service.5\"\u003esystemd.service.5\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/systemd.service.5.en\"\u003esystemd.service.5.en\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/systemd.service.en\"\u003esystemd.service.en\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/gimp-2.8\"\u003egimp-2.8\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/gimp-2.8.1\"\u003egimp-2.8.1\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/gimp-2.8.1.en\"\u003egimp-2.8.1.en\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/gimp-2.8.en\"\u003egimp-2.8.en\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/CA.pl\"\u003eCA.pl\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/CA.pl.1ssl\"\u003eCA.pl.1ssl\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/CA.pl.1ssl.en\"\u003eCA.pl.1ssl.en\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/CA.pl.en\"\u003eCA.pl.en\u003c/a\u003e\n\n### Best match lookup\n\nAmbiguous cases are ordered by section, package repository and package version,\nthen the first manual is selected.\n\n- \u003ca href=\"https://man.archlinux.org/man/mount\"\u003emount\u003c/a\u003e redirects to\n  \u003ca href=\"https://man.archlinux.org/man/mount.8\"\u003emount.8\u003c/a\u003e\n  (not \u003ca href=\"https://man.archlinux.org/man/mount.2\"\u003emount.2\u003c/a\u003e)\n- \u003ca href=\"https://man.archlinux.org/man/gv\"\u003egv\u003c/a\u003e redirects to\n  \u003ca href=\"https://man.archlinux.org/man/gv.1\"\u003egv.1\u003c/a\u003e\n  (not \u003ca href=\"https://man.archlinux.org/man/gv.3guile\"\u003egv.3guile\u003c/a\u003e,\n  \u003ca href=\"https://man.archlinux.org/man/gv.3lua\"\u003egv.3lua\u003c/a\u003e etc.)\n- \u003ca href=\"https://man.archlinux.org/man/graphviz/gv\"\u003egraphviz/gv\u003c/a\u003e redirects to\n  \u003ca href=\"https://man.archlinux.org/man/graphviz/gv.3guile\"\u003egraphviz/gv.3guile\u003c/a\u003e\n  (not \u003ca href=\"https://man.archlinux.org/man/graphviz/gv.3lua\"\u003egraphviz/gv.3lua\u003c/a\u003e etc.)\n- \u003ca href=\"https://man.archlinux.org/man/gv.3\"\u003egv.3\u003c/a\u003e redirects to\n  \u003ca href=\"https://man.archlinux.org/man/gv.3guile\"\u003egv.3guile\u003c/a\u003e\n  (not \u003ca href=\"https://man.archlinux.org/man/gv.1\"\u003egv.1\u003c/a\u003e,\n  \u003ca href=\"https://man.archlinux.org/man/gv.3lua\"\u003egv.3lua\u003c/a\u003e etc.)\n- \u003ca href=\"https://man.archlinux.org/man/aliases.5\"\u003ealiases.5\u003c/a\u003e displays\n  \u003ca href=\"https://man.archlinux.org/man/extra/postfix/aliases.5\"\u003eextra/postfix/aliases.5\u003c/a\u003e\n  (not \u003ca href=\"https://man.archlinux.org/man/community/opensmtpd/aliases.5\"\u003ecommunity/opensmtpd/aliases.5\u003c/a\u003e)\n- \u003ca href=\"https://man.archlinux.org/man/mysqld.8\"\u003emysqld.8\u003c/a\u003e displays\n  \u003ca href=\"https://man.archlinux.org/man/extra/mariadb/mysqld.8\"\u003eextra/mariadb/mysqld.8\u003c/a\u003e\n  (not \u003ca href=\"https://man.archlinux.org/man/community/percona-server/mysqld.8\"\u003ecommunity/percona-server/mysqld.8\u003c/a\u003e)\n- \u003ca href=\"https://man.archlinux.org/man/mailx\"\u003emailx\u003c/a\u003e and\n  \u003ca href=\"https://man.archlinux.org/man/mailx.1\"\u003emailx.1\u003c/a\u003e redirect to\n  \u003ca href=\"https://man.archlinux.org/man/mail.1.en\"\u003email.1.en\u003c/a\u003e as a symbolic link\n  (not \u003ca href=\"https://man.archlinux.org/man/mailx.1p\"\u003emailx.1p\u003c/a\u003e)\n\n### Language fallback\n\n- \u003ca href=\"https://man.archlinux.org/man/nvidia-smi.cs\"\u003envidia-smi.cs\u003c/a\u003e \u0026rarr;\n  \u003ca href=\"https://man.archlinux.org/man/nvidia-smi.en\"\u003envidia-smi.en\u003c/a\u003e \u0026rarr;\n  \u003ca href=\"https://man.archlinux.org/man/nvidia-smi.1.en\"\u003envidia-smi.1.en\u003c/a\u003e\n  (maybe we should try harder and avoid the double redirect)\n- \u003ca href=\"https://man.archlinux.org/man/nvidia-smi.1.cs\"\u003envidia-smi.1.cs\u003c/a\u003e \u0026rarr;\n  \u003ca href=\"https://man.archlinux.org/man/nvidia-smi.1.en\"\u003envidia-smi.1.en\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/nvidia-smi.foo\"\u003envidia-smi.foo\u003c/a\u003e \u0026rarr; 404\n- \u003ca href=\"https://man.archlinux.org/man/nvidia-smi.1.foo\"\u003envidia-smi.1.foo\u003c/a\u003e \u0026rarr; 404\n\n### Package filter\n\n- \u003ca href=\"https://man.archlinux.org/man/nvidia-utils/nvidia-smi.en\"\u003envidia-utils/nvidia-smi.en\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/nvidia-340xx-utils/nvidia-smi.en\"\u003envidia-340xx-utils/nvidia-smi.en\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/nvidia-utils/nvidia-smi.cs\"\u003envidia-utils/nvidia-smi.cs\u003c/a\u003e \u0026rarr;\n  \u003ca href=\"https://man.archlinux.org/man/nvidia-utils/nvidia-smi.en\"\u003envidia-utils/nvidia-smi.en\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/nvidia-340xx-utils/nvidia-smi.cs\"\u003envidia-340xx-utils/nvidia-smi.cs\u003c/a\u003e \u0026rarr;\n  \u003ca href=\"https://man.archlinux.org/man/nvidia-340xx-utils/nvidia-smi.cs\"\u003envidia-utils/nvidia-340xx-smi.en\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/foo/nvidia-smi.cs\"\u003efoo/nvidia-smi.cs\u003c/a\u003e \u0026rarr; 404\n- \u003ca href=\"https://man.archlinux.org/man/foo/nvidia-smi.en\"\u003efoo/nvidia-smi.en\u003c/a\u003e \u0026rarr; 404\n\n### .so macros\n\nThere is a \u003ca href=\"https://man.archlinux.org/man/groff.1\"\u003egroff(1)\u003c/a\u003e extension for the\n\u003ca href=\"https://man.archlinux.org/man/man.7\"\u003eman(7)\u003c/a\u003e and\n\u003ca href=\"https://man.archlinux.org/man/mdoc.7\"\u003emdoc(7)\u003c/a\u003e\nlanguages to include contents of other files using the `.so` macro. In normal\noperation where manuals are stored as files on a file system, the\n\u003ca href=\"https://man.archlinux.org/man/soelim.1\"\u003esoelim(1)\u003c/a\u003e\npre-processor handles the inclusion. Our system is based on a database rather\nthan a file system, so we need a custom `soelim` as well.\n\nSome pages which contain the `.so` macro:\n\n- \u003ca href=\"https://man.archlinux.org/man/[.1.zh_CN\"\u003e[.1.zh_CN\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/pwunconv.8\"\u003epwunconv(8)\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/pam.8\"\u003epam(8)\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/url.7\"\u003eurl(7)\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/xorg.conf.d.5\"\u003exorg.conf.d(5)\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/glibc.7\"\u003eglibc(7)\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/systemd-logind.8\"\u003esystemd-logind(8)\u003c/a\u003e\n- \u003ca href=\"https://man.archlinux.org/man/shorewall6.conf.5\"\u003eshorewall6.conf(5)\u003c/a\u003e\n  points to a page contained in a different package (`shorewall` instead of `shorewall6`)\n- \u003ca href=\"https://man.archlinux.org/man/lsof.8\"\u003elsof(8)\u003c/a\u003e\n  (not a \"hardlink\", includes an invalid file `./00DIALECTS`)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farchlinux%2Farchmanweb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farchlinux%2Farchmanweb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farchlinux%2Farchmanweb/lists"}