- Shell 97.6%
- Makefile 2.4%
| assets | Update assets | |
| etc | VoTe 0.92 beta | |
| frontends | VoTe 0.92 beta | |
| lang | VoTe 0.92 beta | |
| lib | VoTe 0.92 beta | |
| tests | VoTe 0.92 beta | |
| .editorconfig | VoTe 0.92 beta | |
| .gitignore | VoTe 0.92 beta | |
| INTEGRATION-TESTS.md | VoTe 0.77 beta | |
| LICENSE.agpl | Add agpl license | |
| LICENSE.gpl | Add gpl license | |
| Makefile | VoTe 0.91 beta | |
| NOTICE | Add license notice | |
| README.md | VoTe 0.92 beta | |
| run.sh | VoTe 0.91 beta | |
| TESTS.md | VoTe 0.92 beta | |
| vote | VoTe 0.92 beta | |
VoTe — Void Templater
VoTe logo
VoTe is a bash-based CLI tool for managing xbps-src package templates in Void Linux.
It streamlines the workflow of building, testing, and submitting packages to Void Linux repositories.
Version: 0.92 beta
source: https://codeberg.org/oSoWoSo/vote
xbps repo: https://repo.osowoso.org
VoTe UI screenshot
VoTe UI
⏩Click for more screenshots with help messages⏬
Panel 1
VoTe help for panel 1
Panel 2
VoTe help for panel 2
Panel 3
VoTe help for panel 3
Panel 4
VoTe help for panel 4
Panel 5
VoTe help for panel 5
Panel 6
VoTe help for panel 6
Options
VoTe Options
Status
VoTe progress status in glow
Disclaimer
This is an independent project and is not affiliated with or endorsed by the Void Linux project.
It is developed specifically for use on Void Linux, but it is not an official tool.
Please do not report issues related to this project to Void Linux maintainers.
All support and development is handled within this repository.
Features
- Template Management — Create, edit, lint, and build package templates
- Auto-create from URL — Generate a template from any GitHub/GitLab/Codeberg/... URL
- Auto-bump — Automatically update template versions
- AI Wizard — AI-assisted build failure analysis and fix loop (api/cli/openhands)
- gum TUI — Modern terminal UI via
gum panel(requires custom gum withpanelsubcommand) - Interactive TUI — Full terminal-based user interface with panel layout
- Panel Auto-Navigation — Smart panel selection based on workflow state
- Cross-build — Build for any architecture from the build panel; flags persist via the flag panel
- Build Status Badges — Visual 🟢/🔴 indicators for all architectures in menu header
- Status Tracking — Persistent workflow state across sessions (bump→sum→lint→build→install→push)
- Symlink Management — Auto-sync sub-package symlinks in srcpkgs/
- Dependency Finder — Find packages/files from build log, add to template interactively
- Template Variable Cleaner — Remove empty/commented template variables
- Git Integration — Push changes and create PRs to void-packages
- Repology & Changelog — Check project status on repology.org (inline API data or browser)
- Lazygit Integration — Launch lazygit from the menu (if installed)
- Per-Panel Help (Ctrl+H) — Context-sensitive help overlay for each panel
- Extract Distfiles — Extract sources from the menu
- Custom Build Styles — Support for external build style directories
- Error Pattern Matching — Diagnose build failures with a pattern database
- Companion Tools — vut (template utility), xfzf (fzf helper), xut (xbps utility)
Panel Reference
The gum TUI has 6 panels, each with a set of actions:
Panel ... (Misc)
Bootstrap Options TODO
- Bootstrap — Run
xbps-src bootstrap-update - Options — Interactive VoTe configuration editor
- TODO — View/add TODO items (dev mode only, when TODO.md exists)
- Quit — Press ESC to exit
Panel choose (Template Chooser)
Choose Manual Branch Lazygit Homepage Changelog Repology
- Choose — Select a template from available srcpkgs
- Manual — Open xbps-src Manual.md
- Branch — Switch git branch
- Lazygit — Launch lazygit (if installed)
- Homepage — Open project homepage in browser
- Changelog — Open project changelog (if defined in template)
- Repology — Check package on repology.org (inline API data if curl+jq available)
Panel prepare
Bump Sum Lint Xtract Edit Symlink Wizard Find Tidy Clean
- Bump — Auto-bump template version
- Sum — Update distfile checksums
- Lint — Lint template with xbps-src
- Xtract — Extract distfiles
- Edit — Open template in $EDITOR
- Symlink — Create/update sub-package symlinks in srcpkgs/
- Wizard — AI-assisted build failure analysis (if configured)
- Find — Search for packages/files from build log, add to template deps
- Tidy — Remove empty/commented template variables
- Clean — Clean build directory
Panel flag
-s -Q -C -K cross
Selects build flags only — no build is triggered here.
- -s — Strict mode (turns warnings into errors)
- -Q — Build with tests
- -C — Keep builddir and destdir populated
- -K — Build with longer tests
- cross — Force
-A <target>(native masterdir, fornocross=packages)
Selected flags persist between builds until changed.
Panel build
All architectures including host (x86_64, x86_64-musl, i686, i686-musl, aarch64, aarch64-musl, armv7l, armv7l-musl, armv6l, armv6l-musl).
Select a target arch to trigger the build using the flags from the flag panel.
- Selecting the host arch = native build
x86_64-muslalways uses-A x86_64-musl(musl masterdir)crossflag forces-A <target>for any arch
Panel pub (Publish)
Install Log Commit Revbump New-PR Push OCO
- Install — Install built package locally using xi
- Log — View build log in your pager/highlighter
- Commit — Commit template changes with proper message (via xbump)
- Revbump — Increment revision= and commit (rebuild for dep change)
- New-PR — Create a pull request on void-linux/void-packages
- Push — Push the current branch to your fork remote
- OCO — Copy template to OCO repository (shown when OCODIR is set)
Requirements
- Bash 4+ — Required for associative arrays and modern features
- Void Linux — Designed for xbps-src workflow
- XBPS_DISTDIR — Path to your void-packages fork
Optional Dependencies
| Dependency | Package | Description |
|---|---|---|
| gum | custom gum |
TUI panels/prompts — required (see note below) |
Note on
gum: ThegumUI backend requires a custom build of gum that includes thepanelsubcommand.
Standard releases of gum do not includepanel.
Use the fork at codeberg.org/oSoWoSo/gum,
or track the upstream PR charmbracelet/gum#1063.
Included in Void Community Repository: https://repo.osowos.org
Other Tools
xbps-src— From void-packagesgit— For push/PR operationsjq— For JSON processing (auto-create, AI wizard)curl— For fetching release info and AI callsssh— For remote operations
Installation
From repository
REPO
(templates repository: oco)
From source
1. Clone the Repository
git clone https://codeberg.org/oSoWoSo/vote.git ~/vote
cd ~/vote
2. Set Up Configuration
mkdir -p ~/.config/vote
# Create vote.conf — see Configuration section below
3. Configure XBPS_DISTDIR
export XBPS_DISTDIR="$HOME/void" # or your preferred path
export PATH="$HOME/vote:$PATH"
4. (Optional) Install System-wide
sudo make install # VoTe only
sudo make install-all # VoTe + vut + xut
sudo make install-vut # vut only
sudo make install-xut # xut only
Companion tools:
vut— Template utility helper (template info, formatting)xfzf— Fzf helper for template selectionxut— XBPS utility tool (GPL-2.0)
The assets/vote.kdl is an PLANNED optional zellij layout
Copy it to your zellij config if you want the split-pane build view.
Usage
Quick Start
# Launch interactive TUI
./vote
# Auto-create template from a git URL
./vote create https://github.com/owner/repo
# Build a package
./vote build <template>
# Lint a template
./vote lint <template>
# Update checksum
./vote sum <template>
# Auto-bump version
./vote autobump <template>
Command Reference
| Command | Alias | Description |
|---|---|---|
build |
b |
Build package |
lint |
l |
Lint template |
sum |
s |
Update checksum |
autobump |
a |
Auto-bump version |
install |
i |
Install built package |
clean |
c |
Clean build directory |
push |
p |
Push changes to fork |
edit |
e |
Edit template in $EDITOR |
repology |
r |
Check on repology.org |
homepage |
h |
Open project homepage |
prcheck |
P |
Check PR status |
createpr |
— | Create PR on void-packages |
create |
— | Auto-create template from git URL |
crossbuild |
— | Cross-build for architecture |
fetch |
— | Fetch sources |
extract |
— | Extract sources |
patch |
— | Apply patches |
configure |
— | Run configure step |
check |
— | Run check phase |
show |
— | Show package info |
show-files |
— | Show package files |
show-options |
— | Show package options |
bootstrap |
B |
Bootstrap void-packages |
config |
— | Edit VoTe config vars |
clean-repocache |
— | Clean repository cache |
consistency-check |
— | Check void-packages consistency |
patterns |
— | List error patterns |
pattern-add |
— | Add custom error pattern |
pattern-check |
— | Test error against patterns |
Global Options
--ui, -U BACKEND Force UI backend: gum
--debug, -d Enable debug mode
--help, -h Show help
--version, -v Show version
Build Flags
vote build <template> [OPTIONS]
-s Strict mode (warnings→errors)
-Q Run tests
-K Run long tests
-C Keep build dir
-j N Use N parallel jobs
-o opt Pass build option
-r repo Use alternative repository
-a arch Target architecture (cross-build)
-A arch Use native masterdir for arch (nocross= packages)
In the TUI, flags are set via the flag panel and persist until changed. Build is triggered from the build panel.
Configuration
Default location: ~/.config/vote/vote.conf
# Required: your void-packages fork
XBPS_DISTDIR="$HOME/void"
# Your fork remote
MY_XBPS_REPO="git@github.com:username/void-packages.git"
# UI
UI_BACKEND="gum"
EDITOR="hx"
TERMINAL="kitty"
# Build flags are selected interactively from the BUILD panel.
# Output mode for builds
VOTE_SPINNER_MODE="zellij" # zellij | gum | none
AI Wizard
The Wizard uses an AI backend to analyze build logs and suggest fixes.
Configure in vote.conf:
VOTE_AI_MODE="api" # api | cli | openhands
VOTE_AI_URL="http://localhost:4000" # OpenAI-compatible endpoint
VOTE_AI_KEY="your-key"
VOTE_AI_MODEL="gemini/gemini-2.5-flash"
VOTE_AI_MAX_RETRIES=3 # -1 = unlimited
Three modes:
| Mode | Description |
|---|---|
api |
LiteLLM/OpenAI-compatible REST endpoint |
cli |
Local CLI tool (e.g. VOTE_AI_CMD="claude") |
openhands |
Non-blocking OpenHands agent in zellij float |
For CLI mode:
VOTE_AI_MODE="cli"
VOTE_AI_CMD="claude"
The Wizard appears in the Prepare panel and is only visible when VOTE_AI_MAX_RETRIES is set (non-empty).
File Structure
vote/
├── vote # Main executable
├── vut # Template utility helper
├── xut # xbps utility tool (GPL-2.0)
├── run.sh # Dev helper: bump version, run tests
├── assets/
│ ├── vote.svg # Logo
│ ├── vote.desktop # Desktop entry
│ ├── vote.kdl # Zellij layout
│ └── VoTe-0.75.mp4 # Demo video
├── lib/
│ ├── init.sh # Initialization
│ ├── core/ # Core libraries (colors, errors, UI stubs...)
│ ├── xbps/ # XBPS integration (build, deps, git, wizard, vm...)
├── frontends/ # TUI frontend
│ └── menu-gum.sh
├── etc/
│ ├── vote.conf # Default config template
│ └── error-patterns.json
├── lang/ # Localization (en, cs)
├── void-20250202-musl/ # VM disk, ISO, launch script
├── void-20250202-musl.conf # Quickemu VM config
├── void-musl-vm.qcow2 # VM disk image
├── TESTS.md # Unit test suite (clitest)
├── INTEGRATION-TESTS.md # Integration tests (require real void-packages)
└── TODO.md # Development notes
License
VoTe is dual-licensed depending on how it is distributed:
- GNU AGPL-3.0 — standalone distribution. See LICENSE.agpl.
- GNU GPL-2.0 — when bundled with QEMU or other GPLv2-only components. See LICENSE.gpl.
See NOTICE for full details.
Links
- Repository: https://codeberg.org/oSoWoSo/vote
- Issues: https://codeberg.org/oSoWoSo/vote/issues
- Void Linux: https://voidlinux.org
- void-packages: https://github.com/void-linux/void-packages