{"id":51081265,"url":"https://github.com/darkhorseprojects/loam","last_synced_at":"2026-06-23T18:03:27.801Z","repository":{"id":365621857,"uuid":"1272974703","full_name":"darkhorseprojects/loam","owner":"darkhorseprojects","description":"A fullscreen terminal-cell painter written in Zig","archived":false,"fork":false,"pushed_at":"2026-06-18T06:56:18.000Z","size":57,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-18T07:24:01.231Z","etag":null,"topics":["ascii-art","lua","lua-script","paint","zig"],"latest_commit_sha":null,"homepage":"","language":"Zig","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/darkhorseprojects.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-06-18T05:19:41.000Z","updated_at":"2026-06-18T06:56:16.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/darkhorseprojects/loam","commit_stats":null,"previous_names":["darkhorseprojects/loam"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/darkhorseprojects/loam","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darkhorseprojects%2Floam","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darkhorseprojects%2Floam/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darkhorseprojects%2Floam/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darkhorseprojects%2Floam/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/darkhorseprojects","download_url":"https://codeload.github.com/darkhorseprojects/loam/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darkhorseprojects%2Floam/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34700915,"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-06-23T02:00:07.161Z","response_time":65,"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":["ascii-art","lua","lua-script","paint","zig"],"created_at":"2026-06-23T18:03:25.229Z","updated_at":"2026-06-23T18:03:27.796Z","avatar_url":"https://github.com/darkhorseprojects.png","language":"Zig","funding_links":[],"categories":[],"sub_categories":[],"readme":"# loam\n\nfullscreen terminal-cell painter. Zig engine, Lua brushes.\n\n## install\n\nLinux/macOS:\n\n```sh\ncurl -fsSL https://raw.githubusercontent.com/darkhorseprojects/loam/main/scripts/install.sh | sh\n```\n\nWindows PowerShell:\n\n```powershell\niwr https://raw.githubusercontent.com/darkhorseprojects/loam/main/scripts/install.ps1 -UseB | iex\n```\n\nRelease assets:\n\n- Linux x86_64\n- Linux aarch64\n- macOS aarch64\n- macOS x86_64\n- Windows x86_64\n\nFrom source:\n\n```sh\nzig build\n./zig-out/bin/loam --list\n./zig-out/bin/loam --brush=text\n```\n\n## controls\n\n| input | action |\n| --- | --- |\n| scroll | switch brush |\n| numbers | brush-local controls |\n| `0` | reset bundled brush state |\n| left drag | paint |\n| right drag/release | select/copy rectangle |\n| left drag inside selection | move selection |\n| middle click / `v` | paste internal clipboard |\n| `c` | clear canvas and particles |\n| `r` | clear selection / cancel move |\n| `esc` | cancel active gesture or text input |\n| repeated `esc` | countdown, then clear canvas |\n| `q` | quit |\n\n## brushes\n\nA brush is a `.lua` file with:\n\n```lua\nlocal brush = { name = \"star\", glyph = \"*\" }\n\nfunction brush.paint(ctx, event)\n  if event.type == \"mouse\" and event.button == \"left\" and event.action ~= \"release\" then\n    ctx.set(event.world_x, event.world_y, brush.glyph)\n  end\nend\n\nreturn brush\n```\n\nBundled brushes:\n\n```text\nbox eraser floral line moss particles seed soil text\n```\n\nBrush folders, first match wins by file stem:\n\n```text\n./brushes\n$XDG_CONFIG_HOME/loam/brushes\n~/.config/loam/brushes\n%APPDATA%/loam/brushes\n$XDG_DATA_HOME/loam/brushes\n~/.local/share/loam/brushes\n%LOCALAPPDATA%/loam/brushes\n/usr/local/share/loam/brushes\n/usr/share/loam/brushes\n```\n\nLinux release installs bundled brushes to:\n\n```text\n~/.local/share/loam/brushes\n```\n\nPut custom Linux brushes in:\n\n```text\n~/.config/loam/brushes\n```\n\nWindows installer uses:\n\n```text\n%APPDATA%\\loam\\brushes\n```\n\n## Lua ctx\n\n```lua\nctx.set(x, y, glyph)\nctx.get(x, y)\nctx.line(x0, y0, x1, y1, glyph)\nctx.fill(x, y, width, height, glyph)\nctx.rect(x, y, width, height, edge, fill_or_nil)\nctx.stageSet(x, y, glyph)\nctx.stageClear()\nctx.commitStage()\nctx.clear()\nctx.requestText(label)\nctx.emit(x, y, glyph, ttl, vx, vy)\nctx.particleCount()\nctx.getParticle(i)\nctx.setParticle(i, x, y, vx, vy, glyph, ttl, age)\nctx.removeParticle(i)\nctx.eachParticle(fn)\nctx.time()\nctx.dt()\nctx.random()\nctx.randomRange(a, b)\n```\n\nText input is engine-owned. A brush calls `ctx.requestText(\"text\")`; loam records keys, shows a top-left status line, and sends `event.type == \"text\"` events to Lua. Lua never reads stdin.\n\n## MCP\n\nRun stdio MCP helper:\n\n```sh\nloam --mcp\nloam-mcp\n```\n\nSingle tool:\n\n```text\nloam_apply_selection\n```\n\nArguments:\n\n```json\n{\n  \"input_file\": \"map.txt\",\n  \"output_file\": \"map.out.txt\",\n  \"mode\": \"fill\",\n  \"placement_char\": \"#\",\n  \"target_char\": \".\",\n  \"target\": {\"line\": 1, \"column\": 1},\n  \"selection\": {\"line\": 1, \"column\": 1, \"width\": 10, \"height\": 4},\n  \"points\": [{\"line\": 1, \"column\": 1}, {\"line\": 4, \"column\": 10}]\n}\n```\n\nModes:\n\n- `fill`: fill rectangle, replace target chars in rectangle, or replace connected `target_char` section.\n- `path`: draw a continuous path through `points`; with `target_char`, only matching cells on the path are replaced.\n\nIf `target_char` finds multiple disconnected sections, specify `target.line` and `target.column`.\n\n## platform notes\n\n- terminal rendering is diffed; no full-screen clear per frame\n- render never calls Lua\n- canvas owns durable cells and particles\n- renderer owns overlays, preview, selection, move preview, status lines\n- Windows builds and releases exist; interactive Windows Terminal UX still needs manual testing\n- BSD release assets are not published\n\ncurrent version: **0.1.11**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdarkhorseprojects%2Floam","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdarkhorseprojects%2Floam","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdarkhorseprojects%2Floam/lists"}