Lifepath: AI Life Simulator
WarnAudited by ClawScan on May 10, 2026.
Overview
The simulator’s purpose is understandable, but the code embeds undisclosed API keys and exposes unauthenticated endpoints that can read stored lives or post to Moltbook using a configured key.
Do not run this as-is on a public network. If you want to test it, use an isolated local environment, remove the hardcoded API keys, provide your own scoped keys, add authentication and ownership checks to the API, and bind the server to localhost until those controls are in place.
Findings (5)
Artifact-based informational review of SKILL.md, metadata, install specs, static scan signals, and capability signals. ClawScan does not execute the skill or run runtime probes.
Story generation may run under unknown provider credentials, and the embedded keys can be exposed or abused outside the user’s control.
The code silently rotates through embedded Gemini API keys in addition to user-provided environment keys, while the documentation tells users to provide their own Gemini key.
this.apiKeys = [ process.env.GEMINI_API_KEY, process.env.GEMINI_API_KEY_BACKUP, 'AIzaSyCaM-ZhzT...', 'AIzaSyAEwvtsgQ...' ].filter(Boolean);
Remove hardcoded API keys, require explicit user-provided credentials, declare them in metadata, and fail closed when no key is configured.
If the server is reachable, someone could trigger public Moltbook posts using the configured Moltbook account/key.
The route posts to Moltbook using the configured API key, defaults to public sharing, and shows no requester authentication, ownership check, or confirmation step before posting.
fastify.post('/share/:lifeId' ... const { mode = 'public' } = request.body; ... fetch(`${MOLTBOOK_API}/posts`, { method: 'POST', headers: { 'Authorization': `Bearer ${API_KEY}` } ... })Require authentication and life ownership checks, bind the server safely by default, and require explicit user confirmation before publishing externally.
Private gameplay histories and user-linked identifiers may be exposed to anyone who can query the API with a life ID.
The API returns full stored life records and history by lifeId without visible authentication or authorization; the service also joins user data such as telegram_username.
fastify.get('/:lifeId' ... const life = await lifeService.getLife(lifeId); const history = await lifeService.getLifeHistory(lifeId); ... return { success: true, life: { ...life, history } };Add authentication, authorization, and minimal-response filtering for all user/life data endpoints.
Users may not realize this is a runnable server package with dependencies, a database, ports, and credentials until after reading the files.
The registry metadata under-declares the runtime requirements that SKILL.md and INSTALL.md describe, including node/npm/psql, npm install, PostgreSQL, and multiple API keys.
Required binaries: none; Required env vars: none; Primary credential: none; Install specifications: No install spec — this is an instruction-only skill.
Declare binaries, environment variables, ports, credentials, and installation steps in registry metadata, and include a lockfile for dependency reproducibility.
The service may remain running and reachable on the network until stopped, increasing exposure of its unauthenticated endpoints.
The package runs as a persistent network service and can launch a Telegram bot; this is purpose-aligned but should be explicitly controlled.
await fastify.listen({ port: process.env.PORT || 3000, host: '0.0.0.0' }); ... if (process.env.TELEGRAM_BOT_TOKEN) { const bot = new TelegramBot(fastify.pg); bot.launch(); }Run only in a controlled environment, bind to localhost unless public access is intended, use a firewall, and stop the server/bot when not needed.
