Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
a3c2d21
refactor: split monolithic lib.rs and extract frontend hooks
Oost-hash Sep 16, 2026
6b6f718
refactor: platform abstraction layer + OCR module split
Oost-hash Sep 16, 2026
aaacb10
fix: decouple game detection from blob scan success
Oost-hash Sep 16, 2026
3e27f35
Merge branch 'feat/lib-refactor-squash' into feat/backend-refactor
Oost-hash Sep 20, 2026
78f46ac
fix: preserve v4.4 behavior after backend merge
Oost-hash Sep 20, 2026
325fb1f
Merge upstream PR 75 (backend modularization)
Lyrex Sep 20, 2026
5a0c2eb
fix: resolve PR review feedback from Lyrex
Oost-hash Sep 20, 2026
b110dd0
fix: suppress unchanged inventory status
Oost-hash Sep 20, 2026
03e67da
fix: address second round of PR review feedback
Oost-hash Sep 21, 2026
5528494
Merge upstream PR 75 (revised platform traits)
Lyrex Sep 21, 2026
59eb817
Merge upstream PR 75 (region source with chunking and filters)
Lyrex Sep 21, 2026
eaaaa42
refactor: modularize the Tauri backend
Sikewyrm Sep 22, 2026
85c51e6
Bump version to 4.4.1 (beta build with modularized backend)
Sikewyrm Sep 22, 2026
e0ab70f
fix: recover component names after WFCD dropped components[].name
Sikewyrm Sep 24, 2026
4c7330e
fix: resolve component names by uniqueName only, not raw JSON text
Sikewyrm Sep 24, 2026
843c437
fix: don't let the first blob candidate win a stitching race, pick th…
Sikewyrm Sep 24, 2026
d46943f
Bump version to 4.4.2
Sikewyrm Sep 24, 2026
d40bb34
fix: derive component name suffixes word-by-word, not by raw prefix s…
Sikewyrm Sep 24, 2026
1442b1c
fix: recover component ducat values dropped by WFCD's components[] sc…
Sikewyrm Sep 24, 2026
3801c05
Bump version to 4.4.3
Sikewyrm Sep 24, 2026
7c3351a
fix(mem_regions): read the map once per walk, keep regions past a fault
Lyrex Sep 24, 2026
b1f762e
Data-ingest consolidation (phases 1-4), v4.4.6, contributor workflow
Sikewyrm Sep 27, 2026
26dd18b
Mark MiscAccountData as a volatile blob section, bump to 4.4.7
Sikewyrm Sep 27, 2026
b950124
Name components by uniqueName lookup, fix Neuroptics shown as Helmet,…
Sikewyrm Sep 28, 2026
f709769
Fix trade detection and part/blueprint icons, bump to 4.4.9
Sikewyrm Sep 28, 2026
4add56d
fix: wrap grouped command args in params and accept camelCase keys (#77)
Oost-hash Sep 29, 2026
bc18c62
Bump version to 4.4.10
Sikewyrm Sep 29, 2026
2048b64
fix: preserve trade dialogs across log reads
Oost-hash Sep 29, 2026
320e022
Merge pull request #78 from Oost-hash/fix/trade-detection-chunking
Sikewyrm Sep 29, 2026
a839d3a
Bump version to 4.4.11
Sikewyrm Sep 29, 2026
d8dccf5
chore: record upstream PR 75 squash as merged
Lyrex Sep 29, 2026
3fd340e
chore: merge upstream dev (4.4.11)
Lyrex Sep 29, 2026
71d786d
fix(scanner): send the most complete blob candidate of a walk
Lyrex Sep 29, 2026
68c21b9
fix(trades): keep trade dialogs that span several log reads
Lyrex Sep 29, 2026
19d61ff
fix(rewards): retry reward reads that miss words of the card name
Lyrex Sep 29, 2026
4c2f447
fix: complete WFM sales and refresh catalogue (#79)
Oost-hash Sep 29, 2026
e2c5d4c
Bump version to 4.4.12
Sikewyrm Sep 29, 2026
15a001d
fix: Kitguns collapsing into unnamed phantom entries; component icon …
Sikewyrm Sep 29, 2026
c29fce4
refactor: name every Tauri event through the shared constants
Lyrex Sep 29, 2026
2ddb653
refactor(trades): parse trade dialogs in log_watcher
Lyrex Sep 29, 2026
e42257e
refactor(monitor): move blob capture into blob_capture.rs
Lyrex Sep 29, 2026
1e52b6e
refactor(ocr): split OCR into platform modules
Lyrex Sep 29, 2026
4ed3955
refactor(log): tail EE.log from one thread
Lyrex Sep 29, 2026
2725ea2
chore: isolate debug builds from production data
Oost-hash Sep 29, 2026
ba040dd
fix: use an unrecognised leftover in the legacy migration test
Oost-hash Sep 29, 2026
13aae0f
fix: modular items reported as flipping to 0 on every scan
Oost-hash Sep 30, 2026
f6836ea
Merge pull request #81 from Oost-hash/fix/modular-inventory-flip
Sikewyrm Sep 30, 2026
bbde73c
Merge pull request #80 from Oost-hash/chore/dev-separate-data-root
Sikewyrm Sep 30, 2026
b0c51a3
chore: add name overrides for Cintra, Citrine Prime, and Narin compon…
Sikewyrm Sep 30, 2026
bd60d44
chore(catalogue): name Cintra, Citrine Prime and Narin parts
Lyrex Sep 30, 2026
3b1178b
fix(wfm): keep the mod rank when undoing a sold listing
Lyrex Sep 30, 2026
3bca287
feat(wfm): record completed sales and match set sales by whisper
Lyrex Sep 30, 2026
5303048
feat(paths): keep a development run apart via FRAMEFORGE_ROOT
Lyrex Sep 30, 2026
06f0f08
chore: bump version to 4.4.14
Sikewyrm Oct 1, 2026
b08c6e5
chore: bump version to 4.5.0
Sikewyrm Oct 1, 2026
eafeca8
Merge pull request #84 from WyrmStudios/dev
Sikewyrm Oct 1, 2026
ee951d1
chore: merge upstream v4.5.0
Lyrex Oct 1, 2026
532c5f2
docs(sync): merge every synced tag and keep upstream tags apart
Lyrex Oct 1, 2026
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
12 changes: 11 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# FrameForge `v4.4.0`
# FrameForge `v4.5.0`

A desktop companion for Warframe — live inventory, market prices, trading, timers, relic overlay, and riven analysis. Read-only, no game modification.

Expand Down Expand Up @@ -200,6 +200,16 @@ cd src-tauri
cargo run
```

A development run shares its settings, database, caches, logs and
warframe.market login with the installed app. To keep them apart, set
`FRAMEFORGE_ROOT` to an absolute path. FrameForge then keeps everything under
that directory, titles its window "FrameForge Dev" and skips the update check
at launch:

```sh
FRAMEFORGE_ROOT="$HOME/.frameforge-dev" cargo run
```

Packages build with the normal command:

```sh
Expand Down
17 changes: 13 additions & 4 deletions docs/UPSTREAM-SYNC.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,13 @@ absorbed.
whatever their tip happens to be, so the tip routinely runs ahead of the
newest tag. A release states the exact upstream base it was cut from;
merging an untagged tip would make that unstatable.
- **A sync always merges the tag, even when nothing in it is wanted.**
GitHub reports the fork as behind for each commit on `upstream/main` that
`main` lacks. A change taken early from upstream's `dev`, ported by hand or
left out on purpose must still arrive through the tag merge, resolved to
our side, or it counts as behind forever. When everything in the tag is
already in or unwanted, `git merge -s ours TAG` records it. Commits past
the newest tag count as behind until upstream tags them.
- **Sync when we intend to cut a fork release**, not on every upstream
release. The fork's value can only be verified in a manual session against
the live game, and that session happens at release time; a synced-but-
Expand All @@ -34,15 +41,17 @@ absorbed.
```sh
# one-time, per clone
git config rerere.enabled true
# Upstream's tags share names with ours, so they live outside refs/tags.
git config remote.upstream.tagOpt --no-tags

# 0. preconditions
git status --porcelain # must be empty

# 1. fetch upstream, pick the newest RELEASE TAG (never main)
git fetch upstream --tags
git tag --sort=-v:refname --merged upstream/main | head -1
# -> TAG, e.g. v2.8.0. --merged excludes our own release tags,
# which are not ancestors of upstream/main.
git fetch upstream '+refs/tags/*:refs/upstream-tags/*'
git for-each-ref --sort=-version:refname --count=1 \
--format='%(refname)' 'refs/upstream-tags/v*'
# -> TAG, e.g. refs/upstream-tags/v4.5.0

# 2. read the delta before touching anything
git log --no-merges --reverse \
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "warframe-companion",
"private": true,
"version": "4.4.0",
"version": "4.5.0",
"type": "module",
"scripts": {
"dev": "vite",
Expand Down
2 changes: 1 addition & 1 deletion src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "warframe-companion"
version = "4.4.0"
version = "4.5.0"
description = "A Tauri App"
authors = ["you"]
edition = "2021"
Expand Down
84 changes: 84 additions & 0 deletions src-tauri/resources/corrections.json
Original file line number Diff line number Diff line change
Expand Up @@ -1251,5 +1251,89 @@
"kind": "quest",
"quest": "Jade Shadows: Constellations"
}
},
{
"path": "/Lotus/Types/Recipes/Weapons/DuelistBowBlueprint",
"name": "Cintra Blueprint",
"category": "Blueprints",
"tradeable_wfm": false,
"is_stackable": true
},
{
"path": "/Lotus/Types/Recipes/Weapons/WeaponParts/DuelistBowGrip",
"name": "Cintra Grip",
"category": "Blueprints",
"tradeable_wfm": false,
"is_stackable": true
},
{
"path": "/Lotus/Types/Recipes/Weapons/WeaponParts/DuelistBowLowerLimb",
"name": "Cintra Lower Limb",
"category": "Blueprints",
"tradeable_wfm": false,
"is_stackable": true
},
{
"path": "/Lotus/Types/Recipes/Weapons/WeaponParts/DuelistBowString",
"name": "Cintra String",
"category": "Blueprints",
"tradeable_wfm": false,
"is_stackable": true
},
{
"path": "/Lotus/Types/Recipes/Weapons/WeaponParts/DuelistBowUpperLimb",
"name": "Cintra Upper Limb",
"category": "Blueprints",
"tradeable_wfm": false,
"is_stackable": true
},
{
"path": "/Lotus/Types/Recipes/WarframeRecipes/CitrinePrimeChassisComponent",
"name": "Citrine Prime Chassis Blueprint",
"category": "Blueprints",
"tradeable_wfm": true,
"is_stackable": true
},
{
"path": "/Lotus/Types/Recipes/WarframeRecipes/CitrinePrimeHelmetComponent",
"name": "Citrine Prime Neuroptics Blueprint",
"category": "Blueprints",
"tradeable_wfm": true,
"is_stackable": true
},
{
"path": "/Lotus/Types/Recipes/WarframeRecipes/CitrinePrimeSystemsComponent",
"name": "Citrine Prime Systems Blueprint",
"category": "Blueprints",
"tradeable_wfm": true,
"is_stackable": true
},
{
"path": "/Lotus/Types/Recipes/WarframeRecipes/NarinBlueprint",
"name": "Narin Blueprint",
"category": "Blueprints",
"tradeable_wfm": false,
"is_stackable": true
},
{
"path": "/Lotus/Types/Recipes/WarframeRecipes/NarinChassisComponent",
"name": "Narin Chassis Blueprint",
"category": "Blueprints",
"tradeable_wfm": false,
"is_stackable": true
},
{
"path": "/Lotus/Types/Recipes/WarframeRecipes/NarinHelmetComponent",
"name": "Narin Neuroptics Blueprint",
"category": "Blueprints",
"tradeable_wfm": false,
"is_stackable": true
},
{
"path": "/Lotus/Types/Recipes/WarframeRecipes/NarinSystemsComponent",
"name": "Narin Systems Blueprint",
"category": "Blueprints",
"tradeable_wfm": false,
"is_stackable": true
}
]
31 changes: 31 additions & 0 deletions src-tauri/resources/ducat_exceptions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"_comment": "Hand-curated exceptions where a prime part's ducat value doesn't follow the standard drop-rarity formula (Common=15, Uncommon=45, Rare=100, mixed=25/65). Mirrors the Warframe Wiki's Module:Void/data DUCAT_EXCEPTIONS table (fetched 2026-09-24 from https://wiki.warframe.com/api.php?action=parse&page=Module:Void/data). Keys in `exceptions` are lowercased full item+part display names, matching WfcdItem.name after component-name derivation. Update by re-fetching the same wiki module if new exceptions are added upstream.",
"exceptions": {
"forma blueprint": 0,
"khora prime blueprint": 65,
"akstiletto prime receiver": 45,
"knell prime receiver": 45,
"braton prime receiver": 45,
"rubico prime stock": 45,
"saryn prime neuroptics blueprint": 45,
"soma prime blueprint": 15,
"mesa prime systems blueprint": 100,
"bronco prime barrel": 45,
"gauss prime blueprint": 25,
"panthera prime receiver": 100,
"fang prime blueprint": 15,
"limbo prime neuroptics blueprint": 100,
"exilus weapon adapter blueprint": 0,
"riven sliver": 0,
"kuva": 0,
"ayatan amber star": 0,
"xata": 0,
"lohk": 0,
"vome": 0,
"jahu": 0,
"fass": 0,
"ris": 0,
"netra": 0,
"khra": 0
}
}
Loading
Loading