Skip to content

Releases: beulea/eve-contracts-releases

Beulea's EVE Contracts v0.4.2

Choose a tag to compare

@beulea beulea released this 12 Aug 23:28

Added

  • The abyssal stat filters now show you where a threshold would land. Every
    rolled stat's two boxes sit over a scale: the track is everything that stat can
    ever roll for the class you picked, the darker band is what the current
    snapshot actually lists, and a tick marks every base module value on it. Hover
    a tick and it names the modules that start there, with their tier, so "better
    than the Tech II in my fit" or "at least faction" is a place you can point at
    instead of a number you guess and then re-read off the results. Several modules
    often share one value, and where two values sit closer than a tick can be drawn
    they merge into one wider tick that names the range and lists everything under
    it - so nothing is quietly hidden behind a neighbour. Hovering does not need
    precision: every tick answers for the stretch of scale nearest to it. Type a
    floor or a ceiling and the part of the scale it throws away fades, ticks
    included, and a line on the scale shows exactly where the number you typed
    landed - or a chevron at the end, when it landed past the scale entirely. A
    bound that excludes nothing (a floor under everything on the market, which
    reads as a working filter and is not) marks its own box and says so. The
    tooltip on the stat's name names both ranges, what can be rolled and what is
    listed, where it used to name only the listings.

Fixed

  • Items that were showing a blank square now show their icon. Typing "Large
    Shield Booster" into the item picker on All or Items brought back the
    blueprints among the modules, and every blueprint row came back blank: the app
    asked EVE's image server for an icon blueprints do not have, and only the
    Blueprints tab knew to ask differently. It now asks per item, so a
    blueprint found on any tab gets its blueprint art. The same was true of the
    results list and the contract's item list, for a blueprint whose listing does
    not say it is one - 51 rows and 2,254 item lines in the 2026-08-09 snapshot -
    and of reaction formulas and ancient relics anywhere in the app.

  • Items with no artwork no longer look like something failed. SKINs have no
    picture on EVE's image server at all - 144 result rows, and item lines in 190
    contracts, in that same snapshot - and every icon in the app now falls back to
    a quiet placeholder that keeps the row lined up, rather than an empty gap.

  • "title overcounts" no longer reads a quantity out of a word. EVE is full
    of names ending in X, and the check that compares a title's stated count
    against what a contract holds was treating that X as a multiplier: "WTB PLEX
    6000" read as a claim of 6000, and so did "Nyx 9/16", "Phoenix 9/14" and the
    tail of a pasted appraisal link. A count welded to letters is now no more a
    quantity than the X in a ship's name is a multiplier - "PLEX x 10", where the
    x stands on its own, still reads as ten. On the 2026-08-11 snapshot this drops
    61 wrong readings and one right one, and changes no warning: the same seven
    contracts are flagged, for the same reasons.

  • ISK/run now charges you for the blueprint you asked about, not for
    everything bundled beside it.
    The column divided a contract's whole price by
    the runs of every print in it, so a mixed pack read as the cheapest source of
    each one and took first place from the honest listings. In the 2026-08-12
    snapshot a pack led the results for 2,027 of 2,692 blueprints, and once every
    listing is charged for the print you asked about, 1,351 of those packs are not
    first at all. Searching "'Interruptive' Warp Disruptor Blueprint"
    put a 58M pack at 1.93M/run on top; those 3 Interruptive runs actually cost
    58M, i.e. 19.33M each - the dearest of all seventeen listings. The figure is now
    the whole price over the runs of the print you picked, so a pack that throws in
    more can only ever look dearer than a plain copy, never cheaper. With no
    blueprint picked, a contract holding several of them shows a dash rather than
    an average nobody is selling. Where the figure is a pack's - the whole price
    buying that print and a heap of other things - it carries a star saying so, the
    same one the Jita value uses: a pack can still be the cheapest source of a
    print, and that is worth seeing, but what you pay per run of it is the most it
    could be and not what the blueprint costs.


Download

OS File
macOS (Apple Silicon) Beulea.s.EVE.Contracts_0.4.2_aarch64.dmg
Windows Beulea.s.EVE.Contracts_0.4.2_x64-setup.exe
Linux Beulea.s.EVE.Contracts_0.4.2_amd64.AppImage

Neither the macOS nor the Windows build is code-signed - that needs a paid
certificate - so the first launch takes one extra step. macOS: open it,
Done, then System Settings → Privacy & Security → Open Anyway. Windows:
More infoRun anyway. Linux: chmod +x the AppImage (some distros
also need FUSE).

After that the app updates itself from this page: every build is minisign-signed
and the updater checks that signature before replacing anything. The .sig
files and latest.json are what makes that work - you don't need to download
them.

All releases · Report a problem

Beulea's EVE Contracts v0.4.1

Choose a tag to compare

@beulea beulea released this 09 Aug 17:26

Changed

  • Searching for a module now finds that module, not the abyssal rolls made
    out of it.
    Picking (or typing) "Caldari Navy Large Shield Extender" used to
    return every mutated extender rolled from one as well, and there were far more
    of those than of the real thing: 191 of 239 results in the 2026-08-08 snapshot,
    and the majority of results for 258 of the 490 modules anything had been rolled
    from. A roll is a different item with different stats and a different price,
    the Items tab has no columns to judge one by, and there was no way to switch
    them off. In the Abyssal tab, where every result is a roll already, naming a
    module still means its rolls, and matches every one made from it before you
    have picked which class it rolled into.

Added

  • A search for a module now offers the abyssal versions of it, instead of
    pretending they are not there.
    Name a module in Items or All - pick it, or
    just type it - and, if anyone has rolled one, a line under the results says
    how many contracts hold rolls made from it and takes you to them in one click,
    scoped to that module across every class it rolled into, which the Base module
    control cannot do until you have picked a class first. It matters most where
    the results are empty: plenty of modules are never sold plainly in contracts at
    all, only as rolls, and that search used to end in "no contracts match" with no
    hint that a hundred rolls were a tab away.

  • The filter chips say when a typed name is also matching abyssal rolls. In
    the Abyssal tab a name matches the module you typed and everything rolled from
    it, which is what you want there and is not what the same chip means in Items.
    It now reads "thukker" + rolls, so the strip goes on telling you everything
    that is narrowing the results.

Removed

  • The "Abyssal only" switch is gone from All. It was a second content filter
    standing next to the Category one and quietly disagreeing with it: in the
    2026-08-08 snapshot "Blueprint" on its own found 26,785 contracts, "Blueprint"
    with the switch on found 6. That was never going to work, because mutation
    only produces modules and drones, so asking for anything else alongside it
    could only turn up bundles that happened to hold both. No contract is lost: the
    Abyssal tab lists exactly the same ones, all 10,562 of them, even before
    you pick a mutated item - and unlike All it then shows you the rolled stats,
    the base module and where each roll sits in its range. The one thing it cannot
    do yet is show a whole category of rolls at once, the way the switch could
    when paired with Category.
  • A saved search that used that switch still loads, and means something
    different now.
    It no longer hides contracts without abyssals, so one that
    also picked a category can come back with far more than it used to. Make it
    again from the Abyssal tab if that is not what you wanted.

Download

OS File
macOS (Apple Silicon) Beulea.s.EVE.Contracts_0.4.1_aarch64.dmg
Windows Beulea.s.EVE.Contracts_0.4.1_x64-setup.exe
Linux Beulea.s.EVE.Contracts_0.4.1_amd64.AppImage

Neither the macOS nor the Windows build is code-signed - that needs a paid
certificate - so the first launch takes one extra step. macOS: open it,
Done, then System Settings → Privacy & Security → Open Anyway. Windows:
More infoRun anyway. Linux: chmod +x the AppImage (some distros
also need FUSE).

After that the app updates itself from this page: every build is minisign-signed
and the updater checks that signature before replacing anything. The .sig
files and latest.json are what makes that work - you don't need to download
them.

All releases · Report a problem

Beulea's EVE Contracts v0.4.0

Choose a tag to compare

@beulea beulea released this 07 Aug 23:11

Added

  • A title claiming more than the contract holds is now flagged. "10x Large
    Skill Injectors" holding one, priced just under what ten would actually cost
    at Jita, so the ask reads as a small discount once you do the math the title
    invites. The title never lies about the contents - it says nothing about them
    at all - so nothing else in the app catches this. Flags now shows "title
    overcounts" whenever a whole-number count parsed from the title is more than
    the contract actually holds of that one item; an honest listing (a "10x
    Something" that really holds ten, whether in one line or several) is never
    flagged, since it's judged by the total quantity, never by how many lines it's
    split across. In the 2026-08-07 snapshot that's 6 contracts and about 29.75b
    of asking price between them - the four already spotted plus two more of the
    same pattern since. It takes the place of "overpriced"/"verify" on that row
    rather than sitting beside them, since it already says why the price looks
    like a deal. Shows the same warning, worded the same way, in the contract
    detail dialog next to the price - not just the results row.

Changed

  • Refreshing the contract data is about a third faster — roughly 3.5 s down
    to 2.5 s on the 48k-contract snapshot, plus whatever your connection takes off
    the download, which now runs alongside the unpacking instead of before it.
    Nothing about the results changes; there is just less waiting on the Refresh
    button.

  • The Refresh button says what it is actually doing. The download no longer
    finishes before the unpacking starts - they run together - so the progress
    text no longer claims a download that is still going.

Fixed

  • Contract titles with <, >, &, quotes or apostrophes now read correctly
    instead of showing the raw HTML escape a seller's punctuation turns into
    upstream - "sig<" now reads "sig<", "(WTS) 980 Plex <> (WTB) 10 Skill
    Extractor" now reads "(WTS) 980 Plex <> (WTB) 10 Skill Extractor", and so on.
    About 65 of the roughly 48,000 titles in a given snapshot were affected,
    everywhere a title appears: the results row, the contract detail dialog, the
    compare dialog, and saved-search summaries.

  • A broken refresh could quietly leave you with the wrong contracts. Usually
    none at all - a rare failure inside the decompressor, contract data missing
    from the download, or a download far larger than expected all looked like a
    refresh that had worked, with no error and no contracts, and the app would not
    try again until the data upstream changed. A malformed download could also go
    the other way and count some contracts twice. Every one of them is now a plain
    error that leaves the contracts you already had. Found by review rather than
    in the wild.

  • An empty column no longer sits at the left of the results in searches
    where nothing can be compared. The + that adds a contract to the comparison
    only applies to abyssal rolls, so wherever a page held none - most searches for
    ships or blueprints - its column stood there with nothing in it. It now appears
    only when something on the page actually carries a roll, which includes Ships
    and Blueprints, since a pack can hold one alongside everything else.

  • Blueprints: an ME/TE/runs floor now applies to the blueprint you picked.
    With an item picked, the floors had to be met by some blueprint in the
    contract, so a "10x cruiser BPOs" bundle passed a search for a Vexor
    Blueprint with ME ≥ 10 on a sibling's ME while the Vexor itself sat at 7.
    The floors now describe the blueprint you asked for.

  • The ME / TE / Runs columns show the blueprint the search matched. On a
    bundle they used to show whichever blueprint came first, so a row found by
    "ME ≥ 10" could read ME 7. With no item picked, they show the line that
    cleared your floors.

  • A contract demanding PLEX is no longer read as free money. PLEX trades on
    one market shared by all of New Eden rather than in any region, so Jita's
    regional order book holds none of it and every PLEX line was valued at 0 ISK.
    Most contracts that demand items ask for PLEX, so most of them were appraised
    as if that cost nothing: one asking 1,340 PLEX for a 6.34b pack showed a
    Net at Jita of over six billion in green, directly under its own red
    "You must hand over" warning. PLEX is now priced where it actually trades
    (~4.75m sell, 2026-08-05), and that contract reads as the rough break-even it
    always was.

  • Net is left blank rather than guessed when something you must hand over has
    no price.
    Zbikoki's Hacker Card, a SKIN crate, a blueprint copy: anything
    with no market price counted as worth nothing, which turned "and you also give
    me this" into profit. Net at Jita on the contract card and Net in the
    results table now read "—", the footnote says how many hand-over lines can't
    be valued, and the verify badge stays off a contract whose cost is
    unknown. PLEX was the loudest case rather than the only one, which is why the
    guard is not about PLEX.

  • The mirror case: Net now says what a demand costs you even when the goods on
    offer can't be priced.
    The entry above withholds a figure when the side you
    hand over is unknown; this one supplies the figure that was being withheld for
    no reason. Net used to appear only when the app had a Jita value for what
    you receive, so a contract holding one unquoted hull and demanding 340,000
    PLEX showed nothing beside a price of 0 — while the cost of that demand was
    known to the ISK. Both the results table and the contract card now state it.
    Where nothing at all could be priced, Net still stays out of the way.

  • The unpriced-lines footnote no longer points the wrong way. It said the
    true value is higher than shown even when the unpriced line sat on the side
    you hand over, where the truth is the opposite. Each side now gets its own
    sentence.

  • A researched blueprint original is no longer appraised as an unresearched
    one.
    The market only ever quotes the untouched blueprint — ME and TE belong
    to the individual copy, and no market order can carry them — so a
    ME 10 / TE 20 original asking a fair 220m was measured against the 88.4m shelf
    price and shown as a 131.6m loss. Researched originals now sit with blueprint
    copies among the lines nothing can price: Jita value and Net stay
    empty rather than wrong, and the asterisk beside the value counts them. In the
    2026-08-05 snapshot that is 91% of the blueprint originals on offer.

  • A contract costing far above what it holds is now flagged. The
    "overpriced" verdict had been computed and tested since the appraisal shipped,
    but no column ever showed it: the app warned about suspiciously cheap packs
    and said nothing about a pack costing more than 1.5× its Jita value. It now
    appears in Flags beside "asks items" and "verify".

  • The verdicts and the percentage now count what you hand over, not just the
    ISK price.
    A contract listing 6m ISK beside a demand for 1,340 PLEX was
    called a bargain, given a verify badge, and shown as +615% — all
    because only the 6m was ever weighed against the 6.35b of goods, while the
    PLEX it also wanted sat in neither figure. Counting it, that contract is
    within half a percent of breaking even, and which side of even it lands on
    changes with the price of PLEX through the day. Items you must hand over now
    count towards what a contract costs you, so a barter with no ISK price at all
    gets a verdict too, where before it got none.

  • The divider on the right of Location can be dragged now. Every other
    column boundary could be grabbed and this one could not, so the only way to
    narrow Location was to widen the column to its left - the opposite gesture to
    the one the line invites. Pulling it left narrows Location and gives the room
    to Price, exactly as it looks like it should.

  • Dragging a column divider now moves the divider you grabbed. Only the
    ones left of Location did. The divider on Location's own right edge could not
    be grabbed at all, so the only way to narrow Location was to widen the column
    to its left, the opposite gesture to the one the line invites. And every
    divider to the right of Location moved a different line than the one under
    the pointer: widening Price took the space out of Location, which slid Price
    along with it and left the grabbed edge exactly where it started. Each
    divider now takes its space from the column on the other side of that line,
    so the boundary follows the pointer and nothing else on the row shifts. The
    columns also stop jittering mid-drag, which they did whenever the row briefly
    added up to more or less than the window. Resizing the app window while
    holding a divider no longer disturbs the gesture either: the columns hold
    still until you let go and then settle on the new window, instead of Location
    jumping to a new width and sitting there, or the drag ending somewhere the
    pointer never asked for. And a divider now answers to the finger that grabbed
    it - a second one landing on the same divider mid-drag used to take the first
    one's place, which sent the column shooting off to its narrowest, and a second
    one on a DIFFERENT divider used to bring the mid-drag jitter back the moment
    it was let go, and a second finger landing on a divider that is already busy no
    longer stops responding until you lift it. Anything that happens while you are
    dragging - the results reloading under you, a column being reordered, whether
    by the arrow keys or by a drag started before you grabbed the divider - now
    leaves the drag alone instead of bending it, giving a column the width meant
    for its neighbour, or leaving o...

Read more

Beulea's EVE Contracts v0.3.0

Choose a tag to compare

@beulea beulea released this 05 Aug 00:51

Added

  • Hide contracts you've already turned down. The eye icon beside a row's
    star takes that contract out of every search, for good. The in-game client
    can only ignore a whole issuer, never a single contract, so a listing you
    rejected keeps coming back at you on every scan of the same search.

    • Hidden contracts are gone from the results, not greyed out - they don't
      take up a place on the page either.
    • More filters grows a Show hidden (N) switch once you have hidden
      something. Turn it on to see them again and unhide the ones you want back,
      or use Show all again to clear the lot - which asks once, since there
      is no undo.
    • The filter strip says N hidden while any are being excluded; clicking it
      shows them rather than forgetting them, and Clear all leaves them alone
      — clearing your filters is not the same as changing your mind about a
      contract. A search that comes back empty says what actually emptied it — if
      everything on the page is hidden it says so, and offers to show them, rather
      than blaming filters you never set.
    • Favorites never hides anything: starring a contract and then hiding it are
      opposite verdicts, and the star wins.
    • Hiding is remembered with your favorites and column layout, so it survives
      app updates. Entries clean themselves up as contracts leave the game.
  • Saved searches. Name a set of filters and bring it back later, from the
    Presets button at the right-hand end of the filter bar. The in-game contract search forgets every
    filter the moment you close it - region included - and has done since players
    first asked in 2010, so this is the gap it never filled.

    • A preset remembers one tab's whole setup: the search box, the item picked,
      region, kind, price and time window, the blueprint floors, the abyssal class
      with its base modules and stat ranges, and the sort. Applying one switches to
      the tab it was saved from, and says so rather than jumping silently.
    • Each preset lists what it actually holds under its name, so you can tell them
      apart without applying them one by one.
    • Presets are never overwritten behind your back. Change a filter after
      applying one and a dot appears beside its name, with buttons to save the
      change or throw it away right there - no hunting through a menu, and no
      silent overwrite.
    • Rename or delete from the row's own buttons; deleting asks once, since there
      is no undo. Presets are stored with your favorites and column layout, so they
      survive app updates.
    • If a restored abyssal preset carries a stat filter the class no longer rolls
      • its mutaplasmid's stats can change between game updates - the filter is
        dropped and you're told, instead of the search quietly returning less than
        the preset asked for.

Changed

  • The Abyssal search bar is laid out by what each control does. The class you
    are searching now leads its own line, with the base modules beside it, so the
    row below is purely about narrowing the results. The two base-module controls
    also say what they do: Base modules picks what a contract must hold, and
    Excluding hides contracts holding anything from those bases. They ask
    different questions, so they work together.

  • A stat filter the narrowed scope can't roll is now cleared, and says so.
    Version 0.1.3 promised that stat ranges survive any base-module change, and
    that was too strong: narrowing the bases can leave a bound with no input row
    and no chip, so it filters nothing you can see - until you widen the scope
    again and it quietly starts cutting results you didn't ask it to. Such a bound
    is now cleared with a message. Bounds the narrowed scope still rolls are
    untouched, and switching class still resets everything as before.

  • The packs filter works on every tab. Hiding bundles was only possible in
    All and Items, so a blueprint search drowned in "62 item pack" rows with no
    way to say you wanted single items. It now lives with the other shared filters
    behind More filters, alongside region and contract kind, and still shows as
    a removable chip when set.

Fixed

  • Excluding a base module now hides packs that contain it. It used to check
    only the roll it had already matched, so a four-module bundle that was three
    quarters Ice Harvester II still came back from a search excluding Ice Harvester
    II. Single-module contracts are unaffected.
  • A failed roll-range lookup says what went wrong. When the stat filters for
    an abyssal class can't be read it now names the reason instead of offering a
    generic "try refreshing", and it no longer blames whichever class you happened
    to switch to while the error was on screen.
  • Picking an item category no longer clears your group choice at startup.
  • "Cheapest per run" is no longer forgotten when you leave the Blueprints
    tab.
    Sorting by ISK/run and then visiting another tab silently reset the
    sort, so coming back re-sorted your results by newest without saying so.

Download

OS File
macOS (Apple Silicon) Beulea.s.EVE.Contracts_0.3.0_aarch64.dmg
Windows Beulea.s.EVE.Contracts_0.3.0_x64-setup.exe
Linux Beulea.s.EVE.Contracts_0.3.0_amd64.AppImage

Neither the macOS nor the Windows build is code-signed - that needs a paid
certificate - so the first launch takes one extra step. macOS: open it,
Done, then System Settings → Privacy & Security → Open Anyway. Windows:
More infoRun anyway. Linux: chmod +x the AppImage (some distros
also need FUSE).

After that the app updates itself from this page: every build is minisign-signed
and the updater checks that signature before replacing anything. The .sig
files and latest.json are what makes that work - you don't need to download
them.

All releases · Report a problem

Beulea's EVE Contracts v0.2.5

Choose a tag to compare

@beulea beulea released this 02 Aug 20:48

Changed

  • The MutaMarket estimate is now next to the price, in the contract's money
    row, instead of tucked into the top-right corner of the roll card further
    down. Feedback was that people simply never saw it - and once you look, it's
    clear why: it sat below the fold of the item list, and it was written compact
    (2.9m) while the asking price right above was written out in full
    (2,500,000 ISK), so even spotting both didn't let you compare them. Both
    now read the same way, side by side, and the slot is held from the moment the
    card opens rather than appearing a beat later once the lookup returns.
    Multi-module contracts show the total up top and keep the per-roll figures on
    the cards below.
  • Net at Jita is written out in full, like every other figure in the money
    row. It was abbreviated (500.0k) directly beside a grouped asking price
    (2,500,000 ISK) - two numbers meant to be read against each other, written
    two different ways.
  • The "not priced" footnote no longer contradicts the estimate above it. A
    contract whose only unpriceable line was an abyssal module MutaMarket had
    already valued still announced that its true value was higher than shown;
    rolls that got an estimate are no longer counted as unpriced, and the note
    now names what's actually missing. The estimate stays a reference figure next
    to the price, not a verdict on the deal: MutaMarket's own published accuracy
    for these models is far too loose to turn into a "you're saving X%" number.

Download

OS File
macOS (Apple Silicon) Beulea.s.EVE.Contracts_0.2.5_aarch64.dmg
Windows Beulea.s.EVE.Contracts_0.2.5_x64-setup.exe
Linux Beulea.s.EVE.Contracts_0.2.5_amd64.AppImage

Neither the macOS nor the Windows build is code-signed - that needs a paid
certificate - so the first launch takes one extra step. macOS: open it,
Done, then System Settings → Privacy & Security → Open Anyway. Windows:
More infoRun anyway. Linux: chmod +x the AppImage (some distros
also need FUSE).

After that the app updates itself from this page: every build is minisign-signed
and the updater checks that signature before replacing anything. The .sig
files and latest.json are what makes that work - you don't need to download
them.

All releases · Report a problem

Beulea's EVE Contracts v0.2.4

Choose a tag to compare

@beulea beulea released this 02 Aug 01:28

Added

  • About in the header: which version you're running, every data source the
    app reads from with a link to each, and a Check for updates button. The
    startup check is deliberately silent unless there's something to install, so
    until now there was no way to ask "am I on the latest?" and get an answer -
    now it says so either way, including when the update server can't be reached.

Changed

  • The update prompt shows what's actually new instead of "a newer version is
    ready": the first few changelog entries, rendered as bullets, with a link to
    the full notes. The release page also gained a download table naming the file
    for each OS and the one-time step each unsigned build needs on first launch -
    eight files with names like ..._amd64.AppImage are not a download page.

Fixed

  • A contract whose time has run out says so. The Expires column called it
    "ready" — a word that belongs to industry jobs, where a finished one really
    is ready to collect, and that here read as available for a contract nobody
    can accept any more. It now says expired, in the same amber the app uses
    elsewhere for "read this one with a caveat", so it catches the eye instead of
    sitting in the same grey as a running clock. A snapshot arrives with barely a
    dozen of them, and they gather at the top the moment you sort by "expires
    soonest" — exactly when you're hunting for something about to go — but they
    keep piling up for as long as you leave it unrefreshed, which is the other
    reason to notice them. The compare window says so too, at the top of the
    column, and a dead contract no longer wins a row there.

  • The not listed flag stopped taking credit for things it doesn't know. It
    said a starred contract was "expired, sold, or just aged out"; now expiry has
    its own flag, and "not listed" means the narrower, honest thing: it left the
    snapshot with time still on its clock, so it was accepted, cancelled or
    pulled. Those rows also stop showing a countdown to an expiry that will never
    arrive.

  • The contract card shows when a contract was issued and when it expires. It
    had neither — you could read every item, every price and the scam verdict
    without ever learning the thing was already over. Copying its in-game link now
    warns you too, instead of cheerfully telling you to paste a link that opens
    nothing.


Download

OS File
macOS (Apple Silicon) Beulea.s.EVE.Contracts_0.2.4_aarch64.dmg
Windows Beulea.s.EVE.Contracts_0.2.4_x64-setup.exe
Linux Beulea.s.EVE.Contracts_0.2.4_amd64.AppImage

Neither the macOS nor the Windows build is code-signed - that needs a paid
certificate - so the first launch takes one extra step. macOS: open it,
Done, then System Settings → Privacy & Security → Open Anyway. Windows:
More infoRun anyway. Linux: chmod +x the AppImage (some distros
also need FUSE).

After that the app updates itself from this page: every build is minisign-signed
and the updater checks that signature before replacing anything. The .sig
files and latest.json are what makes that work - you don't need to download
them.

All releases · Report a problem

Beulea's EVE Contracts v0.2.3

Choose a tag to compare

@beulea beulea released this 01 Aug 17:01

Fixed

  • Blueprint originals stopped disappearing from a Runs ≥ search. A BPO has
    unlimited runs, so it should satisfy any floor — instead "BPO" plus any runs
    value returned nothing at all, ever, and on a mixed BPO+BPC search every
    original silently dropped out: 4,957 of the 26,903 blueprint contracts in a
    current snapshot. The filter was testing for a "−1 = unlimited" marker that
    the data has never contained.

  • Searching for a literal % or _ works. Both are wildcards to the
    search underneath, so typing a percent sign matched every contract in the
    snapshot rather than the ones with a percent in the title — and titles like
    "fully researched BPO (ME:10%, TE:20%)" are exactly what people type it
    looking for. Item-name searches are fixed the same way.

  • Picking a region is instant now, and the busiest one gained the most. Filtering
    to a region meant sorting every contract in it before showing the first page —
    and since The Forge holds about seven of every ten contracts in the game, the
    region people pick most was the slowest by far: roughly 140 ms of sorting for a
    screen of results, now under 2 ms. Other regions were already quick and are
    unchanged, as is searching with no region set.

    This adds an index, which changes the local database's shape, so the contract
    snapshot is re-downloaded once
    after this update.

  • Filtering by a specific item is instant now. Picking one from the item box
    used to make the search read every contract in the snapshot to check each one
    in turn, which for anything but the few most-traded items meant a wait of
    around a fifth of a second — and the rarer the item, the longer, because the
    results ran out before the reading did. It now goes at the item, not at the
    contracts: 60–200 ms down to under a millisecond, same results.

  • A mistyped price no longer empties the results. The Min/Max ISK boxes accept
    a second dot, and "1.2.3" was passed on as a number that isn't one, which
    quietly made every contract fail the comparison — an empty list with nothing
    to explain it. A price that can't be read is now no filter at all.

  • The compare window compares the modules to each other now. In an abyssal
    comparison the bold green number was the luckiest roll — the one that landed
    highest inside its own possible range — not the better module: a plate using
    623 MW of powergrid lost the row to one using 667 MW, because the second had
    rolled further above a weaker base. Bold now marks the best actual value in
    the row, the same way the Price row marks the cheapest — and that row got
    tidier too: when every contract asks the same price, which is common, none of
    them is "best" any more, so the row stops going all green to say they match.
    The bars still
    show each roll against its own possible range, which is a different question —
    and when the compared rolls don't share that range, because they came from
    different base modules or different mutaplasmids, the window now says so. That
    is most comparisons: a class can be mutated from a dozen different modules,
    and it's exactly when a fuller bar can sit beside a worse number.

    Worth knowing if you'd been reading the old highlight: it only ever agreed with
    the values when both rolls shared a base module and a mutaplasmid. Otherwise
    it disagreed on about a quarter of stats.

  • The compare window stopped making claims about the wrong things. "Jita value"
    in an abyssal comparison was never the module's worth — nothing can price a
    rolled module, so it was the value of whatever else the contract included,
    and it won the "best" highlight on that: one real listing is a freighter-load
    of minerals with a single roll in it, which would have been marked the best of
    the bunch on its cargo. It's now called "Other items" there and marks no
    winner. A contract carrying several rolled modules also says so — the table
    compares the first of them, and the column now reads "1 of 3 in this contract"
    instead of implying it's the whole thing.

  • The compare window no longer hangs around empty. Removing the last contract
    from inside it — or clearing the tray behind it — left it open, still showing
    the comparison it had loaded, with × buttons that did nothing. And when
    loading a comparison failed it said "Nothing selected to compare", which was
    neither true nor useful; it now says what happened. A contract that has left
    the snapshot since you ticked it — sold, expired, or dropped by a refresh —
    is left out and named, instead of appearing as a column with no stats and the
    price it had when you picked it.

  • Small things around the compare tray: with eight contracts selected the +
    button says the tray is full instead of doing nothing, and when the
    comparison spans more classes than fit across the dialog, their tabs scroll
    rather than being cut off where you can't reach them.

Beulea's EVE Contracts v0.2.2

Choose a tag to compare

@beulea beulea released this 30 Jul 22:47

Changed

  • Auctions now read as auctions and show what they actually cost. An auction's
    price in the results was its starting bid, so one opened at 1M ISK but bid up
    to 50M still showed "1M" — indistinguishable from a fixed-price sale. The Price
    cell now leads with the current top bid (bid count and buyout in the tooltip),
    or the buyout, or the opening bid — each labelled — and multi-item auctions get
    a gavel icon. A bid-up auction no longer masquerades as a bargain anywhere: the
    Jita-value comparison and the "verify" flag, the price filter, sorting by Price
    or by ISK-per-run, and the detail and compare views all treat it as what it'd
    really cost — so it can't slip through a "≤ 5M" filter just because it opened
    at 1M, and its profit no longer looks 50× better than it is.

Fixed

  • Courier contracts filter and sort by their reward now, not a phantom zero. A
    courier's ISK is its delivery reward, not a "price" (that field is always 0 for
    couriers), so a price filter used to let every courier through as if free — a
    480M-reward haul showed up under "≤ 5M" — and sorting by price piled them all
    at the bottom. Both now use the reward.

Beulea's EVE Contracts v0.2.1

Choose a tag to compare

@beulea beulea released this 27 Jul 23:31

Changed

  • The filter bar leads with what you're hunting now. Region, contract kind, the
    time window and "hide item asks" — the filters every tab shares — fold into a
    More filters button (which carries a count when any are set), so each tab's
    first row is its own: the search and type, price, and that mode's controls (a
    class and its base modules on Abyssal, category on Items, ME/TE/runs on
    Blueprints). They're all one click away and still show as removable chips when
    set. Region and the time window also became type-to-filter dropdowns, matching
    the app's other pickers.

Beulea's EVE Contracts v0.2.0

Choose a tag to compare

@beulea beulea released this 27 Jul 09:58

Added

  • Abyssal results can be sorted by overall roll quality — the ★ score now has
    its own Roll column, and clicking it puts the best rolls in the class on
    top (again for the worst, again to switch it off). It answers a different
    question than sorting by one stat: on stasis webs the two orders share nothing
    in their top ten, and on mining modules they're barely related at all. The
    score also stopped shoving the module name around now that it has a column of
    its own instead of sitting inline after the title.

    The column only appears when the score means something. It's a standing among
    the class's listed rolls, so a class with a handful of them can't produce one:
    resampled against real classes, five listings put a middling roll anywhere
    between 0% and 100% depending purely on who else was listed that day. The line
    is now fifteen, and below it there's no ★ column rather than a column of
    dashes — "not enough listed to say" instead of a confident-looking guess. On a
    live snapshot that's 13 classes of 88, holding about 1% of all listed rolls.

Changed

  • Clear all now clears exactly the filter chips you can see, and nothing
    else. It used to reach past them and reset filters on other tabs, where no
    chip was showing to warn you, and it cleared the abyssal roll sort — sorting
    isn't filtering, and the ordinary sort was never cleared either. It also
    missed one, leaving "Hide item asks" behind. So it's now per-tab: your class,
    your sort, and anything set on another tab all survive it. Nothing can hide
    from it either — a filter always has a chip on the tab where it actually
    narrows anything.

  • Leaving the Abyssal tab and coming back no longer throws away your work. The
    stat ranges you'd typed, the base modules you'd narrowed to, the column sort
    and which stats you'd left showing in Stats were all cleared by the round
    trip, even though the class never changed — the reset meant for switching
    classes was firing on switching tabs. The Stats one also quietly changed the
    ★ score, since a stat that reappears starts counting toward it again.

  • The Favorites tab no longer shows filter chips it doesn't obey. Filters set on
    another tab stay set — that's deliberate — but Favorites builds its list from
    what you starred and reads none of them, so showing them there (with a Clear
    all, no less) claimed they were doing something.

  • Picking an abyssal module is responsive again. Every keystroke was re-counting
    every listed roll in the snapshot to build a list it then filtered in memory.
    That list is the same until the next snapshot, so it's now loaded once — and
    the count behind it got about five times faster on top of that, because the
    join it runs was opening a row in the 400,000-row item table for every rolled
    module it counted. A new index carries what it needed, so it opens none.

    Adding that index changes the local database's shape, so the contract
    snapshot is re-downloaded once
    after this update.

  • Clear all no longer closes an abyssal search. The class you're comparing
    rolls within isn't a filter — it's what the whole table is — and clearing it
    emptied the screen instead of widening the search. It also stopped being
    listed among the filter chips, where it was a second copy of the picker
    sitting right above it; removing it from there is what lets Clear all mean
    every chip, with nothing held back. Its own × is unchanged.

  • A column added in an app update now appears where it was designed to sit,
    even if you'd previously dragged your columns around. It used to be tacked
    onto the end of the row instead — and saved there.

  • Sorting now lives entirely in the column headers. The sort dropdown is gone —
    every option it had is a click on the column itself, in either direction, and
    results no longer depend on which of the two controls you touched last. In
    the Abyssal table the two used to disagree outright: the Price column won
    while the dropdown carried on showing a different sort. In Favorites the
    headers did nothing at all — clicking Price moved an arrow, left the list
    untouched (it's always newest-starred first) and quietly changed the sort on
    your other tabs; they're plain labels now. Contracts also gained an Issued
    column next to Expires — the list has always defaulted to newest-first, but
    never showed the date it was ordering by.

Fixed

  • Unticking stats in Stats sticks. Clearing the last few — or all of them —
    used to hold until you narrowed to a base module or came back to the tab, at
    which point every column you'd hidden reappeared, taking its share of the ★
    score with it. The chooser now only starts over when you pick a different
    class, whose stats are different stats anyway.

  • Roll filters for stats that only go negative no longer need the minus typed.
    A stasis webifier's Max Velocity rolls between −66% and −54%, so typing "60"
    used to ask for values above +60 and quietly return nothing. It now reads as
    the −60% you meant. Typing the minus still works, values are still shown
    signed, and stats that can roll positive are untouched.

  • Abyssal webs were rated backwards. On a stasis webifier, Maximum Velocity
    Bonus is a penalty — a -69% roll slows harder than a -50% one — but the app
    read it like a propulsion module's speed bonus, so the best webs showed a red,
    near-empty roll bar and sorted last, while the worst ones came out green with
    a top quality score. Roll bars, colours, the quality badge, the weak-roll
    chip, sorting and the compare table now all agree that lower is better here.

  • Assault Damage Controls had the same problem on Activation time: a longer
    resistance window is the good roll, and it was being marked as the bad one.

  • Result rows line up again: contracts without a single obvious item (packs,
    couriers) used to render no icon at all, so their names sat further left
    than everyone else's. Every row now has the same icon slot — the item's own
    icon when there is one, a box for multi-item packs, a truck for couriers.

  • Reordering columns is far easier to grab: drag anywhere on a column header to
    move it, instead of hunting for a tiny handle that sat a pixel or two from the
    resize edge and kept catching the wrong one. Clicking a header still sorts and
    the right edge still resizes; both now show a hover tooltip saying what they
    do, and columns can be reordered from the keyboard — focus a header and use
    ← / →.