Open-source access gateway · self-hosted

Knock. Approve. Enter.

Human-in-the-loop access control for web apps and SSH.

Kalitka adds an explicit human decision before access is granted — while keeping your existing authentication in place.

Request pathfail closed
User
untrusted request
Kalitka
the gate
Approve / deny
human decision
Resource
own auth continues

No approval, no path through. Grants are temporary and expire on their own.

In practice

A contractor needs Grafana for 30 minutes.

They open grafana.example.com. Kalitka creates an access request. You see who is asking, which resource they want, and where the request comes from. Approve once. Access expires automatically.

See who is asking, what they want to access, where the request comes from, and approve only that request.

Scenario30 min
  1. Contractoropens the link
  2. grafana.example.comprotected resource
  3. Kalitkaaccess request
  4. Telegram approvalone human decision
  5. Temporary accessexpires on its own
The idea

Authentication answers who you are.
Kalitka asks whether you should enter right now.

Your applications probably already have Google, local credentials, LDAP, MFA or another login. Kalitka does not replace them. It puts one explicit human decision in front of them.

Keep your existing authentication. Add a human decision before access.

  1. 01Somebody requests access to a protected resource.
  2. 02Kalitka creates an access request.
  3. 03An authorized person approves or denies it.
  4. 04A temporary grant is issued.
  5. 05Normal application authentication continues.
Web access

Put Kalitka behind your reverse proxy and in front of sensitive applications.

Your proxy asks Kalitka whether a request may pass. Kalitka answers from recorded state: an approved, unexpired grant for that resource — or nothing.

It works as an additional gate and does not replace application authentication.

Browseruser
Traefik · nginx · Caddy · Envoyreverse proxy
Kalitkaapproval gate
Applicationown authentication
SSHexperimental

Approval inside the SSH login flow

Kalitka can integrate into an SSH login flow using PAM and human approval. The connection waits until someone decides, and the session is bound to that grant.

SSH support is experimental — expect the interface around it to keep changing.

ssh session
$ ssh prod-01
 
Kalitka approval required.
Waiting for approval...
 
✓ Approved.
Opening session.
Approval channels

Decide where you already work

Telegram

Fast approval from an existing chat workflow.

Web Control Plane

Review pending requests, approve or deny access and inspect history.

Email

Secure cross-channel approval using short-lived one-time capabilities.

What the approver sees

Context first, then the decision

Before approving, the person deciding sees who is asking, which resource is requested and where the request originates — so an approval is never a blind tap on a notification.

Telegramaccess request
Kalitka
bot · now

Access requested

User
contractor@example.com
Resource
grafana.prod.example.com
Source
91.x.x.x · Germany
Requested
one-time access
Approve onceDeny

Illustration of the approval message — buttons are not interactive here.

Every decision is bound to a specific request and resource.

Kalitka control planerequests · 1 pending
ResourceSubjectSourceStateTimeApprover
grafana.prod.example.comcontractor@example.com91.x.x.x · DEpendingjust now
pgadmin.internal.example.comanna@example.com10.x.x.x · officeapproved12 min agosergej
grafana.prod.example.comcontractor@example.com91.x.x.x · DEexpired2 h agosergej
backup.internal.example.comunknown@example.com203.x.x.x · unknowndeniedyesterdayanna

The web control plane lists pending requests and past decisions with resource, subject, source, state, time and approver. Example data shown.

Security model

The gate should fail closed.

When Kalitka cannot confirm an approved, unexpired grant for a resource, the request does not pass. Grants end on their own instead of waiting to be revoked.

Read the security model
  • short-lived grants
  • one-time capabilities
  • resource-bound access
  • signed sessions
  • explicit trusted-proxy boundaries
  • atomic resolve-once semantics
  • durable audit events
Positioning

Why not just a VPN?

Kalitka is not trying to replace your VPN or identity provider. It adds a human decision where permanent standing access is too much.

  • VPN / Tailscale

    Gives network reachability: once you are on the network, the services behind it are reachable.

  • Cloudflare Access

    Identity- and policy-based application access, evaluated automatically from rules.

  • Teleport

    A broader infrastructure access platform covering servers, clusters and databases.

  • Kalitka

    Adds an explicit human approval step for a specific access request, where permanent standing access is too much.

Break-glassdesign consideration

Fail-closed by default. A separate, auditable break-glass path is part of the operational design rather than silently bypassing approval.

Self-hosted

Your gate. Your infrastructure.

Kalitka ships as a container and runs inside your own infrastructure, next to the services it protects. State stays local in SQLite; there is no external control plane to depend on.

DockerContainer deploymentSQLite stateNo external control plane
pull the image
docker pull ghcr.io/everycore-net/kalitka:latest
Quickstart

Point your proxy at the gate

Run the container next to your services, then send the routes you want protected through a forward-auth check. The snippet is an illustrative Traefik example — see the documentation for the complete configuration.

Open sourceSelf-hostedSSH: experimentalDocker · GHCR image
example · traefik forwardauth
# example only — see docs for the full setup
http:
  middlewares:
    kalitka:
      forwardAuth:
        address: "http://kalitka:8080/auth"
        trustForwardHeader: true
  routers:
    grafana:
      rule: "Host(`grafana.example.com`)"
      middlewares: ["kalitka"]
      service: grafana
Open source

Built in the open.

Access control is easier to trust when you can read it. The code, the security model and the decisions behind them are public, so you can verify how the gate behaves instead of taking a description at face value.

Explore the source on GitHub
Web gate
proxy approval
SSH
PAM · experimental
Approvals
chat · web · email
Audit
durable history
What’s next

Where the gate is heading

Broad directions, not promises or dates.

planned
Multi-node deployments
planned
Deeper SSH controls
planned
More infrastructure integrations

Someone is knocking.
Decide who gets through.