Elephant - cuz it's phat - is a powerful data provider service and backend for building custom application launchers and desktop utilities. It provides various data sources and actions through a plugin-based architecture, communicating via Unix sockets and Protocol Buffers.
Elephant acts as a unified backend service that aggregates data from various sources (desktop applications, files, clipboard history, etc.) and provides a consistent interface for frontend applications like custom launchers, productivity tools, or desktop widgets.
-
Desktop Applications
- Auto-detection of
uwsm
orapp2unit
- Application launch history
- Desktop entry parsing
- Auto-detection of
-
Files
- File preview (text/image)
- File operations: open, copy path, copy content
- Directory navigation
-
Bluetooth
- basic bluetooth management
- connect/disconnect
- trust/untrust
- pair/remove
-
Clipboard
- Text and image clipboard history
- Clipboard content management
- post-edit text content
-
Runner
- Command execution from explicit lists
$PATH
scanning for executables
-
Symbols/Emojis
- Multi-locale emoji and symbol support
- Unicode character database
-
Calculator/Unit Conversion
- Mathematical calculations with history
- Unit conversion using
qalc
-
Custom Menus
- User-defined menu creation
- Custom action definitions
-
Provider List
- Dynamic listing of all loaded providers and menus
-
Websearch
- ... define custom search engines
-
Archlinux Packages
- list all packages: official and AUR
- list all explicitly installed packages
i:
- remove / install packages (pacman, yay/paru)
-
Todo List
- add items, mark as active/done, clear done items
- create items with due times
- notifications
-
Unicodes
- find unicode symbols
-
Windows
- find and focus windows
-
Snippets
- find and paste text snippets
yay -S elephant
# Providers, f.e.
yay -S elephant-desktopapplications
# Clone the repository
git clone https://github.com/abenz1267/elephant
cd elephant
# Build and install the main binary
cd cmd/elephant
go install elephant.go
# Create configuration directories
mkdir -p ~/.config/elephant/providers
# Build and install a provider (example: desktop applications)
cd internal/providers/desktopapplications
go build -buildmode=plugin
cp desktopapplications.so ~/.config/elephant/providers/
It is utterly important that elephant
runs in the appropriate environment. Starting a system-level systemd service f.e. will lead to missing environment variables. It needs to run with the users environment.
On a systemd
based system, you can use elephant service enable/disable
to manage a service.
The service file will be placed in ~/.config/systemd/user/elephant.service
.
Feel free to create your own service file/adjust the one created.
# Start elephant with default configuration
elephant
# Start with debug logging
elephant --debug
# Use custom configuration directory
elephant --config /path/to/config
Elephant includes a built-in client for testing and basic operations:
# Query provider (providers;query;limit;exactsearch)
elephant query "files;documents;10;false"
# activate item (provider;identifier;action;query;arguments)
elephant activate "files;<identifier>;open;;"
# List all installed providers
elephant listproviders
# Open a custom menu, requires a subscribed frontend.
elephant menu "screenshots"
# Show version
elephant version
# Generate configuration documentation
elephant generatedoc
# Systemd service management
elephant service enable/disable
Elephant uses a configuration directory structure:
~/.config/elephant/
├── elephant.toml # Main configuration
├── .env # Environment variables
└── <provider>.toml # Provider config
Elephant uses Unix domain sockets for IPC and Protocol Buffers for message serialization. The main message types are:
- Query Messages: Request data from providers
- Activation Messages: Execute actions
- Menu Messages: Request custom menu data
- Subscribe Messages: Listen for real-time updates
To integrate with Elephant, your application needs to:
- Connect to the Unix socket (typically at
/tmp/elephant.sock
) - Send Protocol Buffer messages
- Handle responses and updates
See the pkg/pb/
directory for Protocol Buffer definitions.
elephant/
├── cmd/ # Main application entry point
├── internal/
│ ├── comm/ # Communication layer (Unix sockets, protobuf)
│ ├── common/ # Shared utilities and configuration
│ ├── providers/ # Data provider plugins
│ └── util/ # Helper utilities
├── pkg/pb/ # Protocol Buffer definitions
└── flake.nix # Nix development environment
Providers are Go plugins that implement the provider interface. See existing providers in internal/providers/
for examples.
# Clone repository
git clone https://github.com/abenz1267/elephant
cd elephant
# Install dependencies
go mod download
# Build main binary
go build -o elephant cmd/elephant.go
# Run tests
go test ./...
A Nix flake is provided for reproducible development:
nix develop
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
Please ensure your code follows Go best practices and includes appropriate documentation.
This project is licensed under the GNU General Public License v3.0. See LICENSE for details.