{% extends "base.html" %} {% block title %}Plugins · foilstack{% endblock %} {% block status %}{{ "{:,}".format(catalog_cards) }} catalogue cards · {{ "{:,}".format(vector_count) }} vectors · encoder {{ 'ready' if encoder else 'unreachable' }}{% endblock %} {% block screen %}
| GAME | SOURCE | CARDS | ENCODED | PRICES | HISTORY | ||||
|---|---|---|---|---|---|---|---|---|---|
| {{ row.label }} | {{ row.source }} | {{ "{:,}".format(row.cards) }} | {# A game with cards and no vectors cannot be matched at all, and the failure is silent at scan time — every photograph simply misses. #}{{ "{:,}".format(row.encoded) }} | {# "never" is not a stale cache. TCGCSV mirrors the current day only, so every day this has not run is a day of history that cannot be bought back for any game but Magic. #} {% if row.prices %}{{ row.prices.ago }} | {% else %}never | {% endif %} {% if row.backfill %}{{ row.backfill.ago }} | {% elif row.enricher %}not run | {% else %} {# Not a job somebody forgot: no installed enricher publishes this game's past, so there is nothing here to run. #}— | {% endif %}
Prices is when the sync last ran, not when a price last moved — a run that correctly changed nothing still counts. History is the backfill, which only ever adds days a sync never recorded.
{% else %}{{ sources[0].command if sources else 'foilstack ingest' }}, then foilstack embed
| PLUGIN | GAMES | INGEST |
|---|---|---|
| {{ p.name }} | {{ p.games | join(', ') }} | {{ p.command }} |
A source plugin runs code and reaches the network. Nothing is installed automatically and there is no registry. You add one deliberately, the same way you would any other dependency.
| PLUGIN | GAMES | ADDS TO | BACKFILL |
|---|---|---|---|
| {{ p.name }} | {{ p.games | join(', ') }} | {{ p.matches_source }} | {{ p.command }} |
An enricher owns no rows. It joins onto cards a source already ingested, by the upstream id that source recorded — so it names the one source it can speak to, and the writer refuses any other. That is what lets MTGJSON in: it publishes no card images and could never satisfy a source's contract, but it holds three months of daily Magic prices this install would otherwise have no way to learn. It is a repair, not a backup, and it may only ever add a day a sync never recorded.
{% else %}| PLUGIN | COLUMNS | FILE | |
|---|---|---|---|
|
{{ spec.label }}
{{ spec.description }}
|
{{ spec.columns | length }} | {{ spec.filename }} | Export |
Exporters are TOML column mappings, not code. Adding a marketplace means writing a file anyone can read in ten seconds and be sure it does nothing else.