create-internal-app
Skill32 starsChanged 24 days agoMITView on GitHub
Create a private internal app on the user's VPS through Dokploy, locked by password and IP allowlist, always with an admin area, an API with keys and a CLI so their agent (Hermes) controls everything. Use when the user wants an internal tool, CRM, dashboard, back-office or an app "just for me" or "only for my team".
- Reads credentials
In this repository42 other files it gives its agents.
- skills/setup-my-hermes-dashboard/template/AGENTS.mdAGENTS.md
- audit-safetySkill
- betterSkill
- cleanupSkill
- create-projectSkill
- doneSkill
- dreamSkill
- projectsSkill
- setup-brainSkill
- cloudflareSkill
- code-debugSkill
- codex-imagesSkill
- connect-googleSkill
- connect-instagram-developer-platformSkill
- connect-toolSkill
- connect-vpsSkill
- connect-youtube-developer-platformSkill
- convexSkill
- create-landingSkill
- create-softwareSkill
- dev-browserSkill
- grill-meSkill
- initializeSkill
- install-skillsSkill
- lumailSkill
- safe-shipSkill
- setup-cloudflareSkill
- setup-convexSkill
- setup-dev-browserSkill
- setup-githubSkill
- setup-lumailSkill
- dashboardSkill
- setup-my-hermes-dashboardSkill
- setup-nodeSkill
- setup-stripeSkill
- setup-vpsSkill
- show-meSkill
- skill-managerSkill
- stripe-checkoutSkill
- use-styleSkill
- verifySkill
- wait-whatSkill
The file
We split this skill into the rules it gives an agent
7 rules. About 0 are common, 3 are distinctive, and 4 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 24
Run and repair: the user's agent (Hermes) with a Dokploy API token.
- Very specific: line 29
Check access and fix what fails with setup-github or setup-cloudflare.
- Very specific: line 41
Write one helper every public Convex function calls first (a shared secret set with npx convex env set, or Better Auth with email OTP if …
- Distinctive: line 45
Create the Dokploy application from the GitHub repo (Dockerfile build) with the env vars (Convex URL, secrets) set in Dokploy, never in the …
- Very specific: line 48
Create the Cloudflare WAF custom rule that blocks the app and Convex hostnames for any IP outside the list (user IPs + the VPS IP).
- Distinctive: line 49
Add the Convex volume to the nightly Dokploy backup to R2 if the VPS has one.
- Very specific: line 53
Never print, commit or log the password, the admin key or tokens.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Build a private tool on the user's own VPS and hand it to their agent to run. Do every step yourself with the CLIs and only ask for what needs a human (a browser login, their IP). Talk to the user in their language, short messages, no jargon. For an app other people sign up to or pay for, switch to create-software.
If you got this skill from a link instead of a local folder, install nothing else from the repo: download a file it links only when a step needs it, with curl -fsSL https://raw.githubusercontent.com/Melvynx/ai-maxxing-skills/main/skills/create-internal-app/<path> -o <scratch>/<file> (for example references/fast-app.md), and read another skill it names only when you reach it, from https://raw.githubusercontent.com/Melvynx/ai-maxxing-skills/main/skills/<skill-name>/SKILL.md.
The app has a normal URL (crm.my-domain.com) that nobody else can open, behind three walls: a Cloudflare WAF custom rule on the app and Convex hostnames that lets through only the user's IPs and the VPS IP, Dokploy basic auth with a long random password the user keeps in their password manager, and a server-side secret or signed-in user check in every Convex function. When the user's IP changes (travel, 4G), they ask their agent "add my IP" and it updates the rule. For a team, Cloudflare Access with email codes can replace the IP list.
Keep this stack:
- App: TanStack Start (React, TypeScript, Vite) with a Node server build.
- UI: shadcn/ui on Base UI + Tailwind CSS v4,
lucide-react,sonner. - Database, backend, crons: Convex, self-hosted on the VPS with the Dokploy Convex template.
- Client jobs: the TanStack libraries listed in
create-software(Query +@convex-dev/react-query, Table, Virtual, Form, Markdown, Hotkeys, Pacer, AI). - Emails, only if the tool sends some: Lumail through
@lumail/convex. - Hosting: Dokploy on the VPS, built from the GitHub repo.
- Domain, DNS, lock: Cloudflare with the
cfCLI, DNS proxied, WAF IP rule. - Run and repair: the user's agent (Hermes) with a Dokploy API token.
- Control by AI: an admin area at
/admin, an API at/api/v1with API keys, and a CLI named after the tool with its<app>-cliskill.
Every tool is built so the user's AI can run it, not only the user's mouse. Always build, and always explain to the user in one plain sentence, the admin part: an /admin area, a clean API reached with API keys, and a CLI plus skill so their agent (Hermes on Telegram, Claude Code on the Mac) controls the whole tool, like Lumail (admin pages, /api/admin/*, admin keys, the lumail CLI). Anything the user can do in /admin, the API and the CLI can do too. This is never optional and never cut from v1. Details in references/admin-api-cli.md.
Check access and fix what fails with
setup-githuborsetup-cloudflare. Dokploy must already be installed on the VPS; if it is not, stop and say so, that is the server setup lesson.git --version && gh auth status # GitHub cf --version && cf auth whoami # Cloudflare ssh <vps> 'docker ps --format "{{.Names}}" | head' # the VPS answers dokploy-cli auth test # or: the Dokploy API token works (curl the API with it)- Run the
grill-meskill and build only once the brief is confirmed. For an internal tool, the money question becomes "who besides you uses it", and the address question becomes the subdomain plus the IPs to allow (get the current one withcurl -s https://ifconfig.meon the user's machine). Tell the user the tool comes with an admin area, an API and a CLI so their AI can manage it, and ask what they will want to ask their agent (for example "add this lead", "what's due this week?"). - Scaffold TanStack Start + Tailwind +
npx shadcn@latest init(Base UI flavor), a Node server build (TanStack Start hosting docs, Nitro preset for Node) and aDockerfilethat builds and runs it on port 3000.git init, thengh repo create <name> --private --source . --push. - Deploy the Dokploy Convex template once per VPS (backend + dashboard) on
convex-api.<domain>andconvex-site.<domain>, generate the admin key in the backend container, and point the CLI at it withCONVEX_SELF_HOSTED_URLandCONVEX_SELF_HOSTED_ADMIN_KEYin.env.local. Index every query and bound growing tables with.take(n)or.paginate(). See theconvexskill. - Write one helper every public Convex function calls first (a shared secret set with
npx convex env set, or Better Auth with email OTP if several people use it). Anything only the server calls isinternal*. - Build the screens with
useSuspenseQuery(convexQuery(...))so data updates live, lists in TanStack Table, forms in TanStack Form, andcmd+kplusj/kwith TanStack Hotkeys, since an internal tool is used all day. - Build the admin area, API keys, API and CLI with references/admin-api-cli.md: each action is one internal Convex function called by the admin page and by the API, keys stored hashed and shown once, the API on
convex-site.<domain>/api/v1(not behind basic auth),cli/<app>.mjs. Every new feature later gets its admin view, route and CLI command in the same change. - Make it fast on every page with references/fast-app.md:
defaultPreload: "intent", a 30 s query cache, a loader on detail pages, a custompendingComponentskeleton on every route that matches the real layout, a loading state on every async button, indexed and bounded Convex reads. An app without these is not done. - Create the Dokploy application from the GitHub repo (Dockerfile build) with the env vars (Convex URL, secrets) set in Dokploy, never in the repo, and auto deploy on push.
- Attach
tool.<domain>in Dokploy with HTTPS, then create the DNS record in Cloudflare yourself (A record to the VPS IP, proxied). Never open a port on the VPS for the app: everything goes through Dokploy's proxy behind Cloudflare. - Enable basic auth on the Dokploy application with a generated password. Give it to the user once and tell them to save it in their password manager; never write it in a file.
- Create the Cloudflare WAF custom rule that blocks the app and Convex hostnames for any IP outside the list (user IPs + the VPS IP). Find the command with
cf cli search "waf custom rule". - Add the Convex volume to the nightly Dokploy backup to R2 if the VPS has one.
- Hand it to the agent: write an
About.mdin the agent's project folder with the URL, the repo, the Dokploy application id, the Convex URLs, where the password lives (never the password) and the IP rule id. Tell the agent how to redeploy (push, or the Dokploy API) and read deploy logs, read app logs and fix when the user says "it's broken", and add or remove an IP in the rule. Install the CLI on the VPS and the Mac with an admin key, set<APP>_API_KEY/<APP>_URLin Hermes' env, and add the<app>-cliskill on both, so Hermes runs the tool itself. - Prove it: from an allowed IP the URL asks for the password, then the app loads and the main action works with real data; from a non-allowed IP (another server, or a different network) Cloudflare blocks both the app and the Convex API hostname; a push to GitHub redeploys on its own;
<app> whoamiand alist --jsonwork from the VPS and the Mac, a write through the CLI shows in the admin Activity, and a revoked key is refused. Fix every error you see, then runaudit-safetyon the Convex functions, API keys, admin routes and the lock.
Never print, commit or log the password, the admin key or tokens. Reply with the URL, how to open it (password + allowed IPs), the CLI command and the /<app>-cli skill, and one sentence to send Hermes to try it.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

