tapflow
Self-hosted iOS & Android simulator streaming for the whole team
Chat with Gemini or Claude models using your own API key
AI summary · website content
Developer toolsPythonGitHub @msavastanoOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Self-editing agent on Gemini 3.5 Flash. Three-tier markdown memory (system / active / archive), per-user isolation, web UI + CLI.
pip install -r requirements.txt
$env:GEMINI_API_KEY = "..."
Web server (multi-user, mock login):
uvicorn server:app --host 127.0.0.1 --port 8000
Open http://127.0.0.1:8000 → pick a mock user → chat.
CLI (single user per process):
$env:AGENT_USER_ID = "alice"
python agent.py
data/users/<user_id>/skills/.## sections.sessions/<session_id>.jsonl./api/session/end (or Ctrl-C in CLI) → session summarized into a new active skill.data/users/<user_id>/
skills/
system/*.md # always loaded (identity, response style, hard rules)
*.md # active tier, frontmatter-matched
archive/*.md # archive tier, section-retrieved by ## heading
sessions/
<session_id>.jsonl # one turn per line
---
name: skill-name
description: One-line description used for matching against prompts
---
Body. For archive-tier, structure with ## sections for granular retrieval.
mock_users.json lists allowed user ids. Login POSTs to /api/login which sets a signed cookie. current_user dependency in server.py re-validates the cookie on every request.
Single seam for Google OAuth: replace /api/login with the OAuth callback. Cookie payload shape ({"user_id": "..."}) and current_user dependency stay identical. Nothing else in the codebase touches identity.
Mock login has no password — bind to 127.0.0.1 only.
GEMINI_API_KEY or GOOGLE_API_KEY — required.AGENT_USER_ID — CLI only. Must exist in mock_users.json.SECRET_KEY — optional. Auto-generated at .secret_key if absent.AGENT_DEBUG=1 — prints raw LLM JSON from reflect/session calls.| Method | Path | Body / Notes |
|---|---|---|
| GET | /api/users | Public. Mock account list. |
| POST | /api/login | {user_id} → sets cookie. |
| POST | /api/logout | Clears cookie. |
| GET | /api/me | Current user. |
| POST | /api/chat | {session_id?, message} |
| POST | /api/session/end | {session_id} → writes skill. |
| GET | /api/sessions | List user's sessions. |
| GET | /api/skills | List user's skills. |
| DELETE | /api/skill/{name} | Remove a skill. |