chilla is a yazi-like GUI file viewer built with Tauri, Bun, Solid.js, and Rust. It opens directories and files from the command line, shows a flat file tree, and previews Markdown, text, images, video, and PDF content inside a desktop UI.
README preview:
Movie preview:
The repository design documents started from a Markdown workbench concept, then evolved toward a mixed file-view mode. The current implementation is closer to a yazi-like desktop viewer/browser than a full Markdown editor:
chillawith no arguments opens the current working directory.chilla <dir>opens that directory in file-view mode.chilla <file>opens the file's parent directory and previews the selected file.- Markdown files get a richer preview flow with:
- rendered HTML
- heading extraction
- a toggleable table of contents
- Mermaid rendering in the preview pane
- Non-Markdown files are previewed according to type:
- images: inline image preview
- video: embedded video preview
- PDF: embedded iframe preview
- text-like files: syntax-highlighted source preview
- binary files: metadata/placeholder preview
At the moment, Markdown source is viewable in a raw pane, but this app does not yet expose the editable save flow described in the original workbench design.
- Flat file browser with keyboard navigation inspired by terminal file managers
- Markdown heading extraction and table of contents
- Backend-owned Markdown parsing in Rust
- Mermaid hydration on the frontend after preview render
- Automatic refresh of opened Markdown documents when the file changes on disk
- Theme toggle with frontend CSS variables and backend syntax-theme synchronization
- Custom undecorated desktop window chrome
Global shortcuts:
?: show helpEsc: close helpQ: quit the appCtrl+D: scroll downCtrl+U: scroll upJorArrowDown: scroll the active file view down one line when the file tree is hiddenKorArrowUp: scroll the active file view up one line when the file tree is hiddenShift+L: toggle file treeY: copy the selected file or directory absolute pathR: reload the current fileShift+T: toggle table of contents for MarkdownShift+P: switch Markdown raw/preview paneShift+S: toggle light/dark theme
File tree shortcuts:
/: focus filterJorArrowDown: move selection downKorArrowUp: move selection up0: reset sort to default (nameascending)a: sort by name ascendingA: sort by name descendinge: sort by extension ascendingE: sort by extension descendingm: sort by modified time ascendingM: sort by modified time descendings: sort by size ascendingS: sort by size descendingHorArrowLeft: go to parent directoryL,ArrowRight,Enter: open or confirm selectionCtrl+M: same asEnterin the filter field
Video preview:
- Opening a video from the file tree requests playback immediately when the webview allows it.
- The preview overlay uses a focused play button with an icon-only affordance and an accessible label for the current file.
Space: play/pause when supported by the platform/webview
The app is split across a typed Tauri boundary:
src-tauri/- CLI parsing and startup target resolution
- directory listing and file classification
- Markdown rendering and heading extraction
- syntax highlighting
- filesystem watching for Markdown refresh
src/- workspace shell and desktop UI
- file browser interactions
- preview panes for Markdown, text, PDF, and video
- theme management
- Mermaid enhancement after HTML injection
Key runtime contracts:
StartupContext: initial workspace mode, directory, and selected fileDirectorySnapshot: current directory listingDocumentSnapshot: Markdown source, rendered HTML, headings, and revision metadataFilePreview: typed preview union for Markdown, image, video, PDF, text, and binary files
.
├── src/ # Solid.js frontend
├── src-tauri/ # Rust + Tauri backend
├── design-docs/ # design notes and specs
├── impl-plans/ # implementation plans
├── Taskfile.yml # common development commands
├── package.json # Bun scripts
└── flake.nix # Nix development environment
- Nix with flakes enabled
- direnv optional but recommended
The repository is set up for nix develop, which provides Bun, Cargo, Tauri-related build dependencies, and the Rust toolchain.
nix developtask dev
task build
task nix-build
task test
task test-tauri-e2e-linux
task check
task clippy
task fmtEquivalent package-manager commands:
bun run dev
bun run build
bun run typecheck
bun run test
bun run test:tauri:e2e:linux
CARGO_TERM_QUIET=true cargo test --manifest-path src-tauri/Cargo.tomltask build compiles the Tauri backend with Cargo --release.
task nix-build builds the default flake package via nix build .#chilla, which also uses crane's release-profile Cargo path for the packaged desktop binary.
The repository also includes a Linux-only desktop smoke test that runs the real Tauri app through tauri-driver:
CARGO_TERM_QUIET=true cargo install tauri-driver --locked
bun run test:tauri:e2e:linuxNotes:
WebKitWebDriveris expected onPATH. The Nix dev shell provides it viawebkitgtk_4_1.- If
DISPLAYis not set, the runner falls back toXvfbwhen available. - The smoke test opens the real workspace, filters to
README.md, and verifies the rendered Markdown preview.
During development:
task devFrom a built binary or nix run, the CLI shape is:
chilla [path]Examples:
chilla
chilla .
chilla docs/
chilla notes.md
chilla movie.mp4nix run can be used in the same style:
nix run . --
nix run . -- README.mdThe repository now includes a root-level install.sh that follows the common "curl the latest release and install it" pattern:
curl -fsSL https://raw.githubusercontent.com/tacogips/chilla/main/install.sh | bashSpecific version:
curl -fsSL https://raw.githubusercontent.com/tacogips/chilla/main/install.sh | bash -s -- v0.1.1Uninstall:
curl -fsSL https://raw.githubusercontent.com/tacogips/chilla/main/install.sh | bash -s -- uninstallInstaller behavior:
- resolves the current platform as one of
aarch64-darwin,x86_64-darwin,aarch64-linux, orx86_64-linux - prefers a matching archive in a local
release/directory when present - otherwise downloads the latest GitHub release asset named
chilla-v<version>-<target>.tar.gz - installs the extracted release tree under
~/.local/share/chilla/releases/ - updates
~/.local/bin/chillato point at the installed wrapper - can update the user's shell profile with a managed PATH block unless
--no-modify-pathis used - supports
./install.sh uninstallto remove the installed files and managed PATH block
The current installer-facing Darwin tarball remains a Nix-based release artifact containing bin/chilla, not a .app bundle. It may still depend on /nix/store runtime paths on the target machine.
The repository now also contains a separate Tauri macOS bundle flow for direct .app and .dmg builds:
task bundle-macos-dmgThat path uses src-tauri/tauri.macos.release.conf.json and is intended for Apple signing/notarization on a macOS host or CI runner. Repository-local GitHub Actions support expects these secrets when you want signed/notarized artifacts:
APPLE_CERTIFICATEAPPLE_CERTIFICATE_PASSWORDAPPLE_SIGNING_IDENTITYAPPLE_IDAPPLE_PASSWORDAPPLE_TEAM_IDKEYCHAIN_PASSWORD
Without those secrets, the repository can still build unsigned .app/.dmg bundles for local validation, but Gatekeeper may reject them on another machine.
Install with:
brew tap tacogips/tap
brew install --cask chillaCurrent caveats:
- the cask now installs the macOS Apple Silicon DMG release artifact
- it is currently constrained to Apple Silicon via Homebrew
depends_on arch: :arm64 - the current DMG is not signed and notarized yet, so Gatekeeper may still block launch until the release pipeline publishes a trusted macOS artifact
The following commands were confirmed passing while preparing this README:
bun run typecheckbun run testCARGO_TERM_QUIET=true cargo test --manifest-path src-tauri/Cargo.toml
The design docs under design-docs/specs/ still reflect two overlapping phases of the product:
- the original Markdown workbench design
- the later file-view mode extension
The implementation has already adopted file-view startup and multi-type preview behavior, so the source code is the more accurate reference for current behavior. The active implementation plans should be read as planning artifacts, not as a precise status dashboard.


