This is a personal website/blog project built with Sphinx, hosted on GitHub Pages at maxiniuc.com.
Core Components:
jarvis: Python CLI tool for content generation (blogs, timelines)docs/: Sphinx documentation source (Markdown with MyST parser)docs/presentations/: Reveal.js slide decks built from Markdown (slides.md→presentation.html)src/jarvis/notebooks/: Marimo interactive notebooks exported as HTML todocs/notebooks/build/docs/: Generated static site (deployed to GitHub Pages)
Build System: Uses pypeline orchestrator with UV package manager. The pypeline.yaml defines all build steps.
# Bootstrap project (creates venv with UV, runs all steps)
pypeline run
# Use the jarvis CLI via PowerShell wrapper
.\jarvis.ps1 --help
# Alternative: Use VS Code tasks for common operations
# - "run tests" (pytest)
# - "generate docs" (sphinx-build)
# - "autobuild docs" (sphinx-autobuild with live reload)pypeline run --step CreateVEnv --step PyTest # Run specific steps
pypeline run --step BuildDocs --single # Skip dependencies- Edit: Modify
.mdfiles indocs/ - Build:
pypeline run --step BuildDocs --singleor use "generate docs" task - Preview: Run "autobuild docs" task, opens live-reloading server at http://127.0.0.1:8000
- View: Open
build/docs/index.htmlor use "open docs index.html" task
- Created via
jarvis blog --title "Post Title" --category tech --tags python,sphinx - Auto-generates file at
docs/blogs/<YEAR>/<title_snake_case>.mdwith frontmatter - Uses ABlog Sphinx extension for blog functionality
- Post pattern:
blog_post_pattern = "blogs/*/*"indocs/conf.py
- Defined as JSON in
docs/timeline.jsonwithTimelineEntryobjects (year, title, description) - Converted to Sphinx grid-based Markdown via
jarvis timelinecommand - Uses custom CSS classes (
.timeline,.entry.left,.entry.right) indocs/_static/lessons.css - Outputs to
docs/timeline.mdwith alternating left/right grid layout
- Source:
docs/presentations/<name>/slides.md(Reveal.js Markdown) - Output:
docs/presentations/<name>/presentation.html(built externally, copied todocs/) - Excluded from Sphinx processing via
exclude_patternsbut included in final output viahtml_extra_path - Linked from
docs/presentations.mdusing Sphinx Design grid cards
- Source:
src/jarvis/notebooks/<name>.py(Marimo Python apps) - Export as HTML via:
marimo export html <name>.py -o docs/notebooks/<name>/index.html - Marimo notebooks are reactive Python notebooks with
marimo.App()structure - Excluded from mypy checking:
[[tool.mypy.overrides]]forjarvis.notebooks.*
- Theme: pydata-sphinx-theme with custom sidebar configs per page type
- Extensions: MyST Parser (Markdown), ABlog (blog), sphinx-design (grids/cards), sphinxcontrib-mermaid
- Static paths: Custom CSS in
docs/_static/auto-added viasetup(app)function - MyST features: Colon fences, definition lists, HTML admonitions, inline attributes
pytest # Run tests
pre-commit run --all-files # Linters, formatters (ruff, codespell, etc.)- Package manager: UV (not pip/poetry)
- Python version: >=3.10, <4.0
- Dev dependencies: All in
[dependency-groups.dev]section - Editable install: Via
setup.pyshim (required for GitHub package detection) - Entry point:
jarvis.main:main()via Typer CLI
- Don't run
pip installdirectly - use UV orpypeline run --step CreateVEnv - Presentations/notebooks are pre-built - HTML files are committed, not generated during Sphinx build
- PowerShell commands use
;not&&- e.g.,cd docs ; sphinx-build ... - Jarvis CLI from repo root - use
.\jarvis.ps1notpython -m jarvis(requires special_run.pypath setup) - Timeline JSON must match dataclass - Fields: year (int), title (str), description (str)
jarvis.ps1: PowerShell wrapper to run jarvis CLI with correct venv/pathssrc/jarvis/_run.py: Bootstrap script for running jarvis module from repo (addssrc/to path)setup.py: Minimal shim for GitHub package detection (actual build uses UV)pypeline.yaml: Build orchestration config (steps: CreateVEnv, PreCommit, PyTest, BuildDocs)docs/conf.py: Sphinx configuration with ABlog, MyST, and custom sidebar layoutsbuild/CreateVEnv.deps.json: Pypeline dependency tracking (auto-generated)