The documentation of the PAROL6 desktop robotic arm by Source Robotics: the robot manual (safety, technical data, installation, operation, tools, maintenance, the build guide), the control board manual, the programming guide (concepts, the Python API, the commander software, ROS 2) and the API reference.
Read it at docs.source-robotics.com/PAROL-docs.
The hardware files, the BOM and the control board firmware are in Source-Robotics/PAROL6-Desktop-robot-arm; the Python API in PCrnjak/PAROL6-python-API; the commander software in Source-Robotics/PAROL-commander-software.
docs/ |
the pages: the robot manual at the top level (numbered chapters, build/, appendix/), board/, end-effectors/, gui/, programming/ and reference/ (one tab), support/ |
docs/includes/ |
text shared by pages (glossary, symbols, abbreviations) and the data the reference pages are built from |
docs/includes/generated/ |
written by tools/sync_api.py from the Python API's release tag: api_facts.json, api_release_notes.md. Never edit |
docs/build/bill-of-materials.md, docs/assets/bom/ |
written by tools/sync_bom.py from the robot repository's BOM/BOM.md and its reference images. Never edit |
docs/assets/print_table.webp |
rendered by tools/sync_print_table.py from the robot repository's Print table/Print_table.pdf. Never edit |
versions.yml |
every version fact: the PAROL6 release the site describes, the software versions, the manuals' numbers and revisions |
compatibility.yml |
which control board, firmware, Python API, commander and gripper versions work together |
hooks/ |
versions.py writes the version facts into the pages; api_pages.py builds the Python API reference; llms.py writes the Markdown twin of every page, llms.txt and llms-full.txt |
tools/ |
sync_api.py, sync_bom.py, sync_print_table.py, test_tools.py, root_404.html |
overrides/ |
the theme changes: the older-version banner, the edit/report line, the header's repository card |
The site is built with MkDocs and the Material for MkDocs theme, in the same form as the PAR6, STEPFOC and gripper documentation; the hooks and tools follow the same pattern.
You need Python 3.11 or newer.
git clone https://github.com/Source-Robotics/PAROL-docs.git
cd PAROL-docs
python -m venv .venv
.venv/Scripts/pip install -r requirements.txt # Linux and macOS: .venv/bin/pip
mkdocs serveOpen http://127.0.0.1:8000/PAROL-docs/. The page reloads by itself when you save a file.
Every push and pull request runs python tools/test_tools.py and mkdocs build --strict, which fails on a broken
link or a missing page. Run both before you open a pull request.
The signatures and docstrings of every public method of the Python API's RobotClient, the tool methods, the
registered tools, the error codes, the environment variables and the controller's command line options are read
from the Python API's source at its release tag (software.python_api.tag in versions.yml) by
tools/sync_api.py. The reference pages under docs/reference/python/ place each method with an
<!-- api: name --> marker and add the notes around it by hand; hooks/api_pages.py fills the markers in at
build time. The build fails on a marker naming a method the API does not have, and the tests fail when a public
method appears on no page.
python tools/sync_api.py # write docs/includes/generated/ from software.python_api.tag in versions.yml
python tools/sync_api.py --check # exit 1 if they are out of dateThe tool needs a clone of the Python API repository with its tags, next to this repository or named by
--api PATH / API_DIR, and the network for the release notes (--no-network keeps the file that is there).
The CI build does not run it; the generated files are committed.
docs/build/bill-of-materials.md is the robot repository's BOM/BOM.md, as it is, with its reference images
shown inline: tools/sync_bom.py reads a clone of PAROL6-Desktop-robot-arm (--repo PATH, $PAROL6_DIR, or a
sibling folder), converts the note blocks, copies and scales the images into docs/assets/bom/, and writes a
header naming the commit it copied. A wrong part or a broken link is fixed in the repository's file, then:
python tools/sync_bom.py # rewrite the page and the images from the clone
python tools/sync_bom.py --check # exit 1 if the page is out of dateThe print table on docs/build/printing.md is the owner's sheet as an image: tools/sync_print_table.py renders
Print table/Print_table.pdf of the same repository (exported from PR_EXCEL.xlsx) into docs/assets/print_table.webp,
cropped to the table (needs PyMuPDF and Pillow); the same --repo and --check options. Export the PDF again after
changing the spreadsheet.
tools/build_model.py builds docs/assets/models/parol6/ from the PAROL6 URDFs in urdf/parol6_description/ of a
clone of robot_descriptions (--descriptions PATH, else
../../projects/robot_descriptions; the system Python with trimesh, fast-simplification and numpy, and
gltfpack through npx to compress the files when Node.js is installed), the models the kinematics sheets come
from. The arm comes from parol6_flange.urdf, one GLB per moving link (the script first checks that all six variants
carry the same arm). Each variant gives one tool, tool_<id>.glb: everything wrist_3_link carries, in that
link's frame, with the fingers open. The tools are Flange only, Pneumatic gripper (the default), SSG-48, SSG-48
fin-ray, MSG and MSG soft jaws. In every file the meshes are merged per material and decimated for the web: the
printed parts (the URDF's structure colour) are the nodes named <part>__body, the only ones the reader recolours;
motors, jaws and the aluminium pneumatic gripper keep the model's colours. viewer.json holds the kinematic chain,
the tools and the defaults. The landing and kinematics pages show them in the arm viewer
docs/javascripts/arm-viewer.js (three.js from a CDN, through the import map in overrides/main.html, loaded
only on those pages): turn and zoom, a slider per joint within its limits, the gripper (each tool is fetched the
first time it is chosen) and the colour of the printed parts. Run the script again when the URDFs change.
hooks/llms.py writes, at every build, a Markdown twin of every page next to its HTML (…/index.md), llms.txt
(an index of the twins by tab) and llms-full.txt (every page in one file), with links pinned to the documented release (including when publishing with mike). The "Copy this page as Markdown" button in the page header reads the twin.
The "Last update" date under every page comes from the git-revision-date-localized plugin (the page's last
commit; the CI checks out the whole history for it). The calculator on Drives, ratios and resolution is
docs/javascripts/joint-calculator.js; the diagrams on the pages are Mermaid blocks in the Markdown.
The "Was this page helpful?" widget at the end of every page is configured under extra.analytics.feedback.
With provider: google (the Google Analytics property all the docs sites share, loaded only after the reader
accepts the cookie banner of extra.consent), Material's own integration records the page views and sends each
vote as an event named feedback.
Comments under every page come from Giscus, wired in overrides/partials/comments.html and configured under
extra.comments: all the docs sites share one Discussions home, the hub repository
Source-Robotics/source-robotics.github.io, with one thread per site and page. A page opts out with
comments: false in its front matter (the landing page does).
The print-site plugin (the last plugin in mkdocs.yml) builds one page with every chapter in order, a cover and
a table of contents, at print_page/. hooks/pdf.py prints that page to site/assets/PAROL6-manual.pdf with headless
Chrome when the environment variable DOCS_PDF is set, which the publish workflow does; a local build sets it on
demand (DOCS_PDF=1 mkdocs build). While the hook is on, the page-help line of every page links the PDF.
Each PAROL6 release has its own version of this site, named after the release: 1, ... The version selector in
the site's header switches between them, and a page of an older version says so in a bar at the top. The
versions are built with mike and kept in the gh-pages branch; latest
points at the newest. Version 0, "Old manual (2023 to October 2026)", is the site from before the rebuild,
not a release: it is built from commit 6d29879 with a patch and must never be deployed from main
(tools/old-manual/README.md).
All version facts live in versions.yml, never in a page: docs_version (the PAROL6 release these pages
describe, which is also the name the version is published under), firmware.tag (V + docs_version), the
software versions, and each manual's number, title, revision, status and publication date. hooks/versions.py
writes them into the version box on each document's landing page and into the list of documents on the About
page; a malformed or missing fact stops the build.
- Set
software.python_api.tagandreleasedinversions.yml. - Run
python tools/sync_api.py. If a method was added, the tests now fail until a reference page places it: add the marker and a note. If one was removed, the build fails on its marker: remove it. - Update the programming guide for what changed, using the release notes; give the Programming Guide a new
revision letter in
versions.ymland a line in its Document history ondocs/about.md. - Commit and push to
main.
- Set
docs_versionandfirmware.taginversions.yml; add a row tocompatibility.yml. - Update the pages for what changed; give the manuals new revision letters and document history lines.
- Commit and push to
main. The site publishes the new version,latestmoves to it, and the previous version stays as it was.
.github/workflows/publish.yml publishes on every push to main: the tests, a strict build, then mike deploy
for docs_version with the alias latest. In the repository's Settings, under Pages, the source must be "Deploy
from a branch", branch gh-pages, folder / (root). Never run mkdocs gh-deploy on this repository: it would
overwrite every version mike keeps there.
The root of gh-pages also carries 404.html (source: tools/root_404.html). It forwards addresses from before
the versioning, such as /PAROL-docs/page4/, to the same page under latest/, where the redirects plugin in
mkdocs.yml maps the old page names to the new pages. To preview the published versions locally, with the
version selector, run mike serve.
The site is served at https://docs.source-robotics.com/PAROL-docs/: the organisation's docs domain plus this
repository's name. Never rename this repository (its address would change and GitHub does not forward the old one),
and never add a CNAME file or a custom domain to it (that would take it out of the shared domain).
- Text and images: Creative Commons Attribution-ShareAlike 4.0, see LICENSE. You may copy, adapt and share them, also commercially, if you credit Source Robotics and share your changes under the same license.
- Code: the MIT license. This covers the code examples in the pages and the site's own code (hooks, tools, overrides, scripts), so you can use an example in your own program without other conditions.
- Names and logos: the Source Robotics name, the product names and the logos are not covered by either license. The robot's hardware files, firmware and software are licensed separately, in their repositories (GPLv3).
By contributing you agree that your contribution is published under these licenses.
A small fix can be made from the browser: every page ends with a link to edit it on GitHub. For anything larger, open an issue first, then a pull request. The Contributing page on the site has the house rules. Questions about the robot itself go to the product repository's issue tracker.
python tools/test_site_features.py checks release-pinned Markdown asset links, the prefilled issue body,
and the syntax of Python examples without running them or connecting to hardware. The CI build runs it.