social.addict.best
Functions arrive as five CLI verbs on your laptop. YAML is the config, JSON is the queue, Fernet is the identity, Chromium is the hand. A second, optional wiring exists on the live site: static HTML calls /agent/engine on FastAPI :8900, which mounts the shared /opt/social-engine/.
You type python run.py <verb>. run.py is a five-way switch. It loads config/settings.yaml, opens one Patchright Chromium through core/browser_session.py, then calls exactly one core module. There is no web button and no Contabo worker on the template path. The live /agent/ path is a different process: the browser page fetches JSON from the engine API; the engine reads the Contabo cookie vault and runs keep_alive / check_session / engage / post.
-
01
Load intent from files, not from a UI config/settings.yaml holds target_url, rate_limits, optional publishing.steps, and the Fernet storage path. content/queue.json is the post list with scheduled_time. content/post_urls.json is the analytics target list. If a file is missing, the verb fails before a browser opens.
-
02
login — human writes the identity once Headful Chromium opens account.target_url. You log in by hand (password + 2FA). Press Enter in the terminal. session_store.py writes storage_state encrypted with Fernet. Later verbs inject this state before navigate. There is no auto-login daemon.
-
03
Verb dispatch in run.py once → scheduler.run_once. serve → scheduler.run_forever (poll queue every few minutes). replies → replier.check_and_draft_replies. analytics → analytics.pull_analytics. Each path shares the same browser_session so cookies stay one identity.
-
04
rate_limiter — pacing, not a growth ramp Before a post leaves the queue, rate_limiter.py checks your own-account ceilings from settings.yaml. This is politeness for one account you own, not PhasedGrowth for a fleet.
-
05
publisher.py — two paths, same session If publishing.steps is filled (goto / click / fill / upload / wait), Playwright drives them — fast, free, no LLM. If steps are empty or a step throws, the SAME browser_session is handed to a browser-use Agent with a plain-language task: publish this one caption, attach this file, do not follow or like anyone else. Adaptive path costs LLM tokens; deterministic path does not.
-
06
replies — draft file, human is the send button The replier scrapes new comments/DMs and writes replies/pending.json. Nothing is sent unless auto_send: true (off by default). That is the honesty contract: the function stops at a file you can edit.
-
07
analytics — read-only pull to CSV Opens your own URLs from post_urls.json, reads visible metrics, writes analytics/metrics.csv. No mutation of other people's content.
-
08
Live overlay — /agent/engine is a different wiring https://social.addict.best is static HTML. It calls https://social.addict.best/agent/engine/{health,sessions,cookie-health,telemetry,login}. FastAPI :8900 mounts /opt/social-engine/ (db.py, cookie_manager.py, auto_login.py). Actions here are keep_alive, check_session, engage, post — in-memory jobs, no final_gate, no X-Console-Token. Complementary to Console, not a clone of the local template.
No heal loop. Session dead → run login again. CAPTCHA / checkpoint → stop; a human solves it. Deterministic steps throw → one fallback to browser-use on the same session, then report. The template will not resume after a platform flag. That refusal is a feature.