Skip to content

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 one stuck at a width nothing would put right
    until you restarted the app. Leaving the tab mid-drag is the same kind of
    case - stepping to another one with the keyboard, or a second finger on a
    touchscreen, while the first still holds the divider down - and no longer
    flashes a column at its old width for a frame before settling on the right
    one, which used to happen whenever the column you were resizing was the one
    that lost its divider in the move (Expires, say, when leaving Favorites drops
    the trailing Added column behind it).

  • A saved search you've edited now says "Modified", not just a dot.
    Changing a filter after applying a preset used to mark it with a bare
    coloured dot and nothing else - the only place in the app that spoke in
    colour alone, easy to mistake for the sort/resize/reorder accent that same
    colour carries everywhere else. And the button beside it that discards those
    edits back to the saved filters no longer uses the same circular-arrow icon
    as the header's Refresh button, which sits right above it and does something
    unrelated (pulls a new snapshot rather than touching your filters).


Download

OS File
macOS (Apple Silicon) Beulea.s.EVE.Contracts_0.4.0_aarch64.dmg
Windows Beulea.s.EVE.Contracts_0.4.0_x64-setup.exe
Linux Beulea.s.EVE.Contracts_0.4.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