Inspekt
Get a key

How Inspekt compares

You have four options for showing a CS2 item on a listing page: build a renderer, use a flat image, embed somebody else's viewer, or embed ours. This page is about the first three as much as the fourth, because the objection nobody raises on a call is "we could build this ourselves" and it deserves a real answer.

The short version. You can absolutely build this. Getting a weapon on screen takes a day. Getting from there to every finish in the game, rendered closely enough that a trader does not argue with it, took us about two months of full-time work, and it is a permanent maintenance job after that. The hard parts are not the 3D. If a live 3D view of the exact item is a core differentiator for your marketplace, build it. If it is a feature on a listing page, rent it. Flat images are the right answer more often than a renderer vendor likes to admit, and a viewer you have already integrated and are happy with is not worth ripping out.

The four options at a glance

InspektBuild in-houseStatic imagesAnother viewer
Time to live A script tag, or an iframe Months, then forever You already have them Their integration, ask them
Coverage 2,135 of 2,135 weapon x finish combos, re-derived by a tool on demand Whatever you have extracted this month Every item, one canonical angle Ask for their number and how it is measured
Per-item accuracy The float, seed, stickers, StatTrak and name tag of the item being sold Same, if you build it No. One picture per skin, not per item Usually yes
Input A Steam inspect link, or explicit params You write the decoder n/a Usually an inspect link
Browser reach 3D needs WebGPU. Everyone else gets the Render API still Same constraint, it is the platform Universal Same constraint
New cases Renderable within 7 days of release, written into the Terms Your backlog, at Valve's schedule Immediate, Valve ships the icon Ask what they commit to
Who fixes it at 2am One person, by email, targets in the Terms Your on-call Nobody, nothing to break Them
Cost $0, $49 or $199 a month, published. Enterprise by arrangement An engineer, indefinitely Storage Not published, in the cases we know of

Everything in the Inspekt column is checkable before you talk to us. The coverage number comes out of npm run coverage against the catalog and the disk, the plans and quotas are on Pricing, the 7 days and the uptime number are in Terms section 9 and the SLA, and the whole surface is in the docs with a sandbox that needs no account.

Building it yourself

This is the honest column, so it goes first and it gets the most room. Nothing below is meant to scare you off. It is the list of things we had to do, in the order they bite, so you can price the project properly instead of estimating "a 3D viewer" at three weeks.

1. Getting the assets out of the game, and keeping them out

CS2 ships its models, textures and materials inside Source 2 packages. To read them you need a Valve Resource Format decompiler, a KTX2 encoder, and a CS2 depot on disk, which is roughly 35 GB pulled through steamcmd and re-pulled every time Valve patches. Then you need a parser for Valve's KV3 material format, including the binary blob form, because a meaningful share of the numbers you need are in there.

The pipeline is not the hard part. The hard part is that it is a join: item definitions, paint kits, the icon listing, and the files on disk all have to line up, and when they do not, the failure is silent and flattering. Our own catalog builder joined a weapon and a kit with a literal NUL byte in two places and a plain space in a third. The result was eight skins that the extractor never saw and that nothing complained about, including an M4A1-S Emerald Marbleized and all four Gamma Doppler phases. Separately, 94 gloves were reported as an extraction gap when every glove manifest was already on disk and only the index was stale. Both bugs made the coverage number look like a rendering problem, which is the flattering explanation, and both were wrong.

Some of what you want is not extractable at all. The game's post-processing shaders sit in a shader package at a version the public decompiler refuses, so anything you need from them you re-derive by measurement rather than by reading.

2. Porting the finish compositor exactly

A CS2 finish is not a texture. It is a small program: a paint style, a base texture, a pattern, a wear mask and a set of per-kit constants, composited at load time. There are ten weapon finish styles to port, plus the glove cloth composite, and they are not variations on one shader. Our catalog scan counts SolidColor 136, Hydrographic 330, SprayPaint 243, Anodized 20, Anodized Multicoloured 392, Anodized Airbrushed 62, CustomPaintJob 387, Patina 163, Gunsmith 304, and Titanium 4. Titanium is used by four items in the entire game and you still have to write it, or four items render wrong forever.

The errors in this stage are quiet. Ours included decoding the manifest paint colours as sRGB when they are linear, which makes every colour subtly wrong in a way that looks like a lighting problem. That class of bug is why the phrase "close enough" does not survive contact with a customer who puts your render next to the game.

Then the grade. Matching the game means the tone curve with the per-scene constants out of the map manifests, per-scene exposure calibration, and the bloom chain: four quarter-resolution levels, a four-tap bright pass with a linear soft knee, a stand-in for the game's separable gaussian, tent combines, and the border-black behaviour of the game's samplers. We shipped a hard clamp at the white point for months and did not notice. It measured as 84.8% of a Printstream's slide fully clipped to white, against 0.0% on the reference we compared with, while the mean luminance matched. Mean luminance matching is exactly why nobody notices. The fix was a swept roll-off constant, and it invalidated every thumbnail and every cached render we had.

3. Wear and pattern seed

Float is not a slider from 0 to 1. Each kit remaps it onto its own range, and the compositor consumes it differently per style, so the same float on two skins is not the same wear. Pattern seed selects the crop and rotation of the pattern texture, which is the entire basis of the Case Hardened blue gem, Marble Fade ranks and the Doppler phases. Those phases carry distinct kits, so they are catalog entries in their own right, not a post-processing tint.

Here is a number for how exact this has to be: on our own regression suite, a change of pattern seed on one item measures 33.0 dB and a change of wear measures 35.0 dB, where the pass threshold for "nothing moved" is 50 dB. Seeds and wear are not a subtle effect. If you get them wrong, every trader on your site can see it, and they are the people who care most.

4. Stickers and charms

Five sticker slots, over 11,000 stickers, each with its own scratch wear, plus the holo, foil and glitter treatments. The placement data is the interesting part. Steam's human-readable description line lists sticker names in slot order, not by slot number, so using the position in that list as the slot shifts every sticker left past an empty slot. We shipped that bug. A lone sticker in slot 4 imported as slot 1, and it was wrong on 8 of the 9 sticker-bearing items in our test inventory.

The correct source is the XOR-masked item preview block, the same structure an inspect link encodes, which carries real slot numbers, per-sticker wear, and the free placement a player can set since May 2024: offset, rotation and scale. Decoding it is a protobuf you write by hand against no published schema.

Then the models disagree with the data. Only four weapon materials in the game define five sticker positions, while CS2 lets a player apply five stickers to anything. A fifth sticker on a four-position weapon renders at position 0, the grip. We know that because we checked one item against an in-game screenshot: the slot numbers map straight through with no offset, the certificate's rotation of 90 degrees is what stands the sticker upright, and the overflow lands on the grip. One verified item was enough only because slots run 0 to 4 and a weapon has four positions or five, so there is exactly one remap the rule can ever make.

Charms hang from a keychain anchor and, in the game, run a softbody drape. Ours does not, and that is in What we do not do below.

5. Storing and shipping it

Full coverage is about 20 GB of transcoded textures, backdrop video, models and thumbnails, content-hashed and immutable, before you count a render cache. Then two second-order costs that surprise people:

6. The standing cost of every new case

This is the part that does not appear in a project estimate, because it is not a project. Every case Valve ships adds items and paint kits, occasionally needs a technique you have not written, and arrives without warning. Someone has to have the game installed, the pipeline working and the afternoon free, forever. We publish 7 days for that and it is in the Terms as a commitment, not a target.

And the number you publish has to be derived, not remembered. Ours read 2,274 in one document and 95.2% in another before anyone made it a tool. Both were wrong, and both were wrong in the direction that made us look better.

When building it is the right call

Three cases, and they are real:

Static screenshots and Valve's item icons

The cheapest option, and the one most listing pages should probably still be using for most of their traffic. Valve ships an icon for every item, it is free, it loads instantly, it works in every browser, it never breaks, and no vendor can take it away from you. Any comparison page that pretends otherwise is selling something.

What it cannot do is show this item. The icon for a Case Hardened is the same icon for the one with the blue play side and the one that is mostly grey, and those two items differ by four figures in price. A screenshot library has the same limit at a larger scale: one picture per skin, not per float, seed and sticker combination. The moment your listing page has to answer "what does the one I am buying actually look like", a flat catalog image stops being an image of the product and becomes an image of the category.

The honest middle path is our Render API, which is a still image too. It takes the inspect link of the specific item and returns a webp you can cache forever, because the URL's identity is a hash of the config. No WebGPU on the visitor's device, no JavaScript, no iframe. If flat images are working for you and the only problem is that they are generic, the Render API is a smaller change than the embed and probably the one to start with.

The existing third-party viewers

They exist, they are good, and the arrangement we are proposing is one the market has already done: a marketplace embeds a third-party 3D viewer rather than building one. We are not claiming to have invented this shape.

What we can say concretely comes from a hands-on teardown we ran ourselves, driving a real browser against a live competitor in July 2026 with a re-read in September. Not from their marketing, and not from source. Their catalog was 2,126 skins plus knives and gloves, with a custom WebGPU engine, their own compiled asset formats decoded in WebAssembly, and a server-assisted shader cache per device tier. It is a serious piece of engineering and their renderer is at least as good as ours.

Four differences we would actually stake a claim on, with the caveat that a competitor can close any of them and our teardown may already be stale:

And the honest counterweight: if you are already integrated with a viewer and your users are not complaining, the case for moving is narrow. Integration cost is real, your team learned their API, and "ours is a bit more accurate in the highlights" is not a migration budget.

What we do not do

Checked against the running service, not against an old roadmap. If one of these is a requirement, it is better for both of us that you find it here.

Who should not buy this

Six situations where the answer is no, and where we would rather say so now than in month three:

Check it yourself

Everything above is either measurable from outside or written into a document you can read without an account. The fastest way to disagree with this page is to put a real inspect link into the sandbox and look at the result next to the item in-game.

Still not sure whether it fits? Email hello@inspekt.gg with what you are building. A straight "no, that is not what this is" is a perfectly normal answer.