Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
# Changelog

## 1.7.0

- Add native games and desktop entries manually, with editable launch arguments.
- Choose a preferred installation for linked games and add extra GOG folders.
- Customize covers, hero images, and logos with independent resets.
- Organize several games at once and save named library filters.
- Pick a game from the current results, then decide whether to play it.
- Back up personal library choices, settings, and artwork. Preview and merge or
replace a backup, with recovery if restoring is interrupted.
- Use the new controls in Desktop and Couch Mode, including controller text entry.

## 1.6.1

- Launch, manage, and install Steam games through the Steam client itself,
Expand Down
22 changes: 21 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.24)

project(Omakade VERSION 1.6.1 LANGUAGES CXX)
project(Omakade VERSION 1.7.0 LANGUAGES CXX)

find_package(PkgConfig REQUIRED)
pkg_check_modules(SDL3 REQUIRED IMPORTED_TARGET sdl3)
Expand All @@ -17,6 +17,18 @@ find_package(Qt6 6.8 REQUIRED COMPONENTS Concurrent Core Gui Network Qml Quick Q
qt_standard_project_setup(REQUIRES 6.8)

add_library(omakade_core STATIC
src/backup/BackupArchive.cpp
src/backup/BackupArchive.h
src/backup/BackupSnapshot.cpp
src/backup/BackupSnapshot.h
src/backup/BackupDatabase.cpp
src/backup/BackupDatabase.h
src/backup/BackupRecovery.cpp
src/backup/BackupRecovery.h
src/backup/BackupManager.cpp
src/backup/BackupManager.h
src/backup/BackupStartup.cpp
src/backup/BackupStartup.h
src/achievements/AchievementModel.cpp
src/achievements/AchievementModel.h
src/achievements/RetroAchievementsApi.cpp
Expand Down Expand Up @@ -54,6 +66,8 @@ add_library(omakade_core STATIC
src/library/Pcsx2GameModel.h
src/library/RyujinxGameModel.cpp
src/library/RyujinxGameModel.h
src/library/ManualGameModel.cpp
src/library/ManualGameModel.h
src/library/MockGameModel.cpp
src/library/MockGameModel.h
src/library/SteamGameModel.cpp
Expand Down Expand Up @@ -129,6 +143,12 @@ qt_add_qml_module(omakade
qml/components/CouchBrowsePanel.qml
qml/components/GlassButton.qml
qml/components/LibraryView.qml
qml/screens/ArtworkEditor.qml
qml/screens/RestoreStartup.qml
qml/screens/BackupEditor.qml
qml/screens/SavedFiltersEditor.qml
qml/screens/BulkOrganizationEditor.qml
qml/screens/ManualGameEditor.qml
qml/screens/GameDetails.qml
)

Expand Down
23 changes: 12 additions & 11 deletions PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -846,20 +846,21 @@ Gate:

Couch mode (M6) is the headline 1.6 feature, building on this streaming work.

### After 1.6.0
### Current roadmap, September 5, 2026

PR #28 merged shared QML role-name definitions across nine game models. This
unreleased cleanup preserves all role IDs and names and passes all 41 release
tests against main. It does not change the published 1.6.0 packages.
Version 1.6.0 shipped on September 5 at `c91b14e`, including Couch Mode,
direct GOG support, ARM64 packages, dependency scanning, and release SBOMs.
The earlier milestone sections describe the development history.

Couch Mode, direct GOG support, ARM64 packages, dependency scanning, and release
SBOMs shipped in 1.6.0. The maintainer approved publication with two validation
follow-ups still open:
The active post-1.6 completion scope and acceptance gates are in
[COMPLETION-PLAN.md](docs/COMPLETION-PLAN.md), with execution evidence in
[COMPLETION-PROGRESS.md](docs/COMPLETION-PROGRESS.md). Convenience features
are local candidate work until maintainer testing and publication approval.
Real launcher reports (#9) and ARM64 hardware evidence (#13) remain open;
published packages do not establish hardware compatibility.

1. Finish the real-library compatibility matrix in issue 9, prioritizing native
and Flatpak launcher variants that are only contract-tested today.
2. Collect exact-package ARM64 hardware results in issue 13. Both architectures
pass automated checks; contributor hardware validation remains outstanding.
The shared QML role-name cleanup from PR #28 is included in the 1.7 candidate.
It preserves role IDs and names across the existing nine game models.

## Explicitly deferred

Expand Down
30 changes: 26 additions & 4 deletions PRIVACY.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ Omakade retains:

- Library, source records, favorites, hidden state, and achievements in
`$XDG_DATA_HOME/omakade/library.sqlite3`
- User-created links between duplicate installations in the same database
- User-created links and preferred installations in the same database
- Manual game titles, executable paths, arguments, working directories, and
saved filter queries in the same database
- Completion states, tags, collections, and collection memberships in the same
database
- Owned Steam App IDs, titles, and account playtime after an explicit library
Expand All @@ -25,7 +27,11 @@ Omakade retains:
reduced-motion preference in
`$XDG_CONFIG_HOME/omakade/config.toml`
- Downloaded covers and achievement icons in `$XDG_CACHE_HOME/omakade/`
- Copies of covers selected by the user in `$XDG_DATA_HOME/omakade/artwork/`
- Copies of covers, heroes, and logos selected by the user in
`$XDG_DATA_HOME/omakade/artwork/`
- Configured GOG folders and desktop/Couch Mode preferences in the settings file
- Private restore jobs and recovery copies in
`$XDG_DATA_HOME/omakade/restore-recovery/`

The Steam ID is an account identifier, not a credential. A Steam Web API key
is stored only through the desktop Secret Service under
Expand All @@ -44,6 +50,22 @@ The client secret is stored through Secret Service as
logs, or process arguments. Omakade sends these credentials to Twitch only to
obtain an app access token, then sends the token and client ID to IGDB.

## Backup and restore

Export creates a local archive at the path you choose. It includes personal
library choices, manual launch details, saved filters, custom artwork, and
supported preferences. It excludes API credentials, Omakade account-service
identifiers, game files, launcher databases, and downloaded caches. Paths and
manual arguments can contain personal information; an export is not encrypted.
Omakade does not upload it.

Restore keeps the incoming archive and a pre-restore recovery archive locally.
It also keeps an exact copy of the local settings file for interrupted-restore
recovery, so the private recovery folder can contain local account identifiers
that portable exports omit. Recovery files have owner-only access. Completed
recovery jobs are retained; they are not automatically deleted after success.
Restoring does not reconnect accounts or launch imported entries.

## Network requests

Omakade may request missing covers and achievement icons from Steam's public
Expand Down Expand Up @@ -78,5 +100,5 @@ library database for offline use.
The settings panel can clear downloaded achievement art and remove Steam,
RetroAchievements, or IGDB credentials from Secret Service. Removing Omakade does not remove its XDG
data by default, so users can preserve settings across reinstallations.
Resetting a custom cover removes Omakade's private copy and restores the
source-provided artwork. It does not change the original selected image.
Resetting a custom artwork slot removes its unused Omakade copy and restores
the source-provided artwork. It does not change the original selected image.
125 changes: 114 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ into one quiet, cover-focused home that follows the active Omarchy theme.

## Features

Omakade 1.6.1 includes:
Omakade 1.7.0 includes:

- Native and Flatpak Steam, Lutris, Heroic, Faugus, RetroArch, PCSX2, and
Ryujinx discovery, plus direct GOG installation discovery,
Expand All @@ -37,7 +37,7 @@ Omakade 1.6.1 includes:
- Optional RetroAchievements progress for supported RetroArch systems
- Optional Steam owned-library sync with installed and ready-to-install views
- Optional IGDB critic aggregates and game-length estimates
- Local, downloaded, and user-selected cover artwork
- Local, downloaded, and user-selected cover, hero, and logo artwork
- Explicit linking for games installed through multiple sources
- ProtonDB and PCGamingWiki shortcuts with actionable launch errors
- Keyboard, mouse, and controller navigation
Expand All @@ -54,8 +54,12 @@ artwork, and launching work offline. Run `omakade --demo` to explore the UI
with a deterministic fictional library.

Direct GOG discovery checks `~/GOG Games`, `~/Games/GOG`, `~/Games/Heroic`,
and immediate game folders under `~/Games`. Set `OMAKADE_GOG_LIBRARY_PATHS`
to a colon-separated list of additional library roots. Native Linux builds
and immediate game folders under `~/Games`. In Settings, use **Extra GOG Folders**
to add library folders by path or through the desktop folder picker. Saved folders
are scanned alongside the standard locations. `OMAKADE_GOG_LIBRARY_PATHS` remains
an additive, colon-separated list of extra roots. Missing folders keep their
cached games while available folders refresh. Removing a saved folder does not
delete its game files or personal library choices. Native Linux builds
launch directly; Windows game builds run on Linux through `umu-run` with an
isolated per-game prefix. Omakade itself does not run on Windows.
GOG games installed through Heroic continue to launch through Heroic.
Expand Down Expand Up @@ -90,23 +94,23 @@ verify the package, and install it. If Omakade is already installed, `pacman -U`
upgrades it in place without removing your settings or library data:

```bash
curl -fLO https://github.com/btsouth/omakade/releases/download/v1.6.1/omakade-1.6.1-1-x86_64.pkg.tar.zst
curl -fLO https://github.com/btsouth/omakade/releases/download/v1.6.1/SHA256SUMS
curl -fLO https://github.com/btsouth/omakade/releases/download/v1.7.0/omakade-1.7.0-1-x86_64.pkg.tar.zst
curl -fLO https://github.com/btsouth/omakade/releases/download/v1.7.0/SHA256SUMS
sha256sum -c SHA256SUMS --ignore-missing
sudo pacman -U ./omakade-1.6.1-1-x86_64.pkg.tar.zst
sudo pacman -U ./omakade-1.7.0-1-x86_64.pkg.tar.zst
```

### Install or upgrade from a browser download

1. Open the [latest release](https://github.com/btsouth/omakade/releases/latest).
2. Under **Assets**, download `omakade-1.6.1-1-x86_64.pkg.tar.zst` (or
`omakade-1.6.1-1-aarch64.pkg.tar.zst` for ARM64) and `SHA256SUMS` into the same folder.
2. Under **Assets**, download `omakade-1.7.0-1-x86_64.pkg.tar.zst` (or
`omakade-1.7.0-1-aarch64.pkg.tar.zst` for ARM64) and `SHA256SUMS` into the same folder.
3. Open a terminal in that folder and run the commands below. On ARM64,
replace `x86_64` with `aarch64` in the package filename:

```bash
sha256sum -c SHA256SUMS --ignore-missing
sudo pacman -U ./omakade-1.6.1-1-x86_64.pkg.tar.zst
sudo pacman -U ./omakade-1.7.0-1-x86_64.pkg.tar.zst
```

Launch Omakade from the application launcher or run `omakade` in a terminal.
Expand All @@ -132,6 +136,105 @@ Battle.net games come from the Battle.net Agent database inside a Wine, Proton,
or Bottles prefix. Omakade launches each title through that prefix's Battle.net
client. Wine, umu-launcher, or Bottles must be installed to play.

### Non-Steam games, Proton, and Steam Input

Games added to Steam as non-Steam shortcuts appear in Omakade's Steam source.
Omakade launches those shortcuts through Steam, leaving their compatibility
and controller settings with Steam. Configure and test the shortcut in Steam
first, then refresh Omakade and launch its Steam entry. If linked to another
installation, choose the Steam installation or make it the default.

A game launched through Heroic, Lutris, Faugus, or the Manual source uses that
source's launch path. Omakade does not automatically route it through Steam or
choose Steam's Proton. Steam Input and overlay behavior still depend on Steam,
the shortcut, and the game; importing a shortcut does not verify controller
compatibility. Omakade does not create or modify Steam shortcuts.

See [Steam's shortcut instructions](https://help.steampowered.com/en/faqs/view/4B8B-9697-2338-40EC).

### Add a native game manually

Open Settings and choose **Add a Game**. Select a native executable or `.desktop`
file, review its title, executable, working folder, and arguments, then save.
Each argument has its own field, including arguments containing spaces. Omakade
stores a copy of the launch details; importing does not modify the desktop entry.
Use **Edit Manual Game** in details to repair paths or remove the library entry.
Removing it never deletes the game files. Manual games support the existing
artwork, favorites, tags, collections, linking, launch history, and streaming flows.

Couch Mode supports typing and editing launch details with the on-screen keyboard;
file browsing is available in Desktop Mode. Desktop entries requiring a terminal
are not supported. Windows games should be configured in Steam, Heroic, Lutris,
or Faugus so those applications retain responsibility for their runners.

### Organize several games at once

Open **Organize** above the desktop library or in Couch Mode's **Browse** panel.
Select individual games or choose **Select Results** for the current filtered
library. Actions explicitly favorite, unfavorite, hide, unhide, set completion
status, add/remove tags, or add/remove collection membership for the selection.
Adding to a new collection creates it. Other tags and collections are retained.

Each batch is atomic: a failed write changes none of the selected games.
Selection follows game identities through sorting and rescans; if a selected
entry disappears, clear and reselect before applying changes. A successful
batch clears selection. **Clear** or **Done** cancels the selection without edits.
Bulk choices persist locally and also apply to linked installations. Tag limits
are 20 per game and 32 characters per tag.

### Save a library view

Open **Saved Filters** above the desktop library or from Couch Mode's **Browse**
panel. Enter a name and choose **Save Current** to keep the current search,
source, availability, favorites/recent/hidden mode, status, collection, tag, and
sort order. Select a saved view to rename or delete it, or choose **Apply**.
Deletion requires confirmation and leaves your current filters unchanged.

Saved filters are dynamic queries, so newly matching games appear automatically.
If a referenced collection or tag is missing, Omakade keeps that criterion and
shows a message instead of silently broadening the results. Recreating it makes
the view usable again. Saved views stay local and persist across restarts.

### Back up your library

Open **Settings → Backup & Restore**. **Save As** writes a local
`.omakade-backup` archive of your favorites, hidden choices, organization, links,
preferred installations, manual entries, custom artwork, saved filters, launch
activity, and core preferences. Game files, launcher databases, account
credentials, and downloaded caches are excluded.

Use **Open** to preview a backup, or enter a path and choose **Preview Path**.
The preview lists counts, preferences, missing paths, and saved-filter name
conflicts. **Merge** imports matching choices and keeps unrelated personal data.
**Replace** clears personal library choices before importing, while keeping game
files and cached source records. Both require confirmation. Close and reopen
Omakade to apply the queued restore; it saves a recovery copy before changing
anything. An interrupted restore can finish or be undone before the library opens.

Account-service identifiers and Sunshine publishing choices stay local. Missing
manual paths remain repairable, and disconnected game identities stay stored.
Restoring never launches imported games. In Couch Mode, confirm the path field
to use the on-screen keyboard, and use the arrows to scroll the preview.

### Pick something to play

Choose **Pick a Game** above the desktop library or in Couch Mode's **Browse**
panel. Omakade picks an available game from the current results and opens its
details for review. **Pick Another** chooses again; **Play** launches only when
you choose it. Search, source, favorites, status, collection, and tag filters
still apply. Linked installations count as one game, and the last choice is
avoided when another eligible game exists.

### Customize game artwork

Open a game's details and choose **Artwork** to change its cover, wide hero
background, or logo. Select a PNG, JPEG, or WebP file up to 32 MB. Transparent
logos are supported. Each image is copied into Omakade's data folder, so moving
the original or clearing downloaded caches does not remove your choice.
Use **Reset** beside an artwork type to restore its provider fallback without
changing the other images. Desktop Mode includes a file picker; Couch Mode can
enter an image path with the on-screen keyboard.

### Stream with Sunshine and Moonlight

Omarchy installs Sunshine from its menu and ships Moonlight. Once Sunshine is
Expand Down Expand Up @@ -185,7 +288,7 @@ toggles reduced motion and `Ctrl+D` opens settings and source diagnostics.
- Library: `~/.local/share/omakade/library.sqlite3`
- Settings: `~/.config/omakade/config.toml`
- Downloaded artwork: `~/.cache/omakade/`
- Selected custom covers: `~/.local/share/omakade/artwork/`
- Selected custom artwork: `~/.local/share/omakade/artwork/`

Core library discovery, local achievements, artwork, search, organization,
controller navigation, and launching require no Steam API key or network
Expand Down
6 changes: 5 additions & 1 deletion RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,11 @@ testing only when the maintainer explicitly authorizes that specific release.
ctest --preset release
```

3. Validate the desktop and AppStream files.
3. Validate the desktop and AppStream files. Inspect dependency scan diagnostics:
an unknown-distribution warning is not proof of a clean package. For local
x86_64 Arch SBOM scans, use `grype sbom:PACKAGE.spdx.json --distro arch:rolling
--only-fixed --fail-on high` and verify a valid vulnerability database. Keep
ARM64 distribution coverage and hardware results explicit.
4. Install into an empty staging directory and inspect every installed file.
Render visual fixtures without opening a desktop window when needed:

Expand Down
14 changes: 14 additions & 0 deletions SUPPORT.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,17 @@ private account data.
Omakade can ask Steam to begin installing an owned game. Steam remains
responsible for installation, updates, moves, and removal. Problems with those
actions belong to the launcher that owns the game.

## Manual entries and restores

For a manual game, include whether it was added as an executable or desktop
entry and the error shown. Review paths and arguments before sharing them.
Windows runner setup belongs to the launcher that owns the game.

For restore failures, include the Omakade version, merge or replace choice,
and the error shown. Keep the recovery folder while diagnosing the problem.
Do not attach the archive, database, settings file, or recovery folder to a
public report; they contain personal library data and may contain private paths
or account identifiers. The startup recovery screen offers retry or undo before
the library opens. A completed restore can be reversed by previewing its saved
recovery archive as a new restore, which also previews changes made since then.
2 changes: 2 additions & 0 deletions docs/1.6-REVIEW.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
published from `c91b14e40437a14849f37c188d5762c12655299e` after the maintainer
tested that exact installed candidate and approved publication.

Current work is tracked in [COMPLETION-PLAN.md](COMPLETION-PLAN.md).

Both architecture jobs passed in the
[final release workflow](https://github.com/btsouth/omakade/actions/runs/33939075319).
Downloaded packages, SBOMs, source, and PKGBUILD passed checksum and signed
Expand Down
Loading
Loading