iRemembo is a lightweight photo-memory project.
It stores:
- a remembered image copy in Dropbox
- searchable metadata in a local SQLite database
- optional embeddings in a local embedding table
The intended primary workflow is interactive:
- the user sends an image in chat
- the user explicitly says to remember it
- chat-side image understanding produces structured metadata
- iRemembo writes that metadata into the local DB and uploads the retained image copy to Dropbox
The repo is being refactored so it can be installed directly as an OpenClaw plugin from the repository path:
openclaw plugins install ./iRememboOpenClaw-facing assets in this repo:
- skill entrypoint:
skills/iremembo/SKILL.md - command reference:
skills/iremembo/references/commands.md - write wrapper:
scripts/remember_to_iremembo.py - CLI entrypoint:
src/photo_memory.py
For operator readiness checks, use:
python3 src/photo_memory.py doctorIf you do not use the default local config paths, pass the config path before the subcommand:
python3 src/photo_memory.py --config /path/to/config.json doctor --dropbox-config /path/to/dropbox.json- remembers only images explicitly marked to keep
- stores image identity by
dropbox_path - keeps summary / OCR text / tags / entities searchable locally
- supports optional embedding generation for later semantic search
- keeps secrets and runtime data outside the repo
src/photo_memory.py— main CLIscripts/dropbox_tool.py— Dropbox helperconfig/example.local.json— local config templatedocs/architecture.md— architecture overview.env.example— example environment variables
Keep these outside the repo:
- real config
- SQLite DB
- tokens / secrets
- local thumbnails or caches
- logs / runtime state
- Copy
config/example.local.jsonto a local-only location. - Fill in your local paths.
- Either set environment variables, or place local-only config files at the default convention paths.
- Initialize the database.
Example with environment variables:
export IREMEMBO_CONFIG=~/iRemembo-local/config.json
export DROPBOX_CONFIG=~/secrets/dropbox.json
python3 src/photo_memory.py initExample with default local convention paths:
mkdir -p ~/.config/iremembo
cp config/example.local.json ~/.config/iremembo/config.json
# put your Dropbox secret JSON at ~/.config/iremembo/dropbox.json
python3 src/photo_memory.py init --config ~/.config/iremembo/config.jsonpython3 src/photo_memory.py init
python3 src/photo_memory.py doctor
python3 src/photo_memory.py remember-chat /path/to/image.jpg --analysis-json '{"summary":"示例","tags":["標籤1"],"entities":{"objects":["照片"]},"ocr_text":""}' --auto-embed
python3 scripts/remember_to_iremembo.py /path/to/image.jpg --analysis-json '{"summary":"示例","tags":["標籤1"],"entities":{"objects":["照片"]},"ocr_text":""}'
python3 src/photo_memory.py remember /path/to/image.jpg --summary "示例" --tags "標籤1,標籤2" --auto-embed
python3 src/photo_memory.py add /path/to/image.jpg --summary "示例" --tags "標籤1,標籤2"
python3 src/photo_memory.py annotate 1 --summary "更新後摘要" --tags "標籤1,標籤2,標籤3"
python3 src/photo_memory.py embed 1
python3 src/photo_memory.py inspect /path/to/image.jpg
python3 src/photo_memory.py find 關鍵字
python3 src/photo_memory.py search 關鍵字
python3 src/photo_memory.py search 關鍵字 --semantic
python3 src/photo_memory.py fetch 1Plugin-facing commands such as remember-chat, find, search, fetch, recall, inspect, and doctor emit JSON on stdout for success and JSON on stderr for failures.
- Install the plugin from the repo path with
openclaw plugins install ./iRemembo. - Put local-only config at
~/.config/iremembo/config.jsonand Dropbox secrets at~/.config/iremembo/dropbox.json, or exportIREMEMBO_CONFIG/DROPBOX_CONFIG. - Run
python3 src/photo_memory.py doctoruntil readiness checks pass. - Use
scripts/remember_to_iremembo.pyfor OpenClaw remember/write flows. - Use
src/photo_memory.py search,recall, andfetchfor lookup and send-back flows.
config path requiredorIREMEMBO_CONFIG is required: setIREMEMBO_CONFIGor create~/.config/iremembo/config.json.DROPBOX_CONFIG is requiredor Dropbox config missing: setDROPBOX_CONFIGor create~/.config/iremembo/dropbox.json, then rerunpython3 src/photo_memory.py doctor.- Safe send path rejected by chat tooling: fetch or recall into
/home/gigo/.openclaw/workspace/tmp/iremembo-send/. doctorreports unwritable DB or thumb paths: pointdb_pathandthumb_dirat local writable directories outside the repo.remember-chatfails: inspect the stderr JSON error payload instead of treating the write as successful.
The photos table keeps:
dropbox_pathsha256summaryocr_texttags_jsonentities_jsonuser_note- timestamps
- status
- embedding reference fields
The actual embedding vector is stored in photo_embeddings.
- CLI-side auto analysis is pluggable through
analysis_command. - In the interactive remember flow, the controlling chat model is expected to provide
ocr_textdirectly when it can read visible text from the image. - Embeddings currently use OpenAI
/v1/embeddingswhen enabled. - Duplicate detection is SHA-256 based.
remember/remember-chatare atomic from the assistant's perspective: success means the DB row exists and the Dropbox file is present. If upload or later write steps fail, the command exits non-zero and compensates by cleaning up partial writes where possible.- Retrieval now has two layers:
findfor plain keyword matching, andsearch --semanticfor embedding-based ranking. scripts/remember_to_iremembo.pyprefers explicit env vars, but if they are absent it will also look for local-only files at~/.config/iremembo/config.jsonand~/.config/iremembo/dropbox.json.
Run the regression suite with:
python3 -m unittest discover -s tests -vGitHub Actions runs the same suite on pull requests.
{
"db_path": "/absolute/path/to/iRemembo-local/photo-memory.db",
"thumb_dir": "/absolute/path/to/iRemembo-local/thumbs",
"dropbox_base": "/photo-memory",
"dropbox_tool": "/absolute/path/to/iRemembo/scripts/dropbox_tool.py",
"embedding_model": "text-embedding-3-small",
"analysis_command": []
}