git clone https://peat.eth.demokluster.com/peat0.git
# yes we're doing git (readonly) over ipfs :)

้ๆณ่ช็ถ โ vibes/patterns/philosophies
โโ ๅพท entrypoint-oriented development
โโ ้ฐ้ฝ sliceable monorepo > repo-per-microservice
โโ ็ก็บ all changes thru reusable idempotent scripts
โโ ๆ strangler vine development
โโ ่ช็ถ tighten the loop (aka fuck Jenkins)
โโ ๆฐด ๐ง opensource/generic > lock-in (k8s > vercel, kimi&glm > claude&"open"ai)
โโ ๆจธ ๐ฑ
โโ ็กๅ 535๐๐ฏ๏ธ
Hello internet neighbor!
My name is pete, this is my digital garden, I'd like to share it with you
it's a forkable/POC rails-inspired js monorepo (with ts dustings) I initially built for deploying/self-hosting my (next)js apps & related infra/services to k8s
- specifically to
docker/kaniko build&kubectl applya js entrypoint of itself & its importtree incl nec Deployment Secrets Svc Ingress ConfigMap postgres(cnpg or vanilla postgres dockerimage) etc - only re-runs
docker buildwhen entrypoint importtree changes (docker image name is deterministic from the git sha filtered to files in ep's importtree + hash(generateddockerfileContent)) - uses AST analysis to impl many useful things like
<ep> diff<ep> howimports <path>ptm mv <pt0/serverF/whateverF.mjs> <pt0/sharedF/whatevsF.mjs>mv's & updates all refs across monorepoptm bisect "pt0/deployF/testsF/epPtTestsF.mts runtests" --good=4999803345bisects in a worktree
- many eps impl
<ep> runtestswhich saves result to--historyfor^ & knowing "when what worked where"- also
<ep> apply --historyfor when you deployed whatever
- also
- specifically to
is spiritually similar to RoR tho:
- no docs, messier & more idiosyncratic w rougher edges but more predictible, prunable, composable, & extractable
- "just a bunch of glue" but less fe/app-level glue, more js-k8s-git-staticanalysis-opencode glue
- is a POC to be forked, not imported/installed
- instead of one app-per-repo its one app-per-entrypoint
- instead of
prod|smoke|staging|devyou get unlimited envs just fork an ep - conveniences like
- auto
kubectl port-forwardfor devpc -> k8s(incl minikube) fordevserverdbconsoleetc - sentry-like js exception emails (smtp) & checking w
<ep> exceptions(imap) - ethereal emails so emails just pop up in new tab when
isDevPc
- auto
has grown beyond^ to a "monorepo of apps/infra", represented by entrypoints with actions
- actions started as k8s
applydeleteexpanded to be like rake tasks<ep> devserverruntestsmigratedbbackupetc - hit ignition after adding .opencode integration
- actions started as k8s
has eps for provisioning k8s clusters like Harvester (bare-metal w pxe), Hetzner, DigitalOcean, or Vultr
- provisioning = external-dns, cert-manager, docker-registry, containerNativePostgres (cnpg), gitssh
uses js for k8s-resource defs no YAML fts. simple deterministic&idempotent
<ep>-> json ->kubectl apply/delete( no ci/operators/crds yet )
Q: ๐คฎa js monorepo deploying to k8s? i want my RoR & dokku / handcoded html on github pages!
A: fair enough lol. js is wat (but not as wat as monkey patching or a tangly-ass ball of before_saves) and k8s can seem scary but can actually be simple. it's more generic/self-hostable than vercel/railway/heroku/github (you don't have to pay $ to companies run by people taking selfies w Netanyahu๐น). anyways, it's been useful to me & and i'm just sharing, not selling anything other than "๐ head-in-sand-corpos & mass-murderers"
Q: why k8s over a linux box? A:
- declarative>stateful (json objects>bash commands)
- better primitives IMO (deployment>process, pvc>disk/folder, ingress/external-dns>idk what??)
- node-level fault tolerance like if your mobo/cpu craps out
- you don't need to rewrite your entire infra if you ever wanna scaleup
Q: vibe coded? A:
- hand-coded 2021-2025
- ~20k loc -
eptNextjsApp,eptMjsRunner,eptClusterSync,eptCnPgDb,drawinggame,eptMinecraftSync - a few complex apps (todo os them) builtw^ still-deployable-w-peat, eth validator deployers &
pt_mv/howimportsv0
- ~20k loc -
- hand-prompted 2026+
- ~50k loc - cli plumbing/DRYing, AST tooling fixes, .opencode, TS types, this gallery, demos & tests
- os'ing it before ruined w^ :P (jk agents yall were a legit big help)
- ( started w opus-4.5, now glm & kimi exclusively )
demos / made w peat:
Last fall a friend of mine (an ex of an ex(!๐ป)) vibecoded a pegboard of circles with orbit, hue, & size properties that influence each other based on simple rules (as an experiment on cellular automata & emergence)
I added rulesets abstraction, /compare.html, discovered some cool rulesets w agent assistance, and added musicsets for reactivity to uploadable music & made deployable w peat to http-server/ipfs
"telephone"-like game created in 2021 to play with fam&friends
players alternate describing & drawing using <canvas>. uses http long polling over graphql (y gql overkill sue me)
- 2021 it was in-memory single process saved to db on gameend
- 2022 if pod crashes you lose beautiful art :(, bugs hard to debug from logs
- so backwards-compat added
actionHistA& dbwrite each game action
- so backwards-compat added
- 2025 added OpenRouter LLMs
- to come up w a creative prompt if you can't think of one (it can be hard!)
- ai can take a turn describing a drawing to make your chain longer
- 2026
- ai can take a turn drawing too!
- ^req'd storing pngs (vs just brush strokes) and i didn't want to bloat db w pngs so used ipfs
- added
'nginx.ingress.kubernetes.io/upstream-hash-by': '$cookie_gameshardcook'to scale up (theoretically, tho i did write a replicas=2 runtests)
(so yes, this is totally overengineered yet has more features & less bugs than it did in 2021)
POC using Ethereum/L2s transactions with exact unique amounts to associate w an order/user/whatever.
Cool cause:
- a DIY self-sovereign way to accept payments that costs cents-per-tx
- allows "pay by donation" to a charity whose address end-users can verify
For this demo I made an webapp where anon users can vote-by-donation on strings in postgres. then I got a little carried away and added voting on ipfsmedia in addition to strings
.onion proxy of^
deploys itzg/minecraft-server to k8s. supports mcbackup & mcrestore
home-rolled HA S3 for cnpg WALs etc. sidecars peer over public ingress. deletes propagate via tombstones from changeable delete-authority node. node-down email alerts
self hosted alternative to Home Assistant Cloud - proxies homeassistant.local thru k8s ingress
for deploying & monitoring multiple eth validator pairs across clusters
idempotent tornadoCash deposit->withdraw script
run this periodically on your devpc - verifies cnpg WALs are recent, saves logical pg backups locally, ipfs pin/mfs verification, eth sync/validator monitoring, opencode models cache, kopia backup etc
use pxe to flash Harvester on bare-metal to self-host k8s (node1, mode=create)
boring k8s provisioners (6)
like^ but w mode=join for node2
like^ but for node3
scaffold a new Harvester (bare-metal) k8s cluster - generates epSync.mjs, common.mjs, path_bin/<cluster_name>
setup k3s on Hetzner VPS (gen SSH keys, install k3s, extract kubeconfig, setup path_bin/hetzn1)
then finishing setting up k8s w cert-manager external-dns etc
hetzner setup external-dns, ingress-nginx, cert-manager, etc
scaffold a new Vultr VKE k8s cluster - generates epSync.mjs, common.mjs, path_bin/<cluster_name>
xmtp(eptViteApp), nostr, peertube, opencodeweb (4)
self-hosted xmtp.chat from a git submodule
self-hosted PeerTube federated video instance at peertube.hetzn1.demokluster.com
- deployed via epSyncPeertube.mjs on hetzn1 (chocobozzz/peertube + redis, 50Gi PVC)
deploys an opencodeweb instance pre-setup w openrouter & all deps/secrets nec to dev & deploy: deployableEps: [ptAnchorPath('pt0/gamesapp/binF/epSyncGameswc.mjs')]
this very http server! (probably)
host your own ens & ipfs gateway a-la *.eth.limo
( vitalik.eth.demokluster.com -> resolves vitalik.ens to ipfs:// -> serves you http )
"welcome to the future!"๐
this very website!
generates this pretty html from eps & bash transcripts etcdevserver, apply (to ipfs)
proxied to u by eptEnsGateway^
.opencode (optional)
13.9k loc importtreefor limiting wasted tokens & blast radius of agent dumbassery:
- agents.md
- sรฉance - agent can chat with a past session to continue its work or debug what went wrong. doubles as a context-saving alternative to compaction
- browser - headless browser (playwright) for screenshots, console errors & network failures, perf traces, heap snapshots & etc
- pt_commit - git commit w file autotracking & per-file locks so concurrent agents know/stop if they step on each other's toes. autosaves
opencodeSessionIdin commit forseance/opencode -setc pt_mv/pt_rntok/pt_rm- mv/rename/delete w cross-repo ref updates & auto-commit; ocHook blocks rawgit rm/mv+sedhowimports&importers- wrapped mcp bash to autosummarize(
interest-directed) > 600tok & memoize <1hr;interest="raw log"/# bump1escape hatches - wc & sc unit responses :)
- how i work with agents
ptm (cli for code movements & info)
13.9k loc importtree$ ptm <action> [args] # movements mv ๐ <from> <to> mv/rn & update imports & importers (auto-commits) commit ๐ --msg= [--files=...] [--amend] pt_commit CLI equivalent (for worktree delegation) extract ๐คฒ <exports...> [dest] extract exports to dest or new file rntok ๐ <from> <to> rn word codebase-wide (auto-commits) subst ๐ซถ <pattern> <name> replace pattern, auto-add import if nec # info/debug resolveimport <fromFile> <toFile> compute correct relative import path (avoids depth/extension errors) importers <file> [<importer>] [--epDir] ls files that directly import tgt howimports <file> [<srcFile|package>] [--epDir] ls eps that transitively import tgt (or chain from srcFile/pkg) lseps [--epDir=<dir>] [--inclTokens] [--inclNpm] eps & stats bisect <ep> --good=<sha> [--autorun] bisect importtree in isolated worktree wt start <name>|--sha=<sha> | done <name> [--discard] isolated worktree (to dev or checkout SHA) check <files|dirs...> check syntax + TS types + boundaries (componentsF can't import serverF etc) epsearch <ep> <pattern> [rg-flags...] search within ep import tree (uses rg) gitlog <file> [git-log-flags...] git log limited to file import tree ocsearch <query> [--since=Nd] search past oc sessions & commits by keyword exceptions [--show=<errHash>] [--test] exceptions across all eps from IMAP$ ptm check pt0/peatsite Import boundary violations: pt0/peatsite/binF/eptEnsGallerySiteAI.mts:150: empty catch block - exceptions must be handled or logged, or add // catch:userapproved pt0/peatsite/binF/eptEnsGallerySiteAI.mts:214: dynamic import() inside functions only allowed in entrypoints or getServerSideProps pt0/peatsite/binF/eptEnsGallerySiteAI.mts:422: enterWith without spread - must include ...ctx.getStore() or add // ctx:clear pt0/peatsite/binF/eptEnsGallerySiteAI.mts:482: empty catch block - exceptions must be handled or logged, or add // catch:userapproved $ ptm epsearch pt0/gamesapp/binF/epSyncGameswc.mjs disableTurnTimers pt0/gamesapp/binF/epSyncGameswc.mjs envConf: {...gamesappHetznerCfg.envConf, skipAliasOwnershipCheck: true, gpMaybePubEnvH: {...gamesappHetznerCfg.envConf?.gpMaybePubEnvH, disableTurnTimers: true}, secretsMapping: {...gamesappHetznerCfg.envConf?.secretsMapping, openrouterApiToken: opnRtrSecretName(name)}}, pt0/gamesapp/componentsF/TelDrawGame/NagAreaF.jsx if (settings?.disableTurnTimers) return null pt0/gamesapp/componentsF/TelDrawGame/useAutoSubmitAI.jsx if (settings?.disableTurnTimers) return pt0/gamesapp/binF/epSyncGameswc.mjs โโ> pt0/gamesapp/binF/common.mjs โโ> pt0/gamesapp/testsF/runTestsActionAI.mts โโ> pt0/gamesapp/testsF/gamesTestRunnerFactoryAI.mts โโ> pt0/gamesapp/testsF/dbReplayAI.mts โโ> pt0/gamesapp/testsF/testHarnessAI.mts โโ> pt0/gamesapp/serverF/getSetGameStateF.mts โโ> pt0/gamesapp/serverF/gameState/doGetOldGame.mts โโ> pt0/gamesapp/serverF/fetchRoomJdataAI.mts disableTurnTimers: pubEnv.disableTurnTimers ?? false, pt0/gamesapp/serverF/telgame/timeoutCheckerAI.mjs if (existingGame.settings?.disableTurnTimers) return $ ptm extract eaddrinuseTip handleServerEaddrinuse exitIfStderrEaddrinuse pt0/serverF/eaddrinuseHandlersAI.mts Extracted eaddrinuseTip, handleServerEaddrinuse, exitIfStderrEaddrinuse to pt0/serverF/eaddrinuseHandlersAI.mts (updated 4 file(s)) $ ptm help $ ptm <action> [args] # movements mv ๐ <from> <to> mv/rn & update imports & importers (auto-commits) commit ๐ --msg= [--files=...] [--amend] pt_commit CLI equivalent (for worktree delegation) extract ๐คฒ <exports...> [dest] extract exports to dest or new file rntok ๐ <from> <to> rn word codebase-wide (auto-commits) subst ๐ซถ <pattern> <name> replace pattern, auto-add import if nec # info/debug resolveimport <fromFile> <toFile> compute correct relative import path (avoids depth/extension errors) importers <file> [<importer>] [--epDir] ls files that directly import tgt howimports <file> [<srcFile|package>] [--epDir] ls eps that transitively import tgt (or chain from srcFile/pkg) lseps [--epDir=<dir>] [--inclTokens] [--inclNpm] eps & stats bisect <ep> --good=<sha> [--autorun] bisect importtree in isolated worktree wt start <name>|--sha=<sha> | done <name> [--discard] isolated worktree (dev or checkout SHA) check <files|dirs...> check syntax + TS types + boundaries (componentsF can't import serverF etc) epsearch <ep> <pattern> [rg-flags...] search within ep import tree (uses rg) gitlog <file> [git-log-flags...] git log limited to file import tree ocsearch <query> [--since=Nd] search past oc sessions & commits by keyword exceptions [--show=<errHash>] [--test] exceptions across all eps from IMAP $ ptm howimports pt0/deployF/ethF/jwtPathF.mts --epDir=pt0 pt0/klustersF/harv2demo/epEthF.mjs โโ> pt0/deployF/ethF/doSyncGethF.mts โโ> pt0/deployF/ethF/jwtPathF.mts pt0/klustersF/hetzn1/epEthF.mjs โโ> pt0/deployF/ethF/doSyncNetherF.mts โโ> pt0/deployF/ethF/jwtPathF.mts pt0/klustersF/vultr2/epSyncEthF.mjs โโ> pt0/deployF/ethF/doSyncTekuF.mts โโ> pt0/deployF/ethF/jwtPathF.mts pt0/klustersF/minik/sync_eth.mjs โโ> pt0/deployF/ethF/doSyncNimbusAI.mts โโ> pt0/deployF/ethF/jwtPathF.mts pt0/deployF/ethF/binF/ethstatus.mjs โโ> pt0/klustersF/harv2demo/epEthF.mjs โโ> pt0/deployF/ethF/doSyncGethF.mts โโ> pt0/deployF/ethF/jwtPathF.mts pt0/peatsite/binF/sync.mjs โโ> pt0/deployF/ethF/binF/ethstatus.mjs โโ> pt0/klustersF/harv2demo/epEthF.mjs โโ> pt0/deployF/ethF/doSyncGethF.mts โโ> pt0/deployF/ethF/jwtPathF.mts $ ptm importers pt0/serverF/cfIpF.mts --epDir=pt0 pt0/serverF/isOnSameLanF.mts pt0/klustersF/harv2demo/epEthF.mjs pt0/deployF/harvF/getHarvKlustExtIpF.mts $ ptm lseps --epDir=pt0 pt0/deployF/claimLockF/epClaimLockTestsF.mts 3.9k loc pt0/deployF/ethF/binF/epClaimCheck.mjs 2.4k loc pt0/deployF/ethF/binF/epEthstatus.mjs # eptMonEthPairs 13.3k loc (2.0k epType) pt0/deployF/ethF/binF/epTornado.mjs 1.9k loc pt0/deployF/k8sF/initialSetupF/epScaffoldDoAI.mts 22.9k loc pt0/deployF/k8sF/initialSetupF/epScaffoldHarvesterAI.mts 23.0k loc pt0/deployF/k8sF/initialSetupF/epScaffoldVultrAI.mts 22.9k loc pt0/deployF/k8sF/kanikoF/epCleanKan.mts 1.3k loc pt0/deployF/k8sF/kanikoF/epKubeJobKanikoF.mts # eptKubeCli 1.1k loc (11.4k epType) pt0/deployF/k8sProvF/vultrF/epVkeCreateAI.mts 764 loc pt0/deployF/k8sProvF/vultrF/epVkeRescale.mts 643 loc pt0/deployF/servicesF/gitsshF/epGitSshAI.mts # eptSimpleDfDeploy 490 loc (16.5k epType) pt0/deployF/testsF/epPtTestsF.mts 18.1k loc pt0/deployF/vultrF/vultrExtIpsSyncF/epMkjob.mts # eptMjsRunner 40 loc (18.9k epType) pt0/devpconlyF/movementsF/epMemoCheckAI.mts 15.6k loc pt0/devpconlyF/movementsF/epPtmTestsAI.mts 6.7k loc pt0/devpconlyF/zhongF/epMacosPrefsAI.mts 333 loc pt0/devpconlyF/zhongF/epZhong.mjs # eptZhong 23.3k loc (702 epType) pt0/donateapp/binF/epDbSync.mjs # eptCnPgDb 832 loc (18.6k epType) pt0/donateapp/binF/epDbSyncSmoke.mjs # eptCnPgDb 832 loc (18.6k epType) pt0/donateapp/binF/epSmoke.mjs # eptNextjsApp 7.4k loc (21.6k epType) pt0/donateapp/binF/epSync.mjs # eptNextjsApp 7.4k loc (21.6k epType) pt0/donateapp/binF/epSyncTorOnion.mjs # eptTorOnion 115 loc (11.8k epType) pt0/gamesapp/binF/epDbSync.mjs # eptCnPgDb 199 loc (18.6k epType) pt0/gamesapp/binF/epDebugAiReplayF.mjs # eptDebugScript 5.9k loc (4 epType) pt0/gamesapp/binF/epExportDraw.mjs 22.1k loc pt0/gamesapp/binF/epOneoffDebug.mjs 19.4k loc pt0/gamesapp/binF/epSyncDrawinggameorg.mjs # eptNextjsApp 11.4k loc (21.6k epType) pt0/gamesapp/binF/epSyncGameswc.mjs # eptNextjsApp 11.4k loc (21.6k epType) pt0/haS3/bin/hetzn1/epSync.mjs # eptSimpleDfDeploy 257 loc (16.5k epType) pt0/haS3/bin/mesh/epSync.mjs # eptSimpleDfDeploy 606 loc (16.5k epType) pt0/haS3/bktF/epMeshLiveTestsF.mts # eptKubeCli 699 loc (11.4k epType) pt0/haS3/bktF/epMeshSyncTestsF.mts 5.4k loc pt0/haS3/testsF/epS3SigTestsF.mts 3.1k loc pt0/klustersF/harv2demo/epCli.mjs # eptKubeCli 677 loc (11.4k epType) pt0/klustersF/harv2demo/epEthF.mjs 14.1k loc pt0/klustersF/harv2demo/epSync.mjs # eptClusterSync 5.5k loc (18.0k epType) pt0/klustersF/harv2demo/epSyncHomeass.mjs 19.0k loc pt0/klustersF/harv2demo/epSyncIpfs.mjs # eptKuboIpfs 683 loc (12.3k epType) pt0/klustersF/harv3demo/epEthF.mjs 13.5k loc pt0/klustersF/harv3demo/epSyncIpfs.mjs # eptKuboIpfs 121 loc (12.3k epType) pt0/klustersF/harv3demo/epSyncMc.mjs # eptMinecraftSync 136 loc (11.9k epType) pt0/klustersF/do2demo/epCli.mjs # eptKubeCli 105 loc (11.4k epType) pt0/klustersF/do2demo/epSync.mjs # eptClusterSync 1.0k loc (18.0k epType) pt0/klustersF/do2demo/epSyncDemoVanillaDb.mjs # eptVanillaPg 135 loc (13.9k epType) pt0/klustersF/do2demo/epSyncNixbuilder.mjs 16.8k loc # eptRadicle 95 loc (17.0k epType) pt0/klustersF/hetzn1/epCli.mjs # eptKubeCli 112 loc (11.4k epType) pt0/klustersF/hetzn1/epCompareEnsHosts.mjs 113 loc pt0/klustersF/hetzn1/epEthF.mjs 13.5k loc pt0/klustersF/hetzn1/epSetupHetznerAI.mjs 11.7k loc pt0/klustersF/hetzn1/epSync.mjs # eptClusterSync 3.8k loc (18.0k epType) pt0/klustersF/hetzn1/epSyncEnsgateway.mjs # eptEnsGateway 113 loc (16.7k epType) pt0/klustersF/hetzn1/epSyncEnsgatewayDrawinggame.mjs # eptEnsGateway 108 loc (16.7k epType) pt0/klustersF/hetzn1/epSyncIpfs.mjs # eptKuboIpfs 122 loc (12.3k epType) pt0/klustersF/hetzn1/epSyncNostr.mjs # eptNostr 374 loc (12.1k epType) pt0/klustersF/hetzn1/epSyncOcwThrowaway.mjs # eptThrowawayOss 10.6k loc (19.0k epType) pt0/klustersF/hetzn1/epSyncPeertube.mjs # eptPeertube 375 loc (12.1k epType) pt0/klustersF/hetzn1/epSyncPeertubeDb.mjs # eptCnPgDb 135 loc (18.6k epType) pt0/klustersF/minik/epCli.mjs # eptKubeCli 16 loc (11.4k epType) pt0/klustersF/minik/epSync.mjs 11.5k loc pt0/klustersF/minik/epSyncEth.mjs 13.4k loc pt0/klustersF/vultr3/epCli.mjs # eptKubeCli 156 loc (11.4k epType) pt0/klustersF/vultr3/epSync.mjs # eptClusterSync 3.7k loc (18.0k epType) pt0/opencodeF/epOcCfg.mjs 3.0k loc pt0/opencodeF/epParseOcErrorsF.mjs 69 loc pt0/opencodeF/k8sF/epSyncAI.mjs 17.3k loc pt0/peatsite/binF/epGenCheetaSpriteAI.mjs 152 loc pt0/peatsite/binF/epSync.mjs # eptEnsGallerySite 32.7k loc (15.7k epType) pt0/peatsite/octranscripts/epOcToHtmlAI.mjs 949 loc pt0/serverF/opencodeMcpF/epRefactorExecAI.mts 8.6k loc pt0/threerulecycleapp/binF/epPrecomputeDurations.mjs 689 loc pt0/threerulecycleapp/binF/epPrecomputeFastForward.mjs 701 loc pt0/threerulecycleapp/binF/epPrecomputeMood.mjs 157 loc pt0/threerulecycleapp/binF/epPrecomputeMusicBeats.mjs 275 loc pt0/threerulecycleapp/binF/epScore.mjs 1.2k loc pt0/threerulecycleapp/binF/epSync.mjs # eptEnsStaticSite 3.3k loc (17.5k epType) pt0/xmtpchat/binF/epSyncXmtpchat.mjs # eptViteApp 262 loc (17.6k epType) pt0/devpconlyF/movementsF/ptmMainAI.mts 13.8k loc pt0/deployF/cliF/ptnodeF.mts 619 loc --inclNpm $ ptm mv pt0/deployF/dockerF/dockFileF/dockFileF.mts pt0/deployF/dockerF/dockFileF.mts mv'd pt0/deployF/dockerF/dockFileF/dockFileF.mts to pt0/deployF/dockerF/dockFileF.mts (updated refs in 7 files) $ ptm rntok cfCdnTraceIp4 cfCdnTraceUrl Renamed 'cfCdnTraceIp4' -> 'cfCdnTraceUrl' in 2 file(s) $ ptm subst new Promise\(resolve => setTimeout\(resolve, 2000\)\) sleep(2000) Substituted 'new Promise\(resolve => setTimeout\(resolve, 2000\)\)' -> 'sleep(2000)' in 1 file(s)
getting started
74.8k loc grand total
git clone https://peat.eth.demokluster.com/peat0.git && cd peat0git rev-parse HEAD | head -c 16 # should eq 00074b9842603bcfcorepack enable && corepack pnpm install# then to setup a k8s cluster & deploy gamesapp:mkdir -p data/secrets2echo '{ "CF_API_EMAIL": "your-cf-email@website.com", "CF_API_KEY": "your-cf-api-key"}' > data/secrets2/external-dns-cf-demokluster.jsoncp ~/Downloads/do2demo-kubeconfig.yaml data/secrets2/do2demo.yaml # get this from digitalocean or your k8s provider# add to data/secrets2 : ipfs-filebase demok_fm_smtp.json demok_fm_imap.json openrouter-gamesdev# prompt opencode w:# "pls setup the cluster then deploy drawinggame.do2demo.yourwebsite.com incl db/prereqs . see your cluster-app-deploy skill. you will need to add a new domain for yourwebsite.com which is part of external-dns-cf-demokluster.json cf account"# (cf is the only external-dns provider rn unfort but that shouldn't be too hard for you to customize)& non-rigid & consistent & ssot!
first one to fork it to sourceforge wins 5pts :)
# add to your shell rc ( ~/.bashrc or ~/.zshrc etc )export PATH=/path/to/peatSymposium/pt0/path_bin:$PATH # PATH prepend not append to override git to block dumbass agents from reset/stashing'ing or whatever & messing each other up.# also provides user w ptnode, ptm, & clusterClis like do2demo, harv2demo, etcexport DEVPC=1 # enables dev-mode behaviors (ethereal emails, graphql introspection, local disk paths, etc)
Q: ptnode?
A: optional node wrapper to silence hard-to-silence warnings, to impl --saveExample for bashtranscripts for this blog etc. a custom ep for your eps!
Q: do2demo, harv2demo ?
A: optional cluster-specific kubectl alias/wrapper/custom-ep
by pete

- just a lama bean been gardening to fend off specters. "And ye shall be sorrowful, but your sorrow shall be turned into effective devices for computing in any direction." - kingjamesprogramming.tumblr.com / Unsong
with โค๏ธ
- for all the those whose code&art i build with/upon
- & for ๐ป








