[{"data":1,"prerenderedAt":658},["ShallowReactive",2],{"docs-pages-en":3,"doc-en-automator":154},[4,11,16,21,26,31,37,48,56,65,73,80,88,92,101,105,113,118,123,128,134,139,144,149],{"path":5,"title":6,"description":7,"order":8,"group":9,"parent":10,"package":10,"note":10,"collects":10,"status":10},"\u002Fdocs\u002Finstallation","Installation","Install CloseYourIt on your own server with one command.",1,"start",null,{"path":12,"title":13,"description":14,"order":15,"group":9,"parent":10,"package":10,"note":10,"collects":10,"status":10},"\u002Fdocs\u002Fsettings","Settings","Every setting in the .env file, what it does and which ones you must never change.",2,{"path":17,"title":18,"description":19,"order":20,"group":9,"parent":10,"package":10,"note":10,"collects":10,"status":10},"\u002Fdocs\u002Fdatabase","Database","What the database is, what is inside, how long data stays and how much room it takes.",3,{"path":22,"title":23,"description":24,"order":25,"group":9,"parent":10,"package":10,"note":10,"collects":10,"status":10},"\u002Fdocs\u002Fupdates-and-backups","Updates and backups","Update to a new version, back up and restore the database, check the install.",4,{"path":27,"title":28,"description":29,"order":30,"group":9,"parent":10,"package":10,"note":10,"collects":10,"status":10},"\u002Fdocs\u002Ftroubleshooting","Troubleshooting","What to check when the install, the certificate, email or incoming data do not work.",5,{"path":32,"title":33,"description":34,"order":35,"group":36,"parent":10,"package":10,"note":10,"collects":10,"status":10},"\u002Fdocs\u002Fconnect-your-apps","Connect your apps","Every tool that sends data to CloseYourIt, and what each one collects.",6,"connect",{"path":38,"title":39,"description":40,"order":41,"group":10,"parent":42,"package":43,"note":44,"collects":45,"status":10},"\u002Fdocs\u002Fsdk-ruby","Ruby \u002F Rails","The closeyourit-ruby gem sends errors, logs, slow queries and job metrics from a Rails app.",7,"connect-your-apps","closeyourit-ruby","Errors, logs, slow queries and methods, background jobs.",{"errors":46,"logs":46,"performance":46,"visits":47,"servers":47},"full","none",{"path":49,"title":50,"description":51,"order":52,"group":10,"parent":42,"package":53,"note":54,"collects":55,"status":10},"\u002Fdocs\u002Fsdk-javascript","JavaScript","The @bussolabs\u002Fcloseyourit-js package works in the browser and on Node 20.16 or newer.",8,"@bussolabs\u002Fcloseyourit-js","Browser and Node, framework adapters and database queries from 0.13.0.",{"errors":46,"logs":46,"performance":46,"visits":46,"servers":47},{"path":57,"title":58,"description":59,"order":60,"group":10,"parent":42,"package":61,"note":62,"collects":63,"status":10},"\u002Fdocs\u002Fsdk-dart","Dart \u002F Flutter","The closeyourit package captures the errors of Flutter apps, even when the phone is offline.",9,"closeyourit","Public errors, logs and metrics from 0.9.3.",{"errors":46,"logs":64,"performance":64,"visits":47,"servers":47},"partial",{"path":66,"title":67,"description":68,"order":69,"group":10,"parent":42,"package":61,"note":70,"collects":71,"status":72},"\u002Fdocs\u002Fsdk-python","Python","The closeyourit package sends errors, logs and metrics from server-side Python applications.",10,"Server side. SQLAlchemy; Django query monitoring and FastAPI\u002FStarlette from 0.4.0.",{"errors":46,"logs":46,"performance":64,"visits":47,"servers":47},"pre_alpha",{"path":74,"title":75,"description":76,"order":77,"group":10,"parent":42,"package":75,"note":78,"collects":79,"status":10},"\u002Fdocs\u002Fsdk-sentry","Sentry SDK","Send errors with a compatible Sentry SDK; sessions and crashes have separate profiles.",11,"Compatible errors; sessions and crashes require a verified profile.",{"errors":46,"logs":47,"performance":47,"visits":47,"servers":47},{"path":81,"title":82,"description":83,"order":84,"group":10,"parent":42,"package":85,"note":86,"collects":87,"status":10},"\u002Fdocs\u002Fagent-server","Server agent","A small program on the server that sends the state of the machine every 60 seconds.",12,"closeyourit-agent","CPU, memory, disks, network, containers and services.",{"errors":47,"logs":64,"performance":47,"visits":47,"servers":46},{"path":89,"title":90,"description":91,"order":84,"group":36,"parent":10,"package":10,"note":10,"collects":10,"status":10},"\u002Fdocs\u002Fnuxt","Vue and Nuxt","Connect Nuxt browser errors and Nitro server errors without exposing a server token.",{"path":93,"title":94,"description":95,"order":96,"group":10,"parent":42,"package":97,"note":98,"collects":99,"status":100},"\u002Fdocs\u002Fagent-kubernetes","Kubernetes","A read-only observer of the cluster: one copy per cluster.",13,"closeyourit-kube","Machines, apps and error events of the cluster.",{"errors":47,"logs":47,"performance":47,"visits":47,"servers":46},"coming",{"path":102,"title":103,"description":104,"order":96,"group":36,"parent":10,"package":10,"note":10,"collects":10,"status":10},"\u002Fdocs\u002Fopentelemetry","OpenTelemetry","Send server traces, metrics and logs through the optional OTLP receiver.",{"path":106,"title":107,"description":108,"order":109,"group":10,"parent":42,"package":110,"note":111,"collects":112,"status":10},"\u002Fdocs\u002Fcli","cyi CLI","The closeyourit command, cyi for short: manage projects, errors and tickets from the terminal.",14,"@bussolabs\u002Fcloseyourit-cli","It collects no data: it drives CloseYourIt from the terminal.",{"errors":47,"logs":47,"performance":47,"visits":47,"servers":47},{"path":114,"title":115,"description":116,"order":117,"group":36,"parent":10,"package":10,"note":10,"collects":10,"status":10},"\u002Fdocs\u002Fhttp-api","HTTP API","Send errors, logs, metrics and page views with plain HTTP requests, without an SDK.",15,{"path":119,"title":120,"description":121,"order":122,"group":36,"parent":10,"package":10,"note":10,"collects":10,"status":10},"\u002Fdocs\u002Fgithub-app","GitHub","Connect GitHub repositories to tickets and releases with your own GitHub App.",16,{"path":124,"title":125,"description":126,"order":127,"group":36,"parent":10,"package":10,"note":10,"collects":10,"status":10},"\u002Fdocs\u002Fingest-gateway","Ingest gateway","Keep incoming errors, logs and metrics safe when the app is slow or restarting.",17,{"path":129,"title":130,"description":131,"order":132,"group":133,"parent":10,"package":10,"note":10,"collects":10,"status":10},"\u002Fdocs\u002Fai","AI","Turn on assistant, analysis, dictation and smart search with a CloseYourIt AI key or your own provider.",18,"automation",{"path":135,"title":136,"description":137,"order":138,"group":133,"parent":10,"package":10,"note":10,"collects":10,"status":10},"\u002Fdocs\u002Fautomator","Automator","Let tickets be worked automatically on your own Linux machine, with Claude Code, Codex or both.",19,{"path":140,"title":141,"description":142,"order":143,"group":36,"parent":10,"package":10,"note":10,"collects":10,"status":10},"\u002Fdocs\u002Fstack-coverage","Frameworks and stack coverage","Choose a published SDK or understand the limits of a locally tested integration.",20,{"path":145,"title":146,"description":147,"order":148,"group":36,"parent":10,"package":10,"note":10,"collects":10,"status":10},"\u002Fdocs\u002Fmonitoring","Traces, measurements and sessions","Explore the new signals, compare releases and recover original error locations.",21,{"path":150,"title":151,"description":152,"order":153,"group":36,"parent":10,"package":10,"note":10,"collects":10,"status":10},"\u002Fdocs\u002Fnode-database","Node databases","Monitor slow and repeated queries with pg, mysql2, Drizzle and Prisma PostgreSQL.",22,{"id":155,"title":136,"body":156,"collects":10,"description":137,"extension":653,"group":133,"meta":654,"navigation":311,"note":10,"order":138,"package":10,"parent":10,"path":135,"seo":655,"status":10,"stem":656,"__hash__":657},"docs_en\u002Fdocs\u002Fautomator.md",{"type":157,"value":158,"toc":643},"minimark",[159,171,176,243,249,254,260,352,355,361,385,392,442,446,459,463,477,488,491,502,506,512,526,530,533,577,581,588,636,639],[160,161,162,163,167,168,170],"p",{},"The automator takes the tickets you allow, works them in an isolated folder of the repository, and opens a change for review. It runs on ",[164,165,166],"strong",{},"your"," machine, with ",[164,169,166],{}," subscription: the code never leaves it.",[172,173,175],"h2",{"id":174},"requirements","Requirements",[177,178,179,192,205,212,218,224],"ul",{},[180,181,182,183,187,188,191],"li",{},"Linux ",[184,185,186],"code",{},"x86_64"," or ",[184,189,190],{},"arm64"," with systemd 254 or newer.",[180,193,194,197,198,201,202,204],{},[184,195,196],{},"bubblewrap"," and ",[184,199,200],{},"socat",", used to confine what the agent can write and where it can connect. Without ",[184,203,200],{},", Claude Code does not start.",[180,206,207,208,211],{},"A system keyring (",[184,209,210],{},"gnome-keyring",") with a «login» collection: the automator keeps the machine's token there.",[180,213,214,217],{},[164,215,216],{},"Codex",", installed and signed in: always required, because Claude's review also runs inside the Codex sandbox. Without Codex no work is reviewed and none reaches a PR.",[180,219,220,223],{},[164,221,222],{},"Claude Code",", if you want Claude to work or review.",[180,225,226,227,230,231,234,235,238,239,242],{},"Install Codex with the user's ",[184,228,229],{},"npm"," (for example the one from ",[184,232,233],{},"mise","), not with ",[184,236,237],{},"sudo npm -g",": the automator does not run programs from ",[184,240,241],{},"\u002Fusr\u002Flib",", nor from folders other users can change.",[160,244,245,248],{},[184,246,247],{},"automator doctor"," checks every requirement and says what is missing.",[250,251,253],"h3",{"id":252},"ubuntu-2404-and-newer","Ubuntu 24.04 and newer",[160,255,256,257,259],{},"Ubuntu blocks the isolation ",[184,258,196],{}," needs, so the sandbox does not start. Allow it once with an AppArmor profile:",[261,262,267],"pre",{"className":263,"code":264,"language":265,"meta":266,"style":266},"language-bash shiki shiki-themes github-light github-dark","sudo tee \u002Fetc\u002Fapparmor.d\u002Fbwrap >\u002Fdev\u002Fnull \u003C\u003C'PROFILE'\nabi \u003Cabi\u002F4.0>,\ninclude \u003Ctunables\u002Fglobal>\n\nprofile bwrap \u002Fusr\u002Fbin\u002Fbwrap flags=(unconfined) {\n  userns,\n  include if exists \u003Clocal\u002Fbwrap>\n}\nPROFILE\nsudo apparmor_parser -r \u002Fetc\u002Fapparmor.d\u002Fbwrap\n","bash","",[184,268,269,297,302,307,313,318,323,328,333,338],{"__ignoreMap":266},[270,271,273,277,281,284,288,291,294],"span",{"class":272,"line":8},"line",[270,274,276],{"class":275},"sScJk","sudo",[270,278,280],{"class":279},"sZZnC"," tee",[270,282,283],{"class":279}," \u002Fetc\u002Fapparmor.d\u002Fbwrap",[270,285,287],{"class":286},"szBVR"," >",[270,289,290],{"class":279},"\u002Fdev\u002Fnull",[270,292,293],{"class":286}," \u003C\u003C",[270,295,296],{"class":279},"'PROFILE'\n",[270,298,299],{"class":272,"line":15},[270,300,301],{"class":279},"abi \u003Cabi\u002F4.0>,\n",[270,303,304],{"class":272,"line":20},[270,305,306],{"class":279},"include \u003Ctunables\u002Fglobal>\n",[270,308,309],{"class":272,"line":25},[270,310,312],{"emptyLinePlaceholder":311},true,"\n",[270,314,315],{"class":272,"line":30},[270,316,317],{"class":279},"profile bwrap \u002Fusr\u002Fbin\u002Fbwrap flags=(unconfined) {\n",[270,319,320],{"class":272,"line":35},[270,321,322],{"class":279},"  userns,\n",[270,324,325],{"class":272,"line":41},[270,326,327],{"class":279},"  include if exists \u003Clocal\u002Fbwrap>\n",[270,329,330],{"class":272,"line":52},[270,331,332],{"class":279},"}\n",[270,334,335],{"class":272,"line":60},[270,336,337],{"class":279},"PROFILE\n",[270,339,340,342,345,349],{"class":272,"line":69},[270,341,276],{"class":275},[270,343,344],{"class":279}," apparmor_parser",[270,346,348],{"class":347},"sj4cs"," -r",[270,350,351],{"class":279}," \u002Fetc\u002Fapparmor.d\u002Fbwrap\n",[160,353,354],{},"A server without a desktop needs two more steps.",[160,356,357,358,360],{},"Install ",[184,359,200],{}," and the keyring:",[261,362,364],{"className":263,"code":363,"language":265,"meta":266,"style":266},"sudo apt install socat gnome-keyring libsecret-tools\n",[184,365,366],{"__ignoreMap":266},[270,367,368,370,373,376,379,382],{"class":272,"line":8},[270,369,276],{"class":275},[270,371,372],{"class":279}," apt",[270,374,375],{"class":279}," install",[270,377,378],{"class":279}," socat",[270,380,381],{"class":279}," gnome-keyring",[270,383,384],{"class":279}," libsecret-tools\n",[160,386,387,388,391],{},"Create the keyring's «login» collection, as the user that will run the automator. Without it, installation stops with ",[184,389,390],{},"credential store vault non disponibile",":",[261,393,395],{"className":263,"code":394,"language":265,"meta":266,"style":266},"pkill -u \"$(id -u)\" gnome-keyring-d\nprintf '\\n' | gnome-keyring-daemon --unlock --components=secrets --daemonize\n",[184,396,397,419],{"__ignoreMap":266},[270,398,399,402,405,408,411,413,416],{"class":272,"line":8},[270,400,401],{"class":275},"pkill",[270,403,404],{"class":347}," -u",[270,406,407],{"class":279}," \"$(",[270,409,410],{"class":275},"id",[270,412,404],{"class":347},[270,414,415],{"class":279},")\"",[270,417,418],{"class":279}," gnome-keyring-d\n",[270,420,421,424,427,430,433,436,439],{"class":272,"line":15},[270,422,423],{"class":347},"printf",[270,425,426],{"class":279}," '\\n'",[270,428,429],{"class":286}," |",[270,431,432],{"class":275}," gnome-keyring-daemon",[270,434,435],{"class":347}," --unlock",[270,437,438],{"class":347}," --components=secrets",[270,440,441],{"class":347}," --daemonize\n",[172,443,445],{"id":444},"connect-a-machine","Connect a machine",[447,448,449,456],"ol",{},[180,450,451,452,455],{},"In the app: ",[164,453,454],{},"Automator → Connect a machine",".",[180,457,458],{},"Copy the command and run it on the machine.",[172,460,462],{"id":461},"who-does-the-work","Who does the work",[160,464,465,466,469,470,473,474,476],{},"Choose it per machine in ",[164,467,468],{},"Automator → the machine → Who does the work",": ",[164,471,472],{},"Claude"," (the default) or ",[164,475,216],{},". The machine must have that engine installed and signed in.",[160,478,479,480,483,484,487],{},"On a machine with Codex only, also set ",[184,481,482],{},"AUTOMATOR_WORK_ENGINE=codex"," in the service environment: setup and ",[184,485,486],{},"doctor"," then ask for Codex instead of Claude.",[160,489,490],{},"Both engines work under the same limits:",[177,492,493,496,499],{},[180,494,495],{},"writes only in the ticket's folder, and in the Git data that its commits need;",[180,497,498],{},"network only to CloseYourIt, GitHub, npm and RubyGems;",[180,500,501],{},"no push to protected branches, no production commands, no destructive database commands.",[172,503,505],{"id":504},"who-reviews-the-work","Who reviews the work",[160,507,508,509,391],{},"Every piece of work is read again before it reaches you. Choose it per machine in ",[164,510,511],{},"Automator → the machine → Who reviews the work",[177,513,514,520],{},[180,515,516,519],{},[164,517,518],{},"The other engine"," — Codex reviews Claude's work and Claude reviews Codex's. Both must be on the machine. This is the default.",[180,521,522,525],{},[164,523,524],{},"The same engine"," — the engine reviews its own work in a new session. One engine is enough.",[172,527,529],{"id":528},"models","Models",[160,531,532],{},"The automator uses a fixed model for each engine, so an update of the CLI never changes it by surprise. To use another one, set it in the service environment:",[534,535,536,549],"table",{},[537,538,539],"thead",{},[540,541,542,546],"tr",{},[543,544,545],"th",{},"Variable",[543,547,548],{},"Default",[550,551,552,565],"tbody",{},[540,553,554,560],{},[555,556,557],"td",{},[184,558,559],{},"AUTOMATOR_CLAUDE_MODEL",[555,561,562],{},[184,563,564],{},"claude-opus-5-5",[540,566,567,572],{},[555,568,569],{},[184,570,571],{},"AUTOMATOR_CODEX_MODEL",[555,573,574],{},[184,575,576],{},"gpt-6-astra",[172,578,580],{"id":579},"your-server-and-your-production","Your server and your production",[160,582,583,584,587],{},"Two settings of the service environment tell the automator about your installation. Set them before ",[184,585,586],{},"automator setup",", and keep them the same for the service and for the commands you run by hand: they are part of the guardrails, which refuse to start if they change behind their back.",[534,589,590,599],{},[537,591,592],{},[540,593,594,596],{},[543,595,545],{},[543,597,598],{},"What it does",[550,600,601,615],{},[540,602,603,608],{},[555,604,605],{},[184,606,607],{},"AUTOMATOR_SANDBOX_DOMAINS",[555,609,610,611,614],{},"Extra domains the sandbox may reach, comma-separated. Put your CloseYourIt here, for example ",[184,612,613],{},"tracker.example.com","; GitHub, npm and RubyGems are already allowed.",[540,616,617,622],{},[555,618,619],{},[184,620,621],{},"AUTOMATOR_PRODUCTION_HOSTS",[555,623,624,625,628,629,628,632,635],{},"Your production hosts and addresses, comma-separated. The automator refuses ",[184,626,627],{},"ssh",", ",[184,630,631],{},"scp",[184,633,634],{},"rsync"," and database URLs towards them.",[160,637,638],{},"A malformed entry stops the automator instead of being skipped, so a typo never leaves a host unprotected.",[640,641,642],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":266,"searchDepth":15,"depth":15,"links":644},[645,648,649,650,651,652],{"id":174,"depth":15,"text":175,"children":646},[647],{"id":252,"depth":20,"text":253},{"id":444,"depth":15,"text":445},{"id":461,"depth":15,"text":462},{"id":504,"depth":15,"text":505},{"id":528,"depth":15,"text":529},{"id":579,"depth":15,"text":580},"md",{},{"title":136,"description":137},"docs\u002Fautomator","-GsYMXrrTwl_kYzstSsztwgvO3Pv0MYBduuF6CqX7Ag",1791302513339]