[{"data":1,"prerenderedAt":753},["ShallowReactive",2],{"i-lucide:search":3,"i-lucide:sun":8,"i-lucide:menu":10,"marketing-home-en":12,"home-faq-en":201,"home-latest-en":260,"i-lucide:copy":713,"i-lucide:shield-check":715,"i-lucide:terminal":717,"i-lucide:users":719,"i-lucide:plug":721,"i-lucide:globe":723,"i-lucide:lock":725,"i-lucide:database":727,"i-lucide:archive":729,"i-lucide:scroll-text":731,"i-lucide:refresh-cw":733,"i-lucide:layout-dashboard":735,"i-lucide:check":737,"i-lucide:minus":739,"i-lucide:x":741,"i-lucide:file-check":743,"i-lucide:fingerprint":745,"i-lucide:eye-off":747,"i-lucide:building-2":749,"i-lucide:server":751},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m21 21l-4.34-4.34\"/>\u003Ccircle cx=\"11\" cy=\"11\" r=\"8\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"4\"/>\u003Cpath d=\"M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 5h16M4 12h16M4 19h16\"/>",{"doc":13,"isFallback":6},{"id":14,"title":15,"architectureHeading":16,"architectureIntro":17,"architectureNote":18,"architectureProcesses":19,"audienceGroups":39,"audienceHeading":52,"audienceIntro":53,"body":54,"coverCaption":61,"ctaBody":62,"ctaLabel":63,"ctaPath":64,"ctaTitle":65,"description":66,"extension":67,"eyebrow":68,"faqCtaLabel":69,"faqCtaPath":70,"faqHeading":71,"faqIntro":72,"headline":73,"highlights":74,"installCaption":89,"installCommand":90,"latestHeading":91,"latestIntro":92,"licenceBody":93,"licenceCtaLabel":94,"licenceCtaPath":95,"licenceHeading":96,"licencePoints":97,"meta":108,"navigation":32,"path":109,"pillars":110,"platformsCtaLabel":134,"platformsCtaPath":135,"platformsFamilies":136,"platformsHeading":148,"platformsIntro":149,"platformsNote":150,"primaryCtaLabel":151,"primaryCtaPath":64,"secondaryCtaLabel":152,"secondaryCtaPath":135,"securityCtaLabel":153,"securityCtaPath":154,"securityHeading":155,"securityIntro":156,"securityPoints":157,"seo":172,"seoTitle":15,"statusCtaLabel":173,"statusCtaPath":174,"statusHeading":175,"statusIntro":176,"statusMissing":177,"statusShipped":181,"stem":188,"steps":189,"subhead":199,"__hash__":200},"marketingEn/en/marketing/home.md","Maran — a hosting control panel for Linux servers","Three processes, and root belongs to one of them","The split below is the product's main design decision. Everything else on this page follows from it.","The panel asks the agent for named operations with typed, validated arguments. There is no operation that runs a caller-supplied program, and no shell string anywhere between them — so the set of things the root process can be made to do is finite, written down and reviewable.",[20,26,33],{"name":21,"role":22,"runsAs":23,"holds":24,"icon":25},"maran-api","The panel","an unprivileged system user","every piece of business logic, and the only database connection","lucide:layout-dashboard",{"name":27,"role":28,"runsAs":29,"holds":30,"icon":31,"privileged":32},"maran-agent","The only root process","root","nothing — stateless, no database, no configuration of its own","lucide:shield-check",true,{"name":34,"role":35,"runsAs":36,"holds":37,"icon":38},"PostgreSQL","The panel's data","its own user","accounts, sites, the audit journal — on a unix socket with no TCP port at all","lucide:database",[40,44,48],{"icon":41,"title":42,"body":43},"lucide:building-2","Hosting businesses","A cabinet per customer, plans that cap what an account may use, and a provisioning API a billing system drives to create accounts without a person in the loop.",{"icon":45,"title":46,"body":47},"lucide:users","Agencies and studios","Client sites on one server, each its own Linux user with its own quota and PHP version — and an audit journal that answers who changed what.",{"icon":49,"title":50,"body":51},"lucide:server","One server, one owner","Everything a single machine needs, installed in one command, updated with signed artefacts and rolled back with another.","Who it is built for","Multi-tenancy is in the product from the first release rather than added later, and it shows in who can use it.",{"type":55,"value":56,"toc":57},"minimark",[],{"title":58,"searchDepth":59,"depth":59,"links":60},"",2,[],"The panel, drawn rather than photographed — accounts, sites and the audit journal on one server.","The architecture, the contract between the panel and the agent, and what the installer does to a server — written down rather than summarised.","Open the documentation","/docs","Read how it is built before you trust it with root","Run websites, PHP, SSL, databases, backups and the firewall from a browser, on a server where only one small daemon holds root and it takes no shell commands.","md","Source-available hosting panel","All questions","/faq","Questions people ask first","The short answers. The rest are on the questions page.","A hosting control panel that keeps root to itself",[75,78,82,85],{"icon":31,"title":76,"body":77},"One root process","The panel runs unprivileged. A small Rust daemon holds root, and its contract has no operation that runs a program you hand it.",{"icon":79,"title":80,"body":81},"lucide:terminal","No shell strings","A domain is validated as a domain, not escaped into a command line. There is no newline to end one directive and begin another.",{"icon":45,"title":83,"body":84},"Real Linux users","Every account is a system user with its own home, its own php-fpm pool under its own uid, and its own quota.",{"icon":86,"title":87,"body":88},"lucide:plug","Built for billing","A provisioning API creates, suspends and deletes accounts, so a billing system can run hosting without a person in the loop.","One command on a fresh server. Every check runs before anything changes.","curl -sSL https://get.maran.innovayse.com | bash","What is new","The newest release and the most recent thing written about how this is built.","Maran is published under the Business Source License 1.1 by Innovayse LLC, and converts to Apache 2.0 on 29 August 2030. The date is written into the licence rather than promised.","Read the licence","/legal/licence","Source-available, and yours to run",[98,101,103,106],{"icon":99,"text":100},"lucide:check","Install it and host your own customers on it, in production, at no cost",{"icon":99,"text":102},"Read, modify and contribute — the source is available and contributions keep their copyright",{"icon":104,"text":105},"lucide:x","You may not offer Maran itself as a managed control panel service to third parties",{"icon":104,"text":107},"You may not resell or relicense it as your own commercial product",{},"/en/marketing/home",[111,115,119,122,126,130],{"icon":112,"title":113,"body":114},"lucide:globe","Websites and PHP","Static, PHP and reverse-proxy sites with aliases. The agent validates every rendered vhost with the web server itself and rolls it back if the reload refuses.",{"icon":116,"title":117,"body":118},"lucide:lock","SSL that renews itself","ACME with an HTTP-01 challenge, uploads for custom material, renewal thirty days before expiry, and keys in a root-only store outside every home.",{"icon":38,"title":120,"body":121},"Databases and transfer","A database and a scoped user per account, chrooted SFTP carrying the account's own uid, per-plan limits on both.",{"icon":123,"title":124,"body":125},"lucide:archive","Backups and firewall","Backups of files and databases, restorable one at a time, a managed firewall, and monitoring of the server's own state.",{"icon":127,"title":128,"body":129},"lucide:scroll-text","An audit journal","Append-only, covering every sign-in and every change, with a screen only administrators can open.",{"icon":131,"title":132,"body":133},"lucide:refresh-cw","Signed, reversible updates","Updates are signed, take a database dump before they swap anything, and roll back with one command.","See the requirements","/platforms",[137,140,143,146],{"name":138,"versions":139},"Ubuntu","22.04 · 24.04 LTS",{"name":141,"versions":142},"Debian","12 · 13",{"name":144,"versions":145},"AlmaLinux","9 · 10",{"name":147,"versions":145},"Rocky Linux","Runs where your servers already run","One command on a fresh server of any of these, on x86_64 or aarch64.","A distribution outside this list is refused rather than guessed at — the installer knows each supported family's package layout and service names. Production installs are native; Docker is used in development only.","Read the documentation","See what is supported","Read the security policy","/security","Safe because of how it is built, not because of a promise","Four properties of the code, each of them either true or not, and each checkable by reading it.",[158,160,164,168],{"icon":79,"title":80,"body":159},"A domain is validated as a domain — letters, digits, hyphens, dots — not escaped into a command line. There is no newline in it to end one directive and begin another.",{"icon":161,"title":162,"body":163},"lucide:file-check","The server validates its own configuration","Every write is rendered, renamed into place atomically, then checked by the service itself. If validation or the reload refuses, the file is rolled back.",{"icon":165,"title":166,"body":167},"lucide:fingerprint","The agent checks who is asking","Peer credentials are read from the socket before an operation is considered, so the daemon knows which process is on the other end rather than trusting what it is told.",{"icon":169,"title":170,"body":171},"lucide:eye-off","A missing row answers 404","Asking for another account's resource is answered as not found, never as forbidden — an error that never confirms a row exists.",{"title":15,"description":66},"Read the releases","/releases","Where it is today","In active development toward the first feature release. What follows is what exists, and what does not.",[178,179,180],"No web database manager and no browser file manager yet","Certificates are HTTP-01 only — wildcards arrive with DNS management","Mail, DNS, reseller accounts and multi-server management come after the first release",[182,183,184,185,186,187],"Accounts as real Linux users, with quotas, suspend and delete that reach the host","Websites — static, PHP and reverse-proxy — with validated, rollback-on-failure configuration","Several PHP versions side by side, one pool per account per version","SSL over ACME, renewed thirty days before expiry, keys outside every home directory","Databases and SFTP logins with per-plan limits and one-time passwords","Backups, a managed firewall, monitoring, and an append-only audit journal","en/marketing/home",[190,193,196],{"title":191,"body":192},"Install","Run one command on a fresh server. Preflight checks the distribution, memory, disk and ports, and reports every problem at once rather than one per run.",{"title":194,"body":195},"Open the one-time link","The installer prints a link that creates the first administrator. Nothing else can create it, and it is consumed the moment it is used.",{"title":197,"body":198},"Create an account","An account is provisioned on the host as a real Linux user with its home, its pool and its quota — then hand its cabinet to the customer.","Websites, PHP versions, SSL, databases, file transfer, backups and the firewall — managed from a browser, with a cabinet for every customer and an API your billing system can drive.","PnpMPXI0uU_v4xGs0pn_FrE_BBRmwVt9HQo2B6PGo8E",{"doc":202,"isFallback":6},{"id":203,"title":204,"body":205,"description":222,"extension":67,"meta":223,"navigation":32,"path":224,"questions":225,"seo":256,"seoTitle":257,"stem":258,"__hash__":259},"faqEn/en/faq.md","Frequently asked questions",{"type":55,"value":206,"toc":220},[207],[208,209,210,211,215,216,219],"p",{},"If something here is not answered, the ",[212,213,214],"a",{"href":64},"documentation"," goes further, and the\n",[212,217,218],{"href":174},"releases"," page is the honest record of what is actually published.",{"title":58,"searchDepth":59,"depth":59,"links":221},[],"What Maran is, what it costs, which distributions it runs on, how it installs, and what it deliberately will not do — answered in ten questions.",{},"/en/faq",[226,229,232,235,238,241,244,247,250,253],{"question":227,"answer":228},"What is Maran?","A web hosting control panel for Linux servers. You install it on a server and manage websites, PHP versions, SSL certificates, databases, files, backups and the firewall from a browser, with a separate cabinet for every hosting customer and an API a billing system can drive.",{"question":230,"answer":231},"Is it free?","The panel is source-available under the Business Source License 1.1 and free to self-host, including hosting your own paying customers on it. What the licence forbids is offering Maran itself as a hosted control panel service, or reselling it as your own product. Commercial modules are distributed separately and need a licence key; no prices are published yet.",{"question":233,"answer":234},"Can I use it in my hosting business?","Yes. Running it to host your own customers is explicitly allowed by the licence, and multi-tenancy is in the product from the first release rather than added later.",{"question":236,"answer":237},"Which distributions does it support?","Ubuntu 22.04 and 24.04 LTS, Debian 12 and 13, AlmaLinux 9 and 10, and Rocky Linux 9 and 10, on x86_64 and aarch64. The installer refuses a system outside that list rather than guessing at its package layout.",{"question":239,"answer":240},"How is it installed?","One command, run as root on a fresh server. The installer checks the distribution, memory, disk and ports before it changes anything, and reports every problem at once rather than one per run. When it finishes it prints a one-time link for creating the first administrator.",{"question":242,"answer":243},"Does it run in Docker?","Not in production. A production install is native: the panel, the agent, the database and the hosting stack are ordinary system services. Docker is used in development only.",{"question":245,"answer":246},"What makes it different from other panels?","The privileged half. The panel itself runs unprivileged and holds all the logic; one small Rust daemon is the only root process, and the contract between them has no operation that runs a caller-supplied program and no shell string anywhere. The set of things the root process can be asked to do is finite, written down and reviewable.",{"question":248,"answer":249},"Is it ready for production?","Not yet. The project is in active development toward its first feature release, and the current feature set is unreleased. Watch the releases page rather than assuming a version exists.",{"question":251,"answer":252},"What is not in it yet?","There is no web database manager and no browser file manager, and certificates are HTTP-01 only, so wildcard certificates arrive with DNS management. Mail, DNS, reseller accounts and central management of several servers are planned after the first release.",{"question":254,"answer":255},"Where do I report a security problem?","By email to security@innovayse.com, never in a public issue. Reports are acknowledged within 48 hours, and critical issues carry a target of a fix or a documented mitigation within 14 days.",{"title":204,"description":222},"Questions about Maran, answered","en/faq","GdJl_XVEkGLa9wcctqmqwssBGO9NtNdtQVpha6HiHLk",{"release":261,"post":670},{"id":262,"title":263,"body":264,"channel":661,"date":662,"description":663,"extension":67,"meta":664,"navigation":32,"path":665,"seo":666,"seoTitle":263,"stem":667,"version":668,"__hash__":669},"releasesEn/en/releases/1.0.0-beta.1.md","Maran 1.0.0-beta.1 — the first installable release",{"type":55,"value":265,"toc":653},[266,273,276,281,317,331,334,338,346,426,453,456,500,512,516,580,584,587,591,594,634,637,641,649],[208,267,268,269],{},"The first release that installs on a server and runs a hosting account end to end. It is published\nas a beta, and the word is meant literally: ",[270,271,272],"strong",{},"do not put somebody else's customers on it yet.",[208,274,275],{},"The software installs, runs, and does what its screens say. Three things a paid hosting product has\nto be trusted about have been exercised only in this project's own containers — no certificate has\nbeen issued by a real certificate authority, no disk limit has been enforced by a real filesystem,\nand no restore has been run on real hardware. Those are not known bugs; they are claims nobody has\nyet verified in the place that counts.",[277,278,280],"h2",{"id":279},"installing-it","Installing it",[282,283,287],"pre",{"className":284,"code":285,"language":286,"meta":58,"style":58},"language-bash shiki shiki-themes github-light github-dark","curl -sSL https://get.maran.innovayse.com | sudo bash\n","bash",[288,289,290],"code",{"__ignoreMap":58},[291,292,295,299,303,307,311,314],"span",{"class":293,"line":294},"line",1,[291,296,298],{"class":297},"sScJk","curl",[291,300,302],{"class":301},"sj4cs"," -sSL",[291,304,306],{"class":305},"sZZnC"," https://get.maran.innovayse.com",[291,308,310],{"class":309},"szBVR"," |",[291,312,313],{"class":297}," sudo",[291,315,316],{"class":305}," bash\n",[208,318,319,320,323,324,330],{},"The installer downloads the artifacts named in a manifest signed with the project's release key,\nand refuses anything whose signature or checksum does not match. The manifest and the artifacts it\nnames are published at ",[288,321,322],{},"releases.maran.innovayse.com",", and the source at the tag this was built\nfrom is on ",[212,325,329],{"href":326,"rel":327},"https://github.com/innovayse/maran",[328],"nofollow","GitHub",".",[208,332,333],{},"Check what the installer will do before running it as root, the same way you would with any script\nthat takes your server: fetch it, read it, then run it.",[277,335,337],{"id":336},"the-files-and-checking-them-yourself","The files, and checking them yourself",[208,339,340,341,345],{},"Everything the installer downloads is published at\n",[212,342,322],{"href":343,"rel":344},"https://releases.maran.innovayse.com",[328],", listed in a manifest signed\nwith the project's release key.",[347,348,349,365],"table",{},[350,351,352],"thead",{},[353,354,355,359,362],"tr",{},[356,357,358],"th",{},"File",[356,360,361],{},"Size",[356,363,364],{},"SHA-256",[366,367,368,388,407],"tbody",{},[353,369,370,380,383],{},[371,372,373],"td",{},[212,374,377],{"href":375,"rel":376},"https://releases.maran.innovayse.com/beta/agent-x86_64.tar.gz",[328],[288,378,379],{},"agent-x86_64.tar.gz",[371,381,382],{},"2.9 MB",[371,384,385],{},[288,386,387],{},"f9a57621ef349cb1bfc2df5f7f812685fb3a5a690834b18bd1ae8df2493fbadc",[353,389,390,399,402],{},[371,391,392],{},[212,393,396],{"href":394,"rel":395},"https://releases.maran.innovayse.com/beta/api-x86_64.tar.gz",[328],[288,397,398],{},"api-x86_64.tar.gz",[371,400,401],{},"25.4 MB",[371,403,404],{},[288,405,406],{},"6f367807e265d06bee9db37d692d0748c5fb815967965c0e59675a0b8468c799",[353,408,409,418,421],{},[371,410,411],{},[212,412,415],{"href":413,"rel":414},"https://releases.maran.innovayse.com/beta/frontend-x86_64.tar.gz",[328],[288,416,417],{},"frontend-x86_64.tar.gz",[371,419,420],{},"340 KB",[371,422,423],{},[288,424,425],{},"27879087ddb1a0d1e05e92b9b0b4dec6da21a99263388a74e122681ada828009",[208,427,428,429,436,437,444,445,452],{},"The signed list is ",[212,430,433],{"href":431,"rel":432},"https://releases.maran.innovayse.com/beta/manifest.json",[328],[288,434,435],{},"manifest.json"," with\n",[212,438,441],{"href":439,"rel":440},"https://releases.maran.innovayse.com/beta/manifest.json.sig",[328],[288,442,443],{},"manifest.json.sig"," beside it, and\n",[212,446,449],{"href":447,"rel":448},"https://releases.maran.innovayse.com/beta/integrity-manifest.json",[328],[288,450,451],{},"integrity-manifest.json","\nrecords every file inside those archives rather than only the archives.",[208,454,455],{},"If you would rather not pipe anything into a root shell, the same install without the pipe:",[282,457,459],{"className":284,"code":458,"language":286,"meta":58,"style":58},"curl -O https://releases.maran.innovayse.com/installer/maran-installer.tar.gz\ntar -xzf maran-installer.tar.gz\nsudo bash installer/install.sh --channel beta\n",[288,460,461,471,482],{"__ignoreMap":58},[291,462,463,465,468],{"class":293,"line":294},[291,464,298],{"class":297},[291,466,467],{"class":301}," -O",[291,469,470],{"class":305}," https://releases.maran.innovayse.com/installer/maran-installer.tar.gz\n",[291,472,473,476,479],{"class":293,"line":59},[291,474,475],{"class":297},"tar",[291,477,478],{"class":301}," -xzf",[291,480,481],{"class":305}," maran-installer.tar.gz\n",[291,483,485,488,491,494,497],{"class":293,"line":484},3,[291,486,487],{"class":297},"sudo",[291,489,490],{"class":305}," bash",[291,492,493],{"class":305}," installer/install.sh",[291,495,496],{"class":301}," --channel",[291,498,499],{"class":305}," beta\n",[208,501,502,503,506,507,330],{},"The public key the installer verifies against ships inside that package at\n",[288,504,505],{},"installer/keys/release-signing.pub",". Worth saying plainly: a signature checked against a key\ndownloaded from the same host proves only that both came from the same place. To do better,\ncompare that key against\n",[212,508,511],{"href":509,"rel":510},"https://github.com/innovayse/maran/blob/main/installer/keys/release-signing.pub",[328],"the copy in the repository",[277,513,515],{"id":514},"what-a-server-gets","What a server gets",[517,518,519,526,532,538,544,550,556,574],"ul",{},[520,521,522,525],"li",{},[270,523,524],{},"Hosting accounts that are real Linux users."," Creating one provisions the system user, the\nhome directory and the plan's disk quota on the host; suspend, reactivate and delete reach the\nhost too. The agent acts first and the database row follows, so the panel never claims an\naccount the server does not have.",[520,527,528,531],{},[270,529,530],{},"Websites"," — static, PHP and reverse-proxy — with domain aliases and a document root inside\nthe account's home. The agent renders the configuration, makes the server's own validator check\nthe result, and rolls it back if the validation or the reload refuses, so a bad render cannot\ntake a server's other sites down.",[520,533,534,537],{},[270,535,536],{},"Several PHP versions side by side",", each account with its own pool per version, running as\nthat account's Linux user. Customers may change a whitelisted subset of settings; anything\noutside the list is refused rather than quietly dropped.",[520,539,540,543],{},[270,541,542],{},"SSL"," over ACME with an HTTP-01 challenge, uploads of your own material, and a renewal pass\nthirty days before expiry. Key material is written to a root-only store outside every account's\nhome, because a site's PHP runs as that customer.",[520,545,546,549],{},[270,547,548],{},"Databases"," with a dedicated user each, per-plan limits and a size reading. The password is\ngenerated, shown once and never stored, so recovery is a reset rather than a retrieval.",[520,551,552,555],{},[270,553,554],{},"File transfer"," — SFTP served by the host's own OpenSSH, each login chrooted into a jail with\nthe account's real home mounted inside it, carrying the account's own uid and no shell. FTPS\nships installed but switched off: nothing listens until an administrator turns it on.",[520,557,558,561,562,565,566,569,570,573],{},[270,559,560],{},"Backups",", an append-only ",[270,563,564],{},"audit journal"," of every sign-in and every mutation, live ",[270,567,568],{},"log\ntailing",", the firewall, monitoring, and the ",[288,571,572],{},"maran"," command-line tool.",[520,575,576,579],{},[270,577,578],{},"Panel sign-in"," with Argon2id, short-lived access tokens, refresh rotation where a reused\ntoken revokes the whole family, TOTP with recovery codes, and sessions you can revoke\nindividually or everywhere at once.",[277,581,583],{"id":582},"what-it-deliberately-does-not-do","What it deliberately does not do",[208,585,586],{},"DNS, mail, and a web database manager. Each is absent by decision rather than unfinished: a\ndatabase manager is planned as a separate deployable with its own address and its own\nauthentication rather than half-built here.",[277,588,590],{"id":589},"before-you-install-it-anywhere-that-matters","Before you install it anywhere that matters",[208,592,593],{},"Three limitations are worth knowing in advance, because an operator would otherwise find them out\nthe hard way.",[517,595,596,610,616],{},[520,597,598,601,602,605,606,609],{},[270,599,600],{},"No certificate has been issued by a real authority."," The whole path does run end to end —\nregistration, order, HTTP-01 challenge served and validated, finalise, download — against\n",[288,603,604],{},"pebble",", Let's Encrypt's own test server, with the issued certificate's serial matching the one\nread back out of the PEM. That exercise found a real defect no test had: the client sent no\n",[288,607,608],{},"User-Agent",", which pebble refuses on every request and Let's Encrypt tolerates. What is still\nowed is the authority itself: not their rate limits, not validation from the public internet, not\ntheir chain. The renewal branch is not exercised at all, because the test forces a fresh\nchallenge every run. HTTP-01 only — no wildcards, which arrive with DNS management.",[520,611,612,615],{},[270,613,614],{},"Dropping a database is final."," There is no snapshot, no recycle bin and no delay, and nothing\nin the drop path consults the backup module. A database is restorable only from a backup that\nalready existed.",[520,617,618,621,622,625,626,629,630,633],{},[270,619,620],{},"The SSH daemon's jail configuration is watched, and the watch has a stated edge."," The\ninstaller writes the block that makes a file transfer login a jailed one, and monitoring now\nreads that block back and raises an alert when it drifts — all four directives individually, so\na block whose header survived and whose body was emptied is caught too. It reads the\nconfiguration file rather than asking the daemon, because ",[288,623,624],{},"sshd -T"," never prints the contents of\na ",[288,627,628],{},"Match"," block at all. What it does not do: follow ",[288,631,632],{},"Include"," directives, or prove that a drifted\nhost really grants a shell. It reports that the configuration no longer says what was written.",[208,635,636],{},"The threat notes covering the privileged parts were reviewed and accepted on the release date. That\nsatisfies the project's own second-reviewer rule. It is not an external audit, and this page does\nnot claim one.",[277,638,640],{"id":639},"upgrading-from-010","Upgrading from 0.1.0",[208,642,643,644,648],{},"There is no upgrade path, and none is needed: ",[212,645,647],{"href":646},"/releases/0.1.0","0.1.0"," was scaffolding with no\nhosting features and nothing running on it to preserve.",[650,651,652],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .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":58,"searchDepth":59,"depth":59,"links":654},[655,656,657,658,659,660],{"id":279,"depth":59,"text":280},{"id":336,"depth":59,"text":337},{"id":514,"depth":59,"text":515},{"id":582,"depth":59,"text":583},{"id":589,"depth":59,"text":590},{"id":639,"depth":59,"text":640},"beta","2026-09-23","The first release you can install on a server: accounts as real Linux users, websites, PHP versions, SSL, databases, file transfer and backups — published as a beta, with the boundary stated.",{},"/en/releases/0.0-beta.1",{"title":263,"description":663},"en/releases/1.0.0-beta.1","1.0.0-beta.1","ew3oTnwiVfC6YTYkcesfkXnoM6P8kvnD11tcUQ3_Jl8",{"id":671,"title":672,"author":673,"body":674,"date":706,"description":707,"extension":67,"meta":708,"navigation":32,"path":709,"seo":710,"seoTitle":672,"stem":711,"__hash__":712},"blogEn/en/blog/introducing-maran.md","Why the agent takes no shell commands","Innovayse",{"type":55,"value":675,"toc":702},[676,679,682,686,689,692,696,699],[208,677,678],{},"Every control panel has the same shape: something a person clicks, and something with root that\ndoes the work. The interesting question is what travels between them.",[208,680,681],{},"The usual answer is a command line. It is the fastest thing to build and the hardest thing to keep\nsafe, because every value a customer controls — a domain, a database name, a file path — eventually\nlands inside a string that a shell will parse. Getting that right once is easy. Getting it right in\nevery place, forever, while the panel grows, is the part nobody manages.",[277,683,685],{"id":684},"what-we-do-instead","What we do instead",[208,687,688],{},"Maran's root daemon accepts named operations with typed, validated arguments, and nothing else.\nThere is no operation that takes a command to run. A domain is not escaped before it reaches a\nconfiguration file — it is validated as a domain, which is to say letters, digits, hyphens and\ndots, so there is no newline in it to end one directive and begin another.",[208,690,691],{},"The practical effect is that the set of things the daemon can be made to do is finite, written\ndown, and reviewable. An operation that does not exist in the contract cannot be requested, however\ninventive the request.",[277,693,695],{"id":694},"what-it-costs","What it costs",[208,697,698],{},"Every new capability is a contract change rather than a new string. That is slower, and\ndeliberately so: adding one means deciding what its arguments are, what counts as valid, and what\nhappens when the host disagrees — before any of it ships.",[208,700,701],{},"It also rules out a class of feature a panel could otherwise offer: \"run this command for me\". We\nthink that is the right trade for software that holds root on a server somebody else's customers\nlive on.",{"title":58,"searchDepth":59,"depth":59,"links":703},[704,705],{"id":684,"depth":59,"text":685},{"id":694,"depth":59,"text":695},"2026-09-19","The one design decision that shaped everything else in Maran — a root daemon that takes typed operations and no shell strings — and what it costs.",{},"/en/blog/introducing-maran",{"title":672,"description":707},"en/blog/introducing-maran","STdbSFhLF8_747edp3DUtf0y88lniGygefkG95y32ts",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":714},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":716},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"/>\u003Cpath d=\"m9 12l2 2l4-4\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":718},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 19h8M4 17l6-6l-6-6\"/>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":720},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2M16 3.128a4 4 0 0 1 0 7.744M22 21v-2a4 4 0 0 0-3-3.87\"/>\u003Ccircle cx=\"9\" cy=\"7\" r=\"4\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":722},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 22v-5m3-9V2m2 6a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1zM9 8V2\"/>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":724},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"/>\u003Cpath d=\"M12 2a14.5 14.5 0 0 0 0 20a14.5 14.5 0 0 0 0-20M2 12h20\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":726},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\"/>\u003Cpath d=\"M7 11V7a5 5 0 0 1 10 0v4\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":728},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\"/>\u003Cpath d=\"M3 5v14a9 3 0 0 0 18 0V5\"/>\u003Cpath d=\"M3 12a9 3 0 0 0 18 0\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":730},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"20\" height=\"5\" x=\"2\" y=\"3\" rx=\"1\"/>\u003Cpath d=\"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8m-10 4h4\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":732},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M15 12h-5m5-4h-5m9 9V5a2 2 0 0 0-2-2H4\"/>\u003Cpath d=\"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":734},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M3 12a9 9 0 0 1 9-9a9.75 9.75 0 0 1 6.74 2.74L21 8\"/>\u003Cpath d=\"M21 3v5h-5m5 4a9 9 0 0 1-9 9a9.75 9.75 0 0 1-6.74-2.74L3 16\"/>\u003Cpath d=\"M8 16H3v5\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":736},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"7\" height=\"9\" x=\"3\" y=\"3\" rx=\"1\"/>\u003Crect width=\"7\" height=\"5\" x=\"14\" y=\"3\" rx=\"1\"/>\u003Crect width=\"7\" height=\"9\" x=\"14\" y=\"12\" rx=\"1\"/>\u003Crect width=\"7\" height=\"5\" x=\"3\" y=\"16\" rx=\"1\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":738},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20 6L9 17l-5-5\"/>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":740},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14\"/>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":742},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M18 6L6 18M6 6l12 12\"/>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":744},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"/>\u003Cpath d=\"M14 2v5a1 1 0 0 0 1 1h5M9 15l2 2l4-4\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":746},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M12 10a2 2 0 0 0-2 2c0 1.02-.1 2.51-.26 4M14 13.12c0 2.38 0 6.38-1 8.88m4.29-.98c.12-.6.43-2.3.5-3.02M2 12a10 10 0 0 1 18-6M2 16h.01m19.79 0c.2-2 .131-5.354 0-6\"/>\u003Cpath d=\"M5 19.5C5.5 18 6 15 6 12a6 6 0 0 1 .34-2m2.31 12c.21-.66.45-1.32.57-2M9 6.8a6 6 0 0 1 9 5.2v2\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":748},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575a1 1 0 0 1 0 .696a10.8 10.8 0 0 1-1.444 2.49m-6.41-.679a3 3 0 0 1-4.242-4.242\"/>\u003Cpath d=\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 4.446-5.143M2 2l20 20\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":750},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M10 12h4m-4-4h4m0 13v-3a2 2 0 0 0-4 0v3\"/>\u003Cpath d=\"M6 10H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-2\"/>\u003Cpath d=\"M6 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":752},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"20\" height=\"8\" x=\"2\" y=\"2\" rx=\"2\" ry=\"2\"/>\u003Crect width=\"20\" height=\"8\" x=\"2\" y=\"14\" rx=\"2\" ry=\"2\"/>\u003Cpath d=\"M6 6h.01M6 18h.01\"/>\u003C/g>",1790166380291]