Skip to content

FAQ

Narrower questions, shorter answers.

Does CodeSeal replace Git?

No. It wraps Git and stores encrypted blobs in ordinary Git storage. Your hosting provider, branches, pull requests and tooling are unchanged.

Are the encrypted files committed?

Yes. Everything under .sgit/store/ is committed and pushed. The plaintext originals stay on your machine, ignored through a managed .gitignore block.

Can I add CodeSeal to a project that already exists?

Yes — sgit init --wizard is the easiest route.

The caveat is worth reading twice: anything already pushed in plaintext stays in Git history. sgit history-rewrite re-encrypts historical revisions, but it cannot reach a clone someone already took. If a credential was in one of those files, rotate it.

Passphrase mode or recipient mode?

Passphrase mode is one shared secret and is right when you are alone. Recipient mode gives every person their own keypair, which is the only way to remove one person's access without re-encrypting for everyone.

Switch when a second human needs access you might later want to withdraw. Teams has the mechanics.

What do -s and -r do during init?

-s (--sensitive) takes files or folders to protect, expanding folders into individual manifest entries. -r (--remote) sets the Git origin if it is missing — it refuses to overwrite a different existing origin.

What does CodeSeal create in my repository?

.sgit/manifest.yaml, .sgit/store/, .sgit/tmp/, managed .gitignore and .gitattributes blocks, Git hooks, a merge driver, and a GitHub Actions workflow matching your CI mode plus a build.sh stub to fill in. In recipient mode also .sgit/recipients.yaml and .sgit/stanzas/.

Reference lays out which are committed.

How do I add non-sensitive files?

sgit add <file> — it sorts them itself. Files in the manifest are encrypted; everything else goes to git add. Use sgit add -s <file> to adopt a new sensitive file.

Should git add run before sgit encrypt?

Either order, as long as both are before sgit commit. The clearest habit is to stage normal files first, then run sgit doctor.

Do I need doctor or clean before pushing?

sgit push runs doctor for you. Run it by hand when you want an explicit check. clean is optional — it removes manifest-listed plaintext after encryption and is not required before every push.

Can my CI still build?

Yes, in four modes of decreasing runner trust — from handing the runner key material outright, to the Portal building so the runner never sees plaintext.

Can the build provider see plaintext?

In three of the four modes, yes: the runner decrypts, so it can read what it decrypted. In portal-build your CI provider never sees plaintext but the Portal worker does. Pick the mode matching who you are willing to trust with the build.

git push or sgit push?

sgit push on a protected repository. A raw git push still fires the pre-push hook, so it is not unprotected — but it skips the explicit wrapper, and a hook is easier to lose than a habit.

What encryption is used?

Passphrase mode: authenticated symmetric encryption keyed from SGIT_KEY.

Recipient mode: a fresh random 256-bit key per file, the file encrypted with AES-256-GCM, and that key wrapped to each recipient with age X25519.

Keys come from environment variables or identity files, never from command-line arguments, and sgit never prints a private key or plaintext to stdout.

Is .securegit/ still a thing?

No. The v1 layout (.securegit/manifest.yaml, .sgit-store/) is read-only legacy. Run sgit migrate once to lift it to the current layout — every blob is preserved bit-for-bit, and it never runs silently.

Is the binary I downloaded really yours?

Every release ships a SHA256SUMS file for integrity and a sigstore signature pair bound to this project's GitHub Actions identity. A passing cosign check means the archive came from that workflow.

The commands are in Install.

What if I lose my admin private key?

You lose the ability to change the recipient list — sgit rekey stops working. Existing recipients keep decrypting and their day-to-day is unaffected.

Recovery: any remaining recipient runs sgit rekey full, which mints a fresh admin keypair and re-encrypts. If every key is lost and no recipient remains, the files are unrecoverable — which is the property you asked for.

How do I remove plaintext after encrypting?

sgit clean. It deletes only manifest-listed plaintext that has been encrypted, and never touches anything else.