{"id":50136954,"url":"https://github.com/ll-nick/inkflow","last_synced_at":"2026-05-23T22:30:59.511Z","repository":{"id":359757793,"uuid":"1241811140","full_name":"ll-nick/inkflow","owner":"ll-nick","description":"Inkscape-powered presentations","archived":false,"fork":false,"pushed_at":"2026-05-23T09:12:53.000Z","size":130,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-23T11:19:41.663Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ll-nick.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":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-17T21:01:28.000Z","updated_at":"2026-05-23T09:12:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ll-nick/inkflow","commit_stats":null,"previous_names":["ll-nick/inkflow"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ll-nick/inkflow","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ll-nick%2Finkflow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ll-nick%2Finkflow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ll-nick%2Finkflow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ll-nick%2Finkflow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ll-nick","download_url":"https://codeload.github.com/ll-nick/inkflow/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ll-nick%2Finkflow/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33415020,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T22:14:44.296Z","status":"ssl_error","status_checked_at":"2026-05-23T22:14:43.778Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2026-05-23T22:30:56.745Z","updated_at":"2026-05-23T22:30:59.505Z","avatar_url":"https://github.com/ll-nick.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/logo.svg\" alt=\"Inkflow logo\" height=\"128\"\u003e\n\u003c/p\u003e\n\n# Inkflow\n\n**Beautiful slides from SVG. Your editor, your style.**\n\n## What is Inkflow?\n\nInkflow is early-stage but functional: the full pipeline works end-to-end, step animations run,\na couple of transitions are implemented, and live reload is in place.\nIt's still missing quite a few key features and the config spec is far from final\nso you should probably not be using this tool at the current stage.\n\n## The idea\n\nExisting presentation tools on Linux all make the same tradeoff: either you get a nice visual authoring environment (LibreOffice Impress, Google Slides) or you get something that plays well with version control and plaintext workflows (Beamer, Slidev, reveal.js). You rarely get both, and you almost never get freeform visual design with git-friendly source files and animated, sequenced output.\n\nInkflow tries to bridge that gap. The authoring environment is **Inkscape** — a full vector editor where you can draw anything you want. The presentation layer is a **Python pipeline** that turns those SVG files into an animated, browser-based presenter. The source files are SVGs and a Python config file: plaintext, diffable, git-trackable.\n\n## How it works\n\n```\nmy-talk/\n  deck.py             ← the manifest: slide order, animations, steps\n  slides/\n    01-title.svg\n    02-diagram.svg\n  out/                ← build artifacts, gitignored\n```\n\n`deck.py` is a plain Python file that declares the deck:\n\n```python\nfrom inkflow import Bounce, Crossfade, Cut, Deck, FadeIn, Morph, Slide\n\ndeck = Deck(main=None)\ndeck.slides = [\n    Slide(\"slides/01-title.svg\", animations=[\n        FadeIn(\"#headline\", step=1),\n        FadeIn(\"#subtitle\", step=2),\n    ]),\n    Slide(\"slides/02-diagram.svg\", transition=Cut(), animations=[\n        Bounce(\"#box-a\", step=1),\n        Bounce(\"#box-b\", step=2),\n    ]),\n    Slide(\"slides/03-chart.svg\", transition=Crossfade()),\n    Slide(\"slides/04-summary.svg\", transition=Morph(duration=0.7)),\n]\n```\n\nRunning `inkflow serve deck.py` starts a local server, opens the presenter in the browser, and watches the project directory. Saving a slide in Inkscape reloads the presenter automatically.\n\nThe presenter handles keyboard navigation and step-based animation.\n\n## Architecture\n\n- **`deck.py`** — Python manifest; gives you autocomplete and programmatic slide generation for free\n- **SVG pipeline** — lxml strips Inkscape editor metadata from saved SVGs, then annotates elements with CSS animation classes and `data-step` attributes based on the manifest\n- **Local server** — asyncio HTTP server serves the presenter HTML with slides embedded as JSON; a WebSocket server pushes live-reload signals when files change\n- **Browser presenter** — vanilla HTML/JS/CSS, Catppuccin Mocha color scheme, no framework\n\n## Running the example\n\n```bash\ngit clone ...\ncd inkflow\nuv run inkflow serve example/deck.py\n# open http://localhost:7777\n```\n\nType `?` in the presenter for keyboard shortcuts.\n\nInkscape is the authoring environment; it is not invoked at serve time.\n\n## Tech stack\n\n- Python 3.11+, [uv](https://docs.astral.sh/uv/)\n- [lxml](https://lxml.de/) for SVG processing\n- [watchfiles](https://watchfiles.helpmanual.io/) for file watching\n- [websockets](https://websockets.readthedocs.io/) for live reload\n- Vanilla HTML/JS/CSS for the browser presenter\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fll-nick%2Finkflow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fll-nick%2Finkflow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fll-nick%2Finkflow/lists"}