{% 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 %}

Plugins

sources supply the catalogue · exporters write the file a marketplace accepts
Sources
{% for p in sources %} {% endfor %}
PLUGINGAMESINGEST
{{ p.name }} {{ p.games | join(', ') }} foilstack ingest --source {{ p.name }} --game pokemon

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.

Exporters
{% for spec in exporters %} {% endfor %}
PLUGINCOLUMNSFILE
{{ 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.

Image encoder
{% if encoder %}
status
ready
{{ encoder_url }}
model
{{ encoder.get('model', 'unknown') }}
catalogue
{{ "{:,}".format(catalog_cards) }}
cards ingested
vectors
{{ "{:,}".format(vector_count) }}
reference images encoded
{% else %}
no encoder reachable at {{ encoder_url }} — matching will fail until it is running
{% endif %}

Vectors from two different encoders are not comparable, and the failure is silent — plausible matches that are simply wrong. If you change the model, re-encode the catalogue.

{% endblock %}