Reported to support first; they recommended opening an issue here.
Summary
On Linux, the Modrinth App 0.18.0 aborts about 1.5 s after launch with SIGABRT, showing no window and no error message. The frontend issues commands before initialize_state has finished, and the resulting panic is not survivable.
thread 'tokio-rt-worker' panicked at packages/app-lib/src/event/mod.rs:66:14:
should be initialized when used
Environment
|
|
| Modrinth App |
0.18.0 (Arch/AUR modrinth-app 0.18.0-1.1) |
| OS |
CachyOS (Arch-based), kernel 7.2.0 |
| Session |
Wayland (KDE Plasma) |
| WebKitGTK |
2.52.6-1 |
| GPU |
AMD Radeon RX 9070 XT, Mesa 26.2.1 |
What happens
Clicking the application entry does nothing at all — no window, no error message. The process starts, aborts after roughly 1.5 seconds with exit code 134, and writes a core dump. Because nothing appears on screen, there is no indication of what went wrong.
It is a race, and both outcomes look identical at first
A failing start:
INFO theseus_gui: Initializing app...
ERROR get_game_version_tags: theseus::state: Attempted to get state before
it is initialized - this should never happen!
ERROR get_loader_tags: theseus::state: Attempted to get state before it is
initialized - this should never happen!
<process aborts>
A successful start produces the exact same two errors, but survives because initialize_state completes moments later:
ERROR get_game_version_tags: ... Attempted to get state before it is initialized
ERROR get_loader_tags: ... Attempted to get state before it is initialized
INFO initialize_state: theseus_gui: Initializing app event state...
INFO initialize_state: theseus::state: Connecting to app database
So those two error lines occur on every start. Whether the app survives them is a race between the WebView issuing its first commands and initialize_state finishing.
What appeared to decide the race: database open time
Measured from log timestamps between Connecting to app database and Fetching app settings:
| Database open |
Situation |
Result |
| 376 ms |
first ever launch, migrating settings version 1 → 3 |
crash |
| 8 ms |
immediately afterwards, migration already done |
success |
Later the same day the crash returned. By then app.db had grown from a few KB to 20.7 MB (5583 rows in the cache table). After running VACUUM on it (20.7 MB → 18.9 MB), the app started successfully 8 times in a row, from both the desktop entry and the command line.
To be precise: this is a correlation observed on a single machine, not proof. Since it is a race, individual runs can go either way. But the pattern was consistent — the slower the database opened, the more reliably it crashed.
Why this can lock a user out completely
On a fresh installation the failure is self-perpetuating:
- The settings migration (version 1 → 3) makes the first launch slow.
- The slow launch loses the race and aborts.
- The abort leaves the migration unfinished, so the next launch runs the same slow migration — and fails the same way.
I only escaped this loop by starting the app from a terminal and leaving it running long enough for the migration to complete. Clicking the icon would never have resolved it, and nothing on screen suggests otherwise.
Steps to reproduce
- Start with a fresh profile directory (no existing
app.db)
- Launch the Modrinth App from the desktop entry
- It aborts within ~2 seconds, no window appears
- Repeat — it keeps failing, because the migration never completes
How easily this reproduces depends on how quickly the database opens, so slower storage or a larger app.db should make it more likely.
Suggestion
Rather than panicking, commands that reach an uninitialised state could wait for initialisation, or return an error the frontend can retry. The two Attempted to get state before it is initialized messages show the condition is already detected — it just is not survivable right now.
Panic with stack trace (from the systemd journal)
thread 'tokio-rt-worker' (479389) panicked at packages/app-lib/src/event/mod.rs:66:14:
should be initialized when used
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Process 479350 (modrinth-app) of user 1000 dumped core.
Stack trace of thread 479389:
#0 0x00007f3c0aeaf2eb pthread_kill (libc.so.6 + 0xaf2eb)
#1 0x00007f3c0ae44b88 raise (libc.so.6 + 0x44b88)
#2 0x00007f3c0ae257a7 abort (libc.so.6 + 0x257a7)
#3 0x000055a6e3d1b74a n/a (modrinth-app + 0x1c8674a)
#4 0x000055a6e3cf4619 n/a (modrinth-app + 0x1c5f619)
#5 0x000055a6e3d1cca9 n/a (modrinth-app + 0x1c87ca9)
#6 0x000055a6e39fe889 n/a (modrinth-app + 0x1969889)
#7 0x000055a6e3cf4659 n/a (modrinth-app + 0x1c5f659)
Logs
All four runs, scrubbed: authentication codes, account identifiers, username paths and the hostname were replaced with placeholders.
The very first launch — aborts after two log lines (1-crash-first-launch.log)
2026-08-31T09:12:55.047062128+02:00 INFO theseus_gui: Initialized tracing subscriber. Loading Modrinth App!
2026-08-31T09:12:55.053562584+02:00 INFO theseus_gui: Initializing app...
A successful start: 376 ms database open, with the settings migration (2-success-with-settings-migration.log)
2026-08-31T09:45:31.604615701+02:00 INFO theseus_gui: Initialized tracing subscriber. Loading Modrinth App!
2026-08-31T09:45:31.610693068+02:00 INFO theseus_gui: Initializing app...
2026-08-31T09:45:32.105331698+02:00 ERROR get_game_version_tags: theseus::state: Attempted to get state before it is initialized - this should never happen!
2026-08-31T09:45:32.105397232+02:00 ERROR get_loader_tags: theseus::state: Attempted to get state before it is initialized - this should never happen!
2026-08-31T09:45:32.106840342+02:00 INFO initialize_state: theseus_gui: Initializing app event state...
2026-08-31T09:45:32.106892501+02:00 INFO initialize_state: theseus_gui: Initializing app state...
2026-08-31T09:45:32.106901929+02:00 INFO initialize_state:initialize_state{app_identifier="ModrinthApp"}: theseus::state: Connecting to app database
2026-08-31T09:45:32.482177546+02:00 INFO initialize_state:initialize_state{app_identifier="ModrinthApp"}: theseus::state: Fetching app settings
2026-08-31T09:45:32.482272045+02:00 INFO initialize_state:initialize_state{app_identifier="ModrinthApp"}: theseus::state: Initializing directories
2026-08-31T09:45:32.486923644+02:00 INFO initialize_state:initialize_state{app_identifier="ModrinthApp"}: theseus::state: Initializing file watcher
2026-08-31T09:45:32.487619941+02:00 INFO init_watcher: theseus::state::instances::watcher: Initing watcher
2026-08-31T09:45:32.593629807+02:00 INFO theseus_gui::api::utils: opening command None
2026-08-31T09:45:32.613985724+02:00 ERROR theseus_gui::error: error=User is not logged in, no credentials available! span_trace= 0: theseus::api::minecraft_skins::get_available_capes
at packages/app-lib/src/api/minecraft_skins.rs:265
2026-08-31T09:45:32.699941864+02:00 INFO theseus::state::settings: Migrating settings version 1 to 3
An abort after app.db had grown to 20.7 MB (3-crash-with-20MB-database.log)
2026-09-01T17:12:15.267852802+02:00 INFO theseus_gui: Initialized tracing subscriber. Loading Modrinth App!
2026-09-01T17:12:15.281332286+02:00 INFO theseus_gui: Initializing app...
2026-09-01T17:12:15.862411661+02:00 ERROR get_game_version_tags: theseus::state: Attempted to get state before it is initialized - this should never happen!
2026-09-01T17:12:15.862516889+02:00 ERROR get_loader_tags: theseus::state: Attempted to get state before it is initialized - this should never happen!
A successful start after running VACUUM on app.db (4-success-after-vacuum.log)
2026-09-01T17:21:51.580533027+02:00 INFO theseus_gui: Initialized tracing subscriber. Loading Modrinth App!
2026-09-01T17:21:51.585414440+02:00 INFO theseus_gui: Initializing app...
2026-09-01T17:21:52.033252886+02:00 ERROR get_game_version_tags: theseus::state: Attempted to get state before it is initialized - this should never happen!
2026-09-01T17:21:52.033359927+02:00 ERROR get_loader_tags: theseus::state: Attempted to get state before it is initialized - this should never happen!
2026-09-01T17:21:52.034731290+02:00 INFO initialize_state: theseus_gui: Initializing app event state...
2026-09-01T17:21:52.034771595+02:00 INFO initialize_state: theseus_gui: Initializing app state...
2026-09-01T17:21:52.034777216+02:00 INFO initialize_state:initialize_state{app_identifier="ModrinthApp"}: theseus::state: Connecting to app database
2026-09-01T17:21:52.039756974+02:00 INFO initialize_state:initialize_state{app_identifier="ModrinthApp"}: theseus::state: Fetching app settings
2026-09-01T17:21:52.039848075+02:00 INFO initialize_state:initialize_state{app_identifier="ModrinthApp"}: theseus::state: Initializing directories
2026-09-01T17:21:52.039930991+02:00 INFO initialize_state:initialize_state{app_identifier="ModrinthApp"}: theseus::state: Initializing file watcher
2026-09-01T17:21:52.040007305+02:00 INFO init_watcher: theseus::state::instances::watcher: Initing watcher
2026-09-01T17:21:52.206900332+02:00 INFO theseus_gui::api::utils: opening command None
2026-09-01T17:21:52.684785048+02:00 INFO connect: theseus::state::friends: Connected to friends socket
2026-09-01T17:21:53.243662122+02:00 INFO init_watcher: theseus::state::instances::watcher: World updated: /home/user/.local/share/ModrinthApp/profiles/Fabric 1.21.4/saves/Neue Welt/level.dat
2026-09-01T17:21:53.243952178+02:00 INFO init_watcher: theseus::state::instances::watcher: World updated: /home/user/.local/share/ModrinthApp/profiles/Fabulously Optimized (1)/saves/Neue Welt/level.dat
2026-09-01T17:21:54.249674116+02:00 INFO init_watcher: theseus::state::instances::watcher: World updated: /home/user/.local/share/ModrinthApp/profiles/Fabulously Optimized (1)/saves/Neue Welt/level.dat
2026-09-01T17:21:54.249733578+02:00 INFO init_watcher: theseus::state::instances::watcher: World updated: /home/user/.local/share/ModrinthApp/profiles/Fabric 1.21.4/saves/Neue Welt/level.dat
2026-09-01T17:21:54.249980193+02:00 INFO init_watcher: theseus::state::instances::watcher: World updated: /home/user/.local/share/ModrinthApp/profiles/Fabulously Optimized (1)/saves/Neue Welt/level.dat
I deliberately did not attach the core dumps — they contain full process memory including session tokens — but can produce one privately if that would help.
Reported to support first; they recommended opening an issue here.
Summary
On Linux, the Modrinth App 0.18.0 aborts about 1.5 s after launch with
SIGABRT, showing no window and no error message. The frontend issues commands beforeinitialize_statehas finished, and the resulting panic is not survivable.Environment
modrinth-app 0.18.0-1.1)What happens
Clicking the application entry does nothing at all — no window, no error message. The process starts, aborts after roughly 1.5 seconds with exit code 134, and writes a core dump. Because nothing appears on screen, there is no indication of what went wrong.
It is a race, and both outcomes look identical at first
A failing start:
A successful start produces the exact same two errors, but survives because
initialize_statecompletes moments later:So those two error lines occur on every start. Whether the app survives them is a race between the WebView issuing its first commands and
initialize_statefinishing.What appeared to decide the race: database open time
Measured from log timestamps between
Connecting to app databaseandFetching app settings:Later the same day the crash returned. By then
app.dbhad grown from a few KB to 20.7 MB (5583 rows in the cache table). After runningVACUUMon it (20.7 MB → 18.9 MB), the app started successfully 8 times in a row, from both the desktop entry and the command line.To be precise: this is a correlation observed on a single machine, not proof. Since it is a race, individual runs can go either way. But the pattern was consistent — the slower the database opened, the more reliably it crashed.
Why this can lock a user out completely
On a fresh installation the failure is self-perpetuating:
I only escaped this loop by starting the app from a terminal and leaving it running long enough for the migration to complete. Clicking the icon would never have resolved it, and nothing on screen suggests otherwise.
Steps to reproduce
app.db)How easily this reproduces depends on how quickly the database opens, so slower storage or a larger
app.dbshould make it more likely.Suggestion
Rather than panicking, commands that reach an uninitialised state could wait for initialisation, or return an error the frontend can retry. The two
Attempted to get state before it is initializedmessages show the condition is already detected — it just is not survivable right now.Panic with stack trace (from the systemd journal)
Logs
All four runs, scrubbed: authentication codes, account identifiers, username paths and the hostname were replaced with placeholders.
The very first launch — aborts after two log lines (
1-crash-first-launch.log)A successful start: 376 ms database open, with the settings migration (
2-success-with-settings-migration.log)An abort after app.db had grown to 20.7 MB (
3-crash-with-20MB-database.log)A successful start after running VACUUM on app.db (
4-success-after-vacuum.log)I deliberately did not attach the core dumps — they contain full process memory including session tokens — but can produce one privately if that would help.