How to Add Achievements to Any Game on Linux (A Practical Guide)
Practical step-by-step guide to add achievements and leaderboards to non-Steam games on Linux using open-source tools, with privacy and troubleshooting tips.
Achievements are a small but powerful motivator in games. If you run Linux and play outside of the Steam ecosystem, it's easy to feel left out of that little dopamine loop. Fortunately, the community has built open-source tools that let you add achievement support to non-Steam games on Linux — by watching game state, exposing achievement rules, and optionally syncing scores to leaderboards. This guide walks you step-by-step through installing, configuring, testing, and troubleshooting achievement support for your favorite titles.
Who this guide is for
This walkthrough targets Linux gamers and indie server hosts who want to add achievements to windows-native games or native Linux titles that have no built-in achievement system. Prior experience with the terminal, editing small JSON/YAML files, and basic networking helps, but I’ll explain every actionable step clearly.
Overview: How the toolchain works
At a high level, the open-source achievement toolkit contains three parts:
- A local daemon or injector that observes the game and exposes an API (often via a small overlay or a socket).
- A manifest file that defines achievements (IDs, names, descriptions, trigger conditions, and rewards).
- Optional server-side components for leaderboards, syncing, and multi-device tracking.
We’ll cover local-only setups (privacy-friendly) and server-backed leaderboards (for competitions and community leaderboards).
Before you start: prerequisites
Gather these first so setup goes smoothly.
- A Linux desktop (Debian/Ubuntu, Fedora, Arch, etc.) with developer tools installed.
- Git, build tools (gcc/make or equivalent), and Python/Node.js if the project uses them.
- Access to the game binary or the game's running process.
- Basic familiarity with editing text files and running commands as your user (avoid using root unless required by a package install).
Step-by-step: Install the achievement tool
Exact commands vary by project. This is a generic flow you can adapt.
- Clone the project:
git clone 'https://github.com/example/achievement-tool.git' - Read the README. Most projects list dependencies and build steps. Install deps with your distro's package manager (apt, dnf, pacman).
- Build or install:
cd achievement-tool && make && sudo make installorpip3 install -r requirements.txtfor Python tools. - Start the daemon locally:
achievementd --config '~/.config/achievements/config.yaml'or follow the project's systemd user unit.
Note: Some tools use LD_PRELOAD to hook into game APIs. For those, use the wrapper the project provides, for example:
LD_PRELOAD=~/.local/lib/libachievement.so ./MyGameBinary
Step 1: Create an achievement manifest
Achievements are defined in a simple JSON or YAML file. Here’s a minimal JSON example to get started:
{
'achievements': [
{
'id': 'first_win',
'name': 'First Victory',
'description': 'Win your first match',
'condition': {
'event': 'match_end',
'field': 'outcome',
'equals': 'win'
}
},
{
'id': 'speed_run_10',
'name': 'Speed Run: 10min',
'description': 'Finish the level in under 10 minutes',
'condition': {
'event': 'level_complete',
'field': 'time_seconds',
'less_than': 600
}
}
]
}
Common trigger types: event-based (match_end), stat-thresholds (score >= 10000), and sequence detection. The project documentation will show exact condition syntax.
Step 2: Hook the game to send events
The tool needs a way to learn game state. Typical approaches:
- Read game logs: Many games write logs to disk. The daemon can tail those files and parse structured lines.
- Memory reads: The injector reads specific memory addresses (advanced).
- API bridging: If the game supports scripting (Lua/console commands), add a small script that posts JSON to the daemon's socket.
Example: Add a tiny Lua snippet to your game config that does an HTTP POST of events to http://localhost:12345/event. The achievement daemon will receive this and evaluate conditions.
Step 3: Test achievements locally
- Start the daemon in verbose/log mode:
achievementd --log-level debug. - Run the game with the wrapper (if required) so the daemon receives events.
- Trigger the condition in-game and look for a log message like: 'achievement unlocked: first_win'.
- Fix condition definitions if no unlock occurs — check event payload names and types.
Optional: Add leaderboards
If you want leaderboards, decide whether to self-host or use a hosted service. Options include a tiny Node/SQLite app, Firebase, or an open-source leaderboard backend. Key design points:
- Store only what you need: username (or alias), achievement IDs, timestamps, and numeric scores.
- Rate-limit submissions and use simple anti-cheat measures (validate scores against known maximums, or require server-side replay checks if possible).
- Expose a small REST API:
POST /submit,GET /leaderboard?achv=score_run.
For tournaments or esports communities, leaderboards become more useful. If you're interested in streaming or competition, check our guide on Game Streaming: The New Frontier for Competitive Esports Events for ways to integrate overlays and alerts.
Privacy and security considerations
Achieving a balance between rich features and user privacy is crucial.
- Local-first: Prefer local-only storage where possible. The daemon should support an option to never upload data unless the user explicitly opts in.
- Minimize data: Avoid collecting personal data (email, IPs) when not needed. Use unique non-identifying handles for leaderboards.
- Open-source code: Run code you can audit. If using third-party services, review their privacy policy and hosting location.
- Sandboxing: When hooking Windows games through Wine/Proton/Steam Play, be careful with permissions and Flatpak sandboxes — ensure the injector only has the access it needs.
Troubleshooting: Common issues and fixes
Daemon doesn't start
Check logs, confirm dependencies, and run with --debug. Verify the port/socket isn't already used.
No events received
Confirm the game is sending events: tail game log files or use netcat to listen on the configured port. If using LD_PRELOAD, ensure you're targeting the correct binary (32-bit vs 64-bit mismatch is common).
Achievements fire at the wrong time
Validate the event payload structure. Sometimes JSON keys differ between versions. Use verbose logging to compare real events with expected condition fields.
Flatpak / Snap sandbox prevents hooking
When a game is installed as a sandboxed package, it may block injection. Use a native binary or run a non-sandboxed version to test. For Flatpak, explore Flatseal to grant temporary permissions but be cautious about security.
Leaderboards show suspicious high scores
Implement server-side validation and rate limits. Consider requiring small replays or checksums for high-value submissions in competitive environments.
Advanced tips and integrations
- Overlay notifications: Use desktop notifications or an in-game overlay that listens to the daemon and shows popups on unlock.
- Cross-device sync: Pair the daemon with a lightweight server to persist achievements across machines. Use OAuth or token-based auth for privacy.
- Esports-ready mode: For tournaments, add spectator-safe leaderboards and live scoring endpoints so broadcast overlays can pull up-to-date ranks. If you run events, our Ultimate Guide to Gaming Events has best practices for live scoring and scheduling.
- Community-driven achievements: Let community members propose achievements, then vet and add them. This increases engagement and longevity.
Example: Minimal local-only setup checklist
- Clone and install the achievement daemon locally.
- Create a local manifest file with 10 starter achievements.
- Instrument the game to emit JSON events (log parsing, Lua hook, or wrapper).
- Run the game with the wrapper and trigger each achievement while watching logs.
- Enable desktop notifications for unlocks.
Final thoughts
Adding achievements to non-Steam games on Linux is perfectly achievable with available open-source tools and a little configuration work. Whether you want achievements for your private builds, community servers, or competitive leaderboards, the patterns are similar: instrument game events, declare clear achievement rules, and decide whether to keep data local or sync it for global ranking. For competitive players and esports fans, achievements and leaderboards can increase replay value and encourage better play — and if you're looking for competitive titles or practice routines, see our pieces on Top 10 Esports Strategies and Best Games to Test Your Competitive Spirit.
If you want a walkthrough tailored to a specific game or tool (Proton titles, Wine, or a particular achievement project on GitHub), reply with the game name and your distro and I’ll provide commands and a manifest template you can paste straight into your setup.
Related Topics
Jamie Rivers
Senior SEO Editor
Senior editor and content strategist. Writing about technology, design, and the future of digital media. Follow along for deep dives into the industry's moving parts.
Up Next
More stories handpicked for you
How to Build a Rivalry That Actually Draws: What MMA’s Best Cards Teach Esports Organizers
Health Trackers: The New Lifeline for Gamers
Emulator UX: Why In-Game, Tweakable UIs Matter for Handheld Gamers
Sundance Moments that Inspired This Year’s Top Indie Games
RPCS3 on Steam Deck: The Ultimate In-Game UI Tweaks for Portable PS3 Emulation
From Our Network
Trending stories across our publication group