Interactive TUI tool for managing and launching frequently-used browser links with multi-environment support.
- Interactive terminal UI built with ratatui
- 10 color themes (Catppuccin, Tokyo Night, Nord, Gruvbox, Dracula, OneDark)
- JSON-based configuration
- Multi-environment support (dev, staging, production, custom)
- Dynamic URL parameters (text input, selections)
- Keyboard-driven navigation
- Import/Export configurations
From crates.io:
cargo install qlinkFrom source:
git clone https://github.com/esh2n/qlink.git
cd qlink
cargo build --release
sudo cp target/release/qlink /usr/local/bin/Or download pre-built binaries from Releases.
Initialize default configuration:
qlink initLaunch the TUI:
qlinkPress t to change theme, i to import your own configuration.
Create your own configuration JSON file (e.g., my-links.json):
{
"version": "1.0",
"projects": [
{
"name": "My Project",
"description": "My custom links",
"categories": [
{
"name": "Web Apps",
"description": "Application dashboards",
"links": [
{
"name": "Admin Dashboard",
"environments": ["dev", "staging", "prod"],
"url_template": "https://admin.{domain}",
"env_config": {
"dev": { "domain": "dev.mycompany.com" },
"staging": { "domain": "staging.mycompany.com" },
"prod": { "domain": "mycompany.com" }
},
"parameters": []
}
]
}
]
}
]
}Import:
qlink import my-links.json
# Merge with existing config
qlink import --merge new-links.json{
"version": "1.0",
"projects": [
{
"name": "Project Name",
"description": "Optional description",
"categories": [...]
}
]
}{
"name": "Category Name",
"description": "Optional description",
"links": [...]
}{
"name": "Application",
"environments": ["dev", "staging", "prod"],
"url_template": "https://{tenant}.app.{domain}",
"env_config": {
"dev": { "domain": "dev.example.com" },
"staging": { "domain": "staging.example.com" },
"prod": { "domain": "example.com" }
},
"parameters": [
{
"type": "input",
"name": "tenant",
"description": "Tenant ID",
"defaultValue": "default-tenant"
}
]
}{
"name": "Database Console",
"environments": ["dev", "prod"],
"url_template": "https://console.example.com/db/{database}?env={env}",
"env_config": {},
"parameters": [
{
"type": "select",
"name": "database",
"description": "Database to access",
"options": [
{ "label": "Users DB", "value": "users-db" },
{ "label": "Orders DB", "value": "orders-db" },
{ "label": "Analytics DB", "value": "analytics-db" }
],
"allowEmpty": false
}
]
}{
"type": "select",
"name": "database",
"description": "Database (optional)",
"options": [
{ "label": "(All databases)", "value": "" },
{ "label": "Main DB", "value": "main-db" }
],
"allowEmpty": true,
"emptyUrlTemplate": "https://console.example.com/databases"
}Placeholders in url_template are substituted in this order:
- Environment-specific values from
env_config - User parameters from parameter inputs
- Environment name using
{env}placeholder
{
"url_template": "https://{tenant}.app.{domain}/{env}/dashboard",
"env_config": {
"dev": { "domain": "dev.example.com" }
},
"parameters": [
{ "type": "input", "name": "tenant" }
]
}For environment dev with tenant acme:
→ https://acme.app.dev.example.com/dev/dashboard
# Create default config at ~/.config/qlink/config.json
qlink init
# Force overwrite existing config
qlink init --forceqlink# Replace existing config
qlink import my-links.json
# Merge with existing config
qlink import --merge my-links.json# Export to stdout
qlink export
# Export to file
qlink export --output my-links.jsonqlink listqlink validate my-links.jsonqlink --config /path/to/custom-config.jsonqlink --dry-run| Key | Action |
|---|---|
↑ / k |
Move up |
↓ / j |
Move down |
← / h |
Move left (tabs) |
→ / l |
Move right (tabs) |
Enter |
Select / Continue |
Esc |
Go back |
q |
Quit |
t |
Theme selection (project screen) |
i |
Import config |
/ |
Search (in lists) |
c |
Copy URL to clipboard |
Tab |
Next field |
Shift+Tab |
Previous field |
Space |
Toggle option |
Ctrl+C |
Force quit |
See DEVELOPMENT.md for details.
make help # Show all commands
make build # Build release
make test # Run tests
make ci # Run all checks
make bump-patch # Version bump
make publish # Publish to crates.ioMIT
