{% extends "curb_base.html" %} {# This machine › Leaks: secrets found, by exposure; scanning; removing one from its file. #} {% block part %}
The leak scan cannot run. It needs a scanner called Kingfisher, which is not installed.
Install it in a terminal, then open this page again:
{{ k.cmd("pip install 'flanner[sweep]'") }}{% if job.total %}Scanning: {{ "{:,}".format(job.done) }} of {{ "{:,}".format(job.total) }} files read. {% else %}Finding the files to read…{% endif %}
Nothing leaves this machine. You can leave this page: the scan carries on.
The scan stopped. {{ job.error }}. The terminal that runs flanner web has the details.
Nothing was changed. Scan again to retry.
A scan reads agent transcripts, your shell history and project .env files, and lists the secrets it finds. It takes a few minutes, and nothing leaves this machine.
{% if not missing %} {% endif %} {% endcall %} {% endif %} {% if view.scanned %}Curb never stores where a secret is, so the places went when flanner restarted. Scan again to see them, and to remove a secret from its file.
{% elif not shown %}Where each secret is stays hidden. {{ k.ask_names() }} to see the file and line, and to remove a secret from its file.
{% endif %}Rotate it. Make a new one at the service that issued it, and switch the old one off. A secret that was sent to a model provider has left this machine, so removing the file does not help.
Then remove it from the file. Curb replaces the secret with a placeholder of the same length. There is no backup and no undo, because a backup would be another copy of the secret.
Check which still work sends each secret to its own issuer, and nowhere else. It asks you first.
The same scan, in a terminal:
{{ k.cmd("flanner curb sweep") }} {% endcall %}Curb scans again. Then it sends each secret it finds to the service that issued it, to ask whether it still works.
{{ removal.path }}
Rotate first. Removing a secret hides it here. It cannot unsend it.
There is no backup and no undo: a backup would be another copy of the secret.
{% endcall %} {% else %} {% endif %} {% endif %} {% endblock %}