Add Achievements to Any Linux Game: A Practical Guide for Power Users
Hands-on guide for power users to add achievements to Flatpak, Proton, and Lutris Linux games using open-source injectors and achievement packs.
Add Achievements to Any Linux Game: A Practical Guide for Power Users
If you play indie games or keep a library of non-Steam titles on Linux, the idea of retrofitting achievements can be irresistible. A small but growing community has built open source tools that inject achievement systems into games that never shipped them. This hands-on walkthrough explains how those tools work, compatibility tips, common pitfalls, and how to integrate achievements into Flatpak, Proton (Steam), and Lutris installs. It also includes practical steps you can follow today and suggestions for developers who want to make their games achievement-friendly.
How the community tools work (the short version)
Most community-made achievement systems for Linux use one or more of the following techniques:
- Library injection (LD_PRELOAD or equivalent) to intercept game functions or graphics API calls.
- Memory polling or scripted event hooks (Lua/Python scripts) that check game state and fire achievement events.
- Overlay and notification components that display achievements when triggered.
- Small local servers or IPC (Unix sockets) to bridge the game and the achievement service.
These tools are usually open source and shipped as a small runtime plus a JSON/YAML config or script that defines achievements. They are intentionally generic so they can be adapted to many indie games or to older titles lacking any built-in achievement API.
Before you start: prerequisites and safety
- Linux distribution with development utilities (gcc, ldd, file) for basic diagnostics.
- Familiarity with terminal commands and editing text files.
- Access to the game’s executable (you need to modify the launcher, not the binary).
- Backups of save files — injection and scripting can occasionally corrupt saves if something goes wrong.
Quick architecture overview (what you will add)
- Achievement runtime (shared library + notifier).
- Achievement definitions (JSON or Lua describing goals and triggers).
- Launcher modifications to preload the injector and start the notifier.
Step-by-step: Adding achievements to a non-Steam native Linux game
Below is a generic, reproducible flow. Replace placeholders with paths for your tool and game binary.
1. Download the tool and read the README
Clone the project from its Git repository (most of these projects live on GitHub/GitLab). Confirm the README mentions Linux and the supported architectures (32/64-bit).
2. Install the notifier and injector runtime
Many projects ship a compiled .so and a small notifier app. Place the .so somewhere persistent, for example /opt/achiever/libachieve.so, and make the notifier executable available on your PATH.
3. Create a simple achievement definition
Most systems use JSON or Lua to describe goals. Example JSON snippet:
{
"achievements": [
{"id": "first_blood", "title": "First Blood", "description": "Defeat any enemy", "trigger": {"type": "memory_watch", "address": "0x7ffdf000", "value": 1}}
]
}
Place this as achievements.json in the runtime's config folder. The runtime will either poll memory or invoke your script hooks.
4. Launch the game with the injector (LD_PRELOAD)
Open a terminal and run:
LD_PRELOAD='/opt/achiever/libachieve.so' /path/to/game/executable
If you see the notifier appear or a log file at ~/.cache/achiever/log.txt, the runtime loaded successfully.
Integrating with Proton (Steam)
For Proton/Steam games or when using the Steam client for non-Steam titles, injection must run inside the Proton prefix. You can do this by editing the game's launch options.
- Right-click the game in Steam → Properties → Launch Options.
- Prepend the injector:
LD_PRELOAD='/home/user/.local/share/achiever/libachieve.so' %command%. - For 32-bit Proton prefixes running 64-bit hosts, make sure you have the matching architecture of the .so (32-bit vs 64-bit).
Note: Some Proton/Wine wrappers aggressively sandbox or override LD_PRELOAD. If the injector fails to load, try adding WINEDLLOVERRIDES= or consult the wrapper’s documentation. Also test in a Proton-prefix-only non-Steam shortcut before pushing to production.
Flatpak-specific notes
Flatpak apps run in a sandbox which blocks direct LD_PRELOAD from the host. Two options exist:
- Use
flatpak override --env=LD_PRELOAD=/app/lib/libachieve.so --talk-name=com.achiever.Notifier com.example.Gameto set environment variables for the specific Flatpak app. - Copy the injector into the Flatpak runtime path (advanced and not recommended unless you know the runtime structure).
Example override command:
flatpak override --env=LD_PRELOAD='/home/user/.local/share/achiever/libachieve.so' com.example.Game
Remember that Flatpak uses strict filesystem namespaces — provide explicit permissions if your notifier needs to write logs or communicate over the network: flatpak override --user --filesystem=home.
Lutris: the easiest place to set environment variables
Lutris exposes environment and runner options per-game, making it an excellent launcher for achievement injection.
- Open Lutris, right-click your game → Configure.
- Under the Runner options or System options, add environment variable:
LD_PRELOAD=/home/user/.local/share/achiever/libachieve.so. - Point the working directory and prefix to your configured Wine/Proton runner if required.
Lutris also shows logs in the UI; use that to confirm the library loads and the notifier spawns.
Compatibility tips and common pitfalls
- 32-bit vs 64-bit mismatch: If the game is 32-bit, inject a 32-bit library. Use
file /path/to/libachieve.soandfile /path/to/gameto check architectures. - Vulkan vs OpenGL: Graphics API hooks differ — some injectors target Vulkan, others OpenGL/DirectX via DXVK. If overlay notifications don’t render, try switching an overlay backend in the runtime config.
- Sandboxing: Flatpak and strict Proton builds may block LD_PRELOAD. Use the override methods described earlier.
- Performance: Aggressive memory polling can impact CPU usage. Prefer event callbacks or polling at lower frequency.
- False positives: When you use memory watches, offsets can shift between game versions. Use symbol-based hooks or checksum your target addresses.
Quick troubleshooting checklist
- Confirm the injector .so matched the game architecture: run
fileon both. - Check the injector’s log files:
~/.cache/achiever/or~/.local/share/achiever/log.txt. - Run the game from a terminal to see stderr messages from the library.
- Try a minimal achievement that triggers immediately (e.g., on startup) to confirm the notifier works.
- If using Proton, test the injector in a simple native Linux binary to verify LD_PRELOAD behavior outside Wine.
- Use tools like
ldd,strace, orltraceto inspect loading and calls if advanced debugging is needed.
Practical examples for indie games
Indie games with simple state variables (health, kills, flags) are the easiest to extend. Look for:
- Simple integer counters in memory (health, score).
- Player state flags (level complete, boss defeated).
- Text logs or save JSON you can parse for events.
For games that write human-readable saves (JSON/XML), a small file-watcher approach is often more stable than memory hooks: detect when a save file changes and parse it for milestone values.
Suggestions for game developers
If you’re a developer and want your game to be achievement-friendly for community projects, consider these low-friction hooks:
- Expose a simple IPC endpoint (Unix socket) that emits events like
player_killed_bossorlevel_completed. - Add an optional debug build flag that writes a stream of events to a local file or STDOUT for external tools to consume.
- Document key save fields and public addresses (for native builds) so modders can create stable watchers across versions.
- Provide a basic plugin API (C ABI or scripting hooks) that achievement runners can call into.
These measures make it easier for communities to build achievement packs while preserving player privacy and game integrity.
Where to look for achievement packs and mods
Search the project’s GitHub/GitLab issues and community forums. Achievement packs are often shared as JSON files or small repositories. For inspiration and community discussions, check gaming culture and tooling topics on sites like our coverage about soundtracks and game design (Beyond The Screens) or the broader implications of tooling and AI in gaming (AI in Gaming).
Final notes and ethical considerations
Community achievement tools are powerful, but use them responsibly. Avoid enabling anything that modifies game logic unfairly in multiplayer games or that violates a publisher’s terms of service. Focus on single-player and indie titles, add value to your playthroughs, and contribute back by documenting your achievement definitions and test results.
With modest effort — a few minutes to set environment variables and a few hours to write or adapt triggers — you can breathe new life into older or indie games with non-Steam achievements. If you build a stable achievement pack for a game, consider sharing it with the community to help others enjoy the same goals and challenges.
Useful next steps
- Clone the achievement tool repository and run a quick test with a native small demo.
- Create one trivial achievement that triggers on startup to verify notifier visibility.
- Share results and configs with community threads for feedback and compatibility tips.
If you liked this practical guide, explore more about how games influence culture and tools on our site: From Movie Reviews to Game Scores.
Related Topics
Unknown
Contributor
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
Top 5 Gaming Accessories to Enhance Your Setup: Light Up Your Game Room
Price Drops and Game Deals: Your Go-To Guide for 2026
Seasonal Gaming Comfort: The Best Bedding for Late-Night Sessions
The Surprising Health Risks of Gaming: Keto and Rashes - What You Need to Know
Behind the Scenes: The Future of Gaming Film Production in India
From Our Network
Trending stories across our publication group