Your passwords, on a device you hold.

Kleidos keeps your passwords encrypted on a small device and types them for you over Bluetooth, after you unlock it on the device itself. No app. No cloud. Nothing to sign up for.

  • Coming soon
  • AES-256 + HMAC-SHA256
  • Bluetooth LE Secure Connections
  • WPA3 admin network
Unlocking a device and opening an entry. A StickC Plus S3 wakes on its locked screen. A button is held four times, the arc sweeping to a different digit each time; the device derives the key, and the unlocked vault lists six demonstration services: GitHub, Google, Microsoft, Dropbox, Mastodon and Bluesky. A recording of the device's own screen: the board sent every frame over Wi-Fi as it drew it, while a script worked its controls, so the clip runs at the speed the device really runs at.
One firmware, nine boards. Drawn to scale from each board's measured case and screen: 24 × 48 mm for the smallest, 73 × 115 mm for the largest.
Drawing with device screens One firmware, nine boards Drawn to scale from each board's measured case and screen: 24 × 48 mm for the smallest, 73 × 115 mm for the largest.

How it works

  1. Step 1. Unlock it

    Enter your PIN on the device. The two-button models have no keypad: you hold a button while an arc sweeps through the digits and let go on yours, once per digit. A PIN is 4, 6 or 8 digits; the models with a keyboard take a passphrase instead, and the touch models let you choose one.

    The PIN screen, mid-sweep. Captured from the device's own screen on a development build.
  2. Step 2. Pick an entry

    Scroll your vault and open an entry. It draws the service's mark when it recognizes the name, and the password stays masked until you ask for it, then masks itself again.

    The vault list. On the touch model a finger drags the vault list down to the last of the six demonstration services, and two taps open it: the account is shown, the password still masked. A recording of the device's own screen: the board sent every frame over Wi-Fi as it drew it, while a script worked its controls, so the clip runs at the speed the device really runs at.
    An entry, password hidden. Captured from the device's own screen on a development build.
  3. Step 3. Let it type

    Choose what to send. Kleidos becomes a Bluetooth keyboard, types it into the computer you paired, and shuts Bluetooth down again.

    Choosing what to type. A demonstration entry is open. The chooser asks what to type — the pair, the username, or the password — the device advertises and waits for a computer, and the cancelled session shuts Bluetooth down again. Assembled from captures of the device's own screen, in the order and at the times a live run shows them.

    What the Bluetooth link does

    • It only sends. The device is a keyboard: the one thing the computer can write back is the keyboard-LED byte, and Kleidos does nothing with it.
    • Pairing is LE Secure Connections only, with a six-digit number you compare and confirm on the device. Legacy pairing is not compiled in.
    • Keystrokes leave only over a bonded, encrypted, authenticated link with a 16-byte key, and the link is checked again immediately before every report.
    • The device advertises under a private address that changes every 15 minutes.
    • A computer that is already paired cannot quietly pair again: the device refuses and asks you first.
    • Bluetooth is off until you start a session — sending an entry, pairing a new computer, first-time setup — and it is shut down when the device locks or sleeps.
  4. Step 4. Manage it from a browser

    To add, import or export entries, open the admin panel: the unlocked device puts up its own Wi-Fi network and shows a QR code. Scan it, and the panel is in your browser. The models with a keyboard can also edit entries on the device.

Security on the device

The vault is a few files on the device's own flash. Everything below is about what those files are worth to someone who takes them.

How your PIN reaches the records Your PIN or passphrase goes through PBKDF2-SHA256 with a random per-vault salt. That gives a key which unwraps the vault key, and the vault key gives the separate keys that encrypt and authenticate each record. PIN or passphrasePBKDF2-SHA256, random saltunwraps the vault keyAES-256-CBC + HMAC-SHA256 records

Every entry is encrypted and authenticated

A record is encrypted with AES-256-CBC and authenticated with HMAC-SHA256, encrypt-then-MAC. The tag is verified before anything is decrypted, and it covers the record's type, its slot and a counter — so a record cannot be moved to another slot, read as another type, or rolled back on its own. Password entries are all padded to the same 4 KB, so their size says nothing about what they hold.

Your PIN is never stored

The key is derived from your PIN with PBKDF2-SHA256 over a random per-vault salt: 175,000 iterations on the ESP32-S3 boards, 40,000 on the classic ESP32 boards, each sized to roughly a two-second unlock. What the device stores is a verifier, not the PIN. Encryption, authentication and the unlock check use three separate keys.

Lockout, then wipe

From the fourth wrong secret the device locks for 30 seconds, from the seventh for 5 minutes. The tenth erases the vault, every Bluetooth pairing and the admin network's identity. The attempt is written down before the secret is checked, so cutting the power does not buy a guess back.

Keys are wiped when it locks

Locking and sleeping both stop the radios and then erase the keys and the decrypted lists from memory. The buffers that held them are overwritten on purpose, not just released.

Production builds are quiet

The release and hardened builds compile no serial console and no log calls at all, and a crash prints nothing — no banner, no registers, no backtrace. The chip's own mask-ROM boot line is all that remains, and it says nothing about your vault. Passwords, usernames and PINs are kept out of logs by design.

Hardened build: in development

In development

On the 8 MB boards the hardened build adds Secure Boot v2, flash encryption and encrypted settings, and ties the vault key to the individual chip — so a copy of the flash cannot be attacked away from the device. I have not finished it: I have still to write what provisions the chip key on the ESP32-S3 boards, so a hardened build cannot create a vault there today.

The admin panel

In development

Everything in bulk — adding entries, importing from another manager, exporting an encrypted backup, updating the firmware — happens in a browser, on a network the device itself puts up. The device is the web server: nothing goes through an outside service.

The panel is in development. It is already where entries are added, imported from another manager and exported as an encrypted backup, and it is still changing: where the device draws each service's mark, the panel prints the name as text.

The vault in the panel: the same six demo entries the device shows.

I opened the panel's own page — the bytes the firmware serves — in a browser against a demo vault served from this computer instead of from a board, and captured it there. The walkthrough and the rest of the captures are with the other recordings.

The devices

One firmware across nine boards, from a 24 × 48 mm stick with two buttons to a 73 × 115 mm unit with a keyboard. Which board you use changes how you unlock it and how much the screen can show; it does not change the vault.

M5StickC Plus S3, 24 by 48 mm, drawn to scale

M5StickC Plus S3

Chip
ESP32-S3
Input
Two buttons
Screen
135×240
Case
24×48 mm
Hardened build
In development
M5StickC Plus2, 24 by 48 mm, drawn to scale

M5StickC Plus2

Chip
ESP32
Input
Two buttons
Screen
135×240
Case
24×48 mm
Hardened build
In development, chip revision 3.0 or later
M5StickC Plus 1.1, 24 by 48 mm, drawn to scale

M5StickC Plus 1.1

Chip
ESP32
Input
Two buttons
Screen
135×240
Case
24×48 mm
Hardened build
Not available (4 MB flash)
M5StickC Plus SE, 24 by 48 mm, drawn to scale

M5StickC Plus SE

Chip
ESP32
Input
Two buttons
Screen
135×240
Case
24×48 mm
Hardened build
Not available (4 MB flash)
M5Stack CoreInk, 40 by 56 mm, drawn to scale

M5Stack CoreInk

Chip
ESP32
Input
Dial
Screen
200×200
Case
40×56 mm
Hardened build
Not available (4 MB flash)
M5Stack CoreS3 SE, 54 by 54 mm, drawn to scale

M5Stack CoreS3 SE

Chip
ESP32-S3
Input
Touch screen
Screen
320×240
Case
54×54 mm
Hardened build
In development
M5Stack Core2 v1.3, 54 by 54 mm, drawn to scale

M5Stack Core2 v1.3

Chip
ESP32
Input
Touch screen
Screen
320×240
Case
54×54 mm
Hardened build
In development, chip revision 3.0 or later
M5Cardputer ADV, 84 by 54 mm, drawn to scale

M5Cardputer ADV

Chip
ESP32-S3
Input
Keyboard
Screen
240×135
Case
84×54 mm
Hardened build
In development
LilyGO T-Deck Plus, 73 by 115 mm, drawn to scale

LilyGO T-Deck Plus

Chip
ESP32-S3
Input
Keyboard
Screen
320×240
Case
73×115 mm
Hardened build
In development

Each board is drawn from its own measured case and screen dimensions, not from a photograph. Pictures and recordings of the real screens are on the in-use page.

Screens are shown in English. The device itself also speaks Spanish, French, German and Italian.

Kleidos is an independent project, not affiliated with M5Stack or LilyGO. Product names are their owners' trademarks.

Every flow, on every board →

Where the project is

The whole of it, honestly: what works, what is being built, and what has not been started. Each row names what makes it true.

  1. Working

    One firmware, nine boards

    Every board registers its own hardware — its screen, its power controller, its buttons or keyboard — into the same firmware, and the drawings in “The devices” are generated from the same measured boards (src/boards/).

  2. Working

    The encrypted vault on the device

    Entries are stored as encrypted, authenticated records, with separate keys for encryption, authentication and the unlock check, and the host test suite covers the round trip and the refusals (src/vault/).

  3. Working

    Unlocking, on every kind of input

    The two-button boards dial a PIN on the timing arc, the boards with a keyboard take a passphrase, and the touch boards are offered either (src/ui/entry/).

  4. Working

    Typing over Bluetooth

    The device becomes a Bluetooth keyboard for the session it is told to start, types over a bonded and authenticated link, and shuts the radio down again when the session ends (src/ble/).

  5. Working

    Firmware updates from the browser

    On the boards with room for two app partitions, firmware is uploaded from the admin panel; an image built for another board or an older version is refused, and an update that boots but never confirms itself rolls back on its own (src/platform/ota.cpp).

  6. Being built

    The admin panel

    In development. It is already where entries are added, imported from another manager and exported as an encrypted backup, and it is still changing (src/web/).

  7. Being built

    The hardened build

    In development. Secure Boot, flash encryption and encrypted settings are configured for the 8 MB boards; I have not written what provisions the per-chip key on the ESP32-S3 ones yet, so a hardened build cannot create a vault there today (docs/security/secure-provisioning-checklist.md).

  8. Not started

    The power figures, measured at the cell

    Every board's current is still an estimate. I have not made the bench measurements that would replace the estimates with readings from a meter, so this page quotes no power figure at all (docs/testing/production-sleep-checklist.md).

  9. Not started

    The long end-to-end run

    The release criteria ask for 50 end-to-end cycles — boot, unlock, browse, type, sleep — with no crash. I have not run them, and I have ticked no other box on that list either (docs/QA_CHECKLIST.md).

  10. Not started

    The first release

    There is nothing to install yet: the firmware is at version 0.1.0, no release is published, and this page says “coming soon” because that is what it is (version.txt).

  11. Not started

    Flashing a board from the browser

    The page that would install the firmware over USB from a browser is written and parked: it has no release to offer, so this site publishes nothing at its address and its own manifest lists no build (web/).

  12. Not started

    A review by somebody else

    I have not had the firmware or the cryptography reviewed by anybody outside the project. The dossier an auditor would start from is written and waiting (docs/security/audit-dossier.md).

I put no dates on this list. It names only work that exists in the repository, and a step nothing there can show is listed as not started.

What it does not do yet

Read this part before the rest.

The departments

The project is organized the way a company is. Every department below is work that exists in this repository, and every post is held by the same person.

Direction

Founder and director

José M. Requena Plens

  1. Brand and design

    Creative director

    José M. Requena Plens

    Yes, him again.

    docs/design/

  2. Product and hardware

    Head of board selection

    José M. Requena Plens

    Still him.

    variants/

  3. Firmware

    Principal firmware engineer

    José M. Requena Plens

    src/

  4. Security

    Cryptography architect

    José M. Requena Plens

    The hiring process was short.

    src/crypto/

  5. Interface and experience

    Head of product design

    José M. Requena Plens

    src/ui/

  6. Admin panel · backend

    Server engineer

    José M. Requena Plens

    Internal promotion.

    src/web/

  7. Admin panel · frontend

    Client engineer

    José M. Requena Plens

    web_src/index.html

  8. Validation and QA

    Head of quality

    José M. Requena Plens

    There is a career path here, too.

    test/

  9. Hardware lab

    Board test technician

    José M. Requena Plens

    qa/tests/hardware/

  10. Documentation

    Technical writer

    José M. Requena Plens

    And the coffee.

    docs/

  11. Release

    Version manager

    José M. Requena Plens

    version.txt

  12. Compliance and licensing

    Legal counsel (GPL-3.0)

    José M. Requena Plens

    Open positions: all of them.

    LICENSE

Follow and subscribe

There is nothing to install and nothing to sign up for. Pick whichever of these you already read.

There is no repository to watch yet: I am keeping the source private while I prepare the first release, so the feed and the two accounts are the whole of it.