{"id":45860559,"url":"https://github.com/kahliburke/tachikoma.jl","last_synced_at":"2026-07-08T03:00:37.846Z","repository":{"id":340861254,"uuid":"1167936210","full_name":"kahliburke/Tachikoma.jl","owner":"kahliburke","description":"Build rich terminal apps in Julia — widgets, layouts, sixel graphics, Kitty graphics, animations, and more","archived":false,"fork":false,"pushed_at":"2026-06-30T07:43:36.000Z","size":12852,"stargazers_count":152,"open_issues_count":0,"forks_count":6,"subscribers_count":5,"default_branch":"main","last_synced_at":"2026-06-30T09:24:54.687Z","etag":null,"topics":["animation","async","canvas","charting","cli","dashboard","julia","julia-package","juliac","kitty","layout","markdown","pixel-graphics","sixel","terminal","terminal-ui","text-ui","themes","tui","widgets"],"latest_commit_sha":null,"homepage":"https://kahliburke.github.io/Tachikoma.jl/dev/","language":"Julia","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/kahliburke.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-26T21:02:03.000Z","updated_at":"2026-06-30T07:49:25.000Z","dependencies_parsed_at":"2026-04-01T17:02:51.880Z","dependency_job_id":null,"html_url":"https://github.com/kahliburke/Tachikoma.jl","commit_stats":null,"previous_names":["kahliburke/tachikoma.jl"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/kahliburke/Tachikoma.jl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kahliburke%2FTachikoma.jl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kahliburke%2FTachikoma.jl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kahliburke%2FTachikoma.jl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kahliburke%2FTachikoma.jl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kahliburke","download_url":"https://codeload.github.com/kahliburke/Tachikoma.jl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kahliburke%2FTachikoma.jl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35249883,"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-07-08T02:00:06.796Z","response_time":61,"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":["animation","async","canvas","charting","cli","dashboard","julia","julia-package","juliac","kitty","layout","markdown","pixel-graphics","sixel","terminal","terminal-ui","text-ui","themes","tui","widgets"],"created_at":"2026-02-27T05:31:29.055Z","updated_at":"2026-07-08T03:00:37.841Z","avatar_url":"https://github.com/kahliburke.png","language":"Julia","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/kahliburke/Tachikoma.jl/releases/download/docs-assets/readme_hero_logo.gif\" alt=\"Tachikoma.jl\" width=\"480\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/kahliburke/Tachikoma.jl/releases/download/docs-assets/readme_hero_demo.gif\" alt=\"Tachikoma.jl demo\" width=\"720\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eTachikoma.jl\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eA terminal UI framework for Julia\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/kahliburke/Tachikoma.jl/actions/workflows/CI.yml\"\u003e\u003cimg src=\"https://github.com/kahliburke/Tachikoma.jl/actions/workflows/CI.yml/badge.svg\" alt=\"CI\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://kahliburke.github.io/Tachikoma.jl/dev/\"\u003e\u003cimg src=\"https://img.shields.io/badge/docs-dev-blue.svg\" alt=\"Dev Docs\"\u003e\u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-green.svg\" alt=\"MIT License\"\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/julia-%E2%89%A5%201.10-9558B2?logo=julia\u0026logoColor=white\" alt=\"Julia 1.10+\"\u003e\n\u003c/p\u003e\n\n---\n\nTachikoma is a pure-Julia framework for building rich, interactive terminal applications. It provides an Elm-inspired `Model`/`update!`/`view` architecture, a 60fps event loop with double-buffered rendering, 30+ composable widgets, constraint-based layouts, animation primitives, kitty/sixel pixel graphics, and built-in recording and export to SVG/GIF.\n\n## Features\n\n**Architecture** — Declarative Elm pattern with clean separation of state, logic, and rendering. 60fps event loop with automatic frame pacing and double-buffered output.\n\n**30+ Widgets** — Text inputs, text areas, code editor with syntax highlighting, data tables with column resize and sort, forms with validation and Tab navigation, tree views, charts, bar charts, sparklines, calendars, modals, dropdowns, radio groups, checkboxes, progress indicators, scrollable panes, markdown viewer, and more.\n\n**Constraint Layouts** — `Fixed`, `Fill`, `Percent`, `Min`, `Max`, and `Ratio` constraints. Draggable resizable pane borders with layout persistence via Preferences.jl.\n\n**Animation** — Tweens with 10 easing functions, physics-based springs, timelines for sequencing, and organic effects: `noise`, `fbm`, `pulse`, `breathe`, `shimmer`, `jitter`, `flicker`, `drift`, `glow`.\n\n**Graphics** — Three rendering backends: Braille dots (2x4), quadrant blocks (2x2), and pixel rendering (16x32 per cell, Kitty or sixel). Vector drawing API with lines, arcs, circles, and shapes.\n\n**24 Themes** — 11 dark and 13 light palettes with hot-swappable switching via **Ctrl+\\\\** theme selector.\n\n**Recording \u0026 Export** — Live recording via `Ctrl+R`, headless `record_app()`/`record_widget()` for CI, native `.tach` format with Zstd compression, export to SVG and GIF.\n\n**Async Tasks** — Channel-based background work that preserves the single-threaded Elm architecture. Cancel tokens, timers, and repeat scheduling.\n\n**Testing** — `TestBackend` for headless widget rendering with `char_at()`, `style_at()`, `row_text()`, `find_text()` inspection APIs. Property-based testing with Supposition.jl.\n\n## Quick Start\n\n```julia\nusing Pkg\nPkg.add(\"Tachikoma\")\n```\n\n```julia\nusing Tachikoma\n@tachikoma_app\n\n@kwdef mutable struct Life \u003c: Model\n    quit::Bool = false\n    grid::Matrix{Bool} = rand(24, 80) .\u003c 0.25\nend\n\nshould_quit(m::Life) = m.quit\nfunction update!(m::Life, e::KeyEvent)\n    e.key == :escape \u0026\u0026 (m.quit = true)\nend\n\nfunction view(m::Life, f::Frame)\n    h, w = size(m.grid)\n    g = m.grid\n    nc = [sum(g[mod1(i+di,h), mod1(j+dj,w)]\n          for di in -1:1, dj in -1:1) - g[i,j]\n          for i in 1:h, j in 1:w]\n    g .= (nc .== 3) .| (g .\u0026 (nc .== 2))\n    a, buf = f.area, f.buffer\n    cs = [:primary, :accent, :success,\n          :warning, :error]\n    for i in 1:min(h, a.height),\n        j in 1:min(w, a.width)\n        g[i,j] || continue\n        set_char!(buf, a.x+j-1, a.y+i-1,\n            '█', tstyle(cs[clamp(nc[i,j],1,5)]))\n    end\nend\n\napp(Life())\n```\n\nSee the [Getting Started](https://kahliburke.github.io/Tachikoma.jl/dev/getting-started) guide for a more complete walkthrough with layouts, widgets, and input handling.\n\n## Demos\n\nThe `demos/TachikomaDemos` package includes 25+ interactive demos with a launcher menu:\n\n```julia\nusing Pkg\nPkg.activate(\"demos/TachikomaDemos\")\nPkg.instantiate()\n\nusing TachikomaDemos\nlauncher()  # interactive menu\n```\n\nOr run individual demos directly: `dashboard()`, `snake()`, `life()`, `sysmon()`, `anim_demo()`, `windows_demo()`, `chart_demo()`, `form_demo()`, `effects_demo()`, and more.\n\n## Gallery\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\u003cstrong\u003eDashboard\u003c/strong\u003e\u003cbr\u003e\u003cimg src=\"https://github.com/kahliburke/Tachikoma.jl/releases/download/docs-assets/readme_dashboard_app.gif\" width=\"360\"\u003e\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003cstrong\u003eForm with Validation\u003c/strong\u003e\u003cbr\u003e\u003cimg src=\"https://github.com/kahliburke/Tachikoma.jl/releases/download/docs-assets/readme_form_app.gif\" width=\"360\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\u003cstrong\u003eAnimation Showcase\u003c/strong\u003e\u003cbr\u003e\u003cimg src=\"https://github.com/kahliburke/Tachikoma.jl/releases/download/docs-assets/readme_anim_showcase_app.gif\" width=\"360\"\u003e\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003cstrong\u003eTodo List\u003c/strong\u003e\u003cbr\u003e\u003cimg src=\"https://github.com/kahliburke/Tachikoma.jl/releases/download/docs-assets/readme_todo_app.gif\" width=\"360\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\u003cstrong\u003eGitHub PR Viewer\u003c/strong\u003e\u003cbr\u003e\u003cimg src=\"https://github.com/kahliburke/Tachikoma.jl/releases/download/docs-assets/readme_github_prs_app.gif\" width=\"360\"\u003e\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003cstrong\u003eConstraint Explorer\u003c/strong\u003e\u003cbr\u003e\u003cimg src=\"https://github.com/kahliburke/Tachikoma.jl/releases/download/docs-assets/readme_constraint_explorer_app.gif\" width=\"360\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\u003cstrong\u003eDotwave Background\u003c/strong\u003e\u003cbr\u003e\u003cimg src=\"https://github.com/kahliburke/Tachikoma.jl/releases/download/docs-assets/readme_bg_dotwave.gif\" width=\"360\"\u003e\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003cstrong\u003ePhylogenetic Tree\u003c/strong\u003e\u003cbr\u003e\u003cimg src=\"https://github.com/kahliburke/Tachikoma.jl/releases/download/docs-assets/readme_bg_phylotree.gif\" width=\"360\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n## Widget Catalog\n\n| Category | Widgets |\n|:---------|:--------|\n| **Text \u0026 Display** | `Block`, `Paragraph`, `BigText`, `StatusBar`, `Span`, `Separator`, `MarkdownPane` |\n| **Input** | `TextInput`, `TextArea`, `CodeEditor`, `Checkbox`, `RadioGroup`, `DropDown`, `Button` |\n| **Selection \u0026 Lists** | `SelectableList`, `TabBar`, `TreeView`, `Calendar` |\n| **Data** | `DataTable`, `Chart`, `BarChart`, `Sparkline`, `Gauge`, `ProgressList` |\n| **Layout** | `Container`, `ScrollPane`, `Scrollbar`, `Modal`, `Form`, `FloatingWindow`, `WindowManager` |\n| **Graphics** | `Canvas`, `BlockCanvas`, `PixelImage` |\n\n## Backgrounds\n\nProcedural animated backgrounds that composite behind your UI:\n\n| Preset | Description |\n|:-------|:------------|\n| **DotWave** | Undulating dot-matrix terrain with configurable wave layers |\n| **PhyloTree** | Animated phylogenetic branching structures |\n| **Cladogram** | Hierarchical cladogram tree visualizations |\n\n## Optional Extensions\n\n```julia\n# Markdown rendering\nusing CommonMark\n# GIF export\nusing FreeTypeAbstraction, ColorTypes\n# Tables.jl integration for DataTable\nusing Tables\n```\n\n## Documentation\n\nFull documentation is available at **[kahliburke.github.io/Tachikoma.jl](https://kahliburke.github.io/Tachikoma.jl/dev/)**.\n\n| Section | Description |\n|:--------|:------------|\n| [Getting Started](https://kahliburke.github.io/Tachikoma.jl/dev/getting-started) | Build your first app in 30 lines |\n| [Architecture](https://kahliburke.github.io/Tachikoma.jl/dev/architecture) | The Elm architecture pattern in depth |\n| [Layout](https://kahliburke.github.io/Tachikoma.jl/dev/layout) | Constraint-based layout system |\n| [Widgets](https://kahliburke.github.io/Tachikoma.jl/dev/widgets) | Complete catalog of all widgets |\n| [Animation](https://kahliburke.github.io/Tachikoma.jl/dev/animation) | Tweens, springs, timelines, and organic effects |\n| [Graphics](https://kahliburke.github.io/Tachikoma.jl/dev/canvas) | Canvas, BlockCanvas, and pixel rendering |\n| [Themes](https://kahliburke.github.io/Tachikoma.jl/dev/styling) | 24 themes (dark + light) with hot-swap switching |\n| [Recording](https://kahliburke.github.io/Tachikoma.jl/dev/recording) | Recording and export to SVG/GIF |\n| [Testing](https://kahliburke.github.io/Tachikoma.jl/dev/testing) | TestBackend for headless widget testing |\n| [API Reference](https://kahliburke.github.io/Tachikoma.jl/dev/api) | Auto-generated API documentation |\n\n## Requirements\n\n- Julia 1.10+\n- A terminal with ANSI color support (most modern terminals)\n- Kitty or sixel-capable terminal for pixel graphics (kitty, iTerm2, WezTerm, foot, etc.)\n\n## Contributing\n\nContributions are welcome. Please open an issue to discuss proposed changes before submitting a pull request.\n\n## License\n\nMIT — see [LICENSE](LICENSE) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkahliburke%2Ftachikoma.jl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkahliburke%2Ftachikoma.jl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkahliburke%2Ftachikoma.jl/lists"}