PageSourceSearch

https://envless.cloud/assets/compare.slug-Ckhn9xJn.js

js envless.cloud collected 2026-10-08 19:59:11 UTC 16,728 bytes, 1 lines download raw bytes

1import{r as n,w as C,e as k}from"./chunk-BV7QT456.BQ71lt_D.js";import{j as e}from"./jsx-runtime.u17CrQMm.js";import{P as I,a as P}from"./PageHero.Li5Wljal.js";import"./ExternalLinks.DYQ1kwe5.js";import{e as w}from"./index.Bq7B3-hS.js";import{B as M}from"./badge.DcPQDkYT.js";import{C as F,S as c,R as h}from"./jwt-generator.DZpDpWmD.js";import{S as R,F as _,a as Z}from"./SpecimenFrame.D6W5qhJK.js";import{o as m}from"./Check.es.CGp0En6k.js";import{a as d}from"./animate-attributes.CG3A8P5v.js";import{S as y}from"./SectionHeader.B-M5V7Eg.js";import{T as L}from"./ToolFAQ.BUMjTJC7.js";import{e as O}from"./CaretDown.es.v0qXmIHr.js";import{r as T}from"./ArrowsHorizontal.es.Bm8xd_k3.js";import{e as N}from"./Minus.es.BkAwPtek.js";import{p as $}from"./IconBase.es.DBo9aoPr.js";import{S as H}from"./seo.DRFtizGJ.js";import{C as V}from"./comparisons.C8okjm1X.js";import{F as B}from"./FaqSchema.DQEM2Yug.js";import{R as D}from"./RouteParam.BGKHcA7c.js";import"./interaction.CJtquuJa.js";import"./index.CqF9FHED.js";/* empty css                    */import"./animate.8bTpExtZ.js";import"./FAQItem.CcrIn_rj.js";import"./Plus.es.Bao4C_up.js";const G=new Map([["bold",n.createElement(n.Fragment,null,n.createElement("path",{d:"M144,180a16,16,0,1,1-16-16A16,16,0,0,1,144,180Zm92-52A108,108,0,1,1,128,20,108.12,108.12,0,0,1,236,128Zm-24,0a84,84,0,1,0-84,84A84.09,84.09,0,0,0,212,128ZM128,64c-24.26,0-44,17.94-44,40v4a12,12,0,0,0,24,0v-4c0-8.82,9-16,20-16s20,7.18,20,16-9,16-20,16a12,12,0,0,0-12,12v8a12,12,0,0,0,23.73,2.56C158.31,137.88,172,122.37,172,104,172,81.94,152.26,64,128,64Z"}))],["duotone",n.createElement(n.Fragment,null,n.createElement("path",{d:"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",opacity:"0.2"}),n.createElement("path",{d:"M140,180a12,12,0,1,1-12-12A12,12,0,0,1,140,180ZM128,72c-22.06,0-40,16.15-40,36v4a8,8,0,0,0,16,0v-4c0-11,10.77-20,24-20s24,9,24,20-10.77,20-24,20a8,8,0,0,0-8,8v8a8,8,0,0,0,16,0v-.72c18.24-3.35,32-17.9,32-35.28C168,88.15,150.06,72,128,72Zm104,56A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z"}))],["fill",n.createElement(n.Fragment,null,n.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,168a12,12,0,1,1,12-12A12,12,0,0,1,128,192Zm8-48.72V144a8,8,0,0,1-16,0v-8a8,8,0,0,1,8-8c13.23,0,24-9,24-20s-10.77-20-24-20-24,9-24,20v4a8,8,0,0,1-16,0v-4c0-19.85,17.94-36,40-36s40,16.15,40,36C168,125.38,154.24,139.93,136,143.28Z"}))],["light",n.createElement(n.Fragment,null,n.createElement("path",{d:"M138,180a10,10,0,1,1-10-10A10,10,0,0,1,138,180ZM128,74c-21,0-38,15.25-38,34v4a6,6,0,0,0,12,0v-4c0-12.13,11.66-22,26-22s26,9.87,26,22-11.66,22-26,22a6,6,0,0,0-6,6v8a6,6,0,0,0,12,0v-2.42c18.11-2.58,32-16.66,32-33.58C166,89.25,149,74,128,74Zm102,54A102,102,0,1,1,128,26,102.12,102.12,0,0,1,230,128Zm-12,0a90,90,0,1,0-90,90A90.1,90.1,0,0,0,218,128Z"}))],["regular",n.createElement(n.Fragment,null,n.createElement("path",{d:"M140,180a12,12,0,1,1-12-12A12,12,0,0,1,140,180ZM128,72c-22.06,0-40,16.15-40,36v4a8,8,0,0,0,16,0v-4c0-11,10.77-20,24-20s24,9,24,20-10.77,20-24,20a8,8,0,0,0-8,8v8a8,8,0,0,0,16,0v-.72c18.24-3.35,32-17.9,32-35.28C168,88.15,150.06,72,128,72Zm104,56A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z"}))],["thin",n.createElement(n.Fragment,null,n.createElement("path",{d:"M136,180a8,8,0,1,1-8-8A8,8,0,0,1,136,180ZM128,76c-19.85,0-36,14.36-36,32v4a4,4,0,0,0,8,0v-4c0-13.23,12.56-24,28-24s28,10.77,28,24-12.56,24-28,24a4,4,0,0,0-4,4v8a4,4,0,0,0,8,0v-4.2c18-1.77,32-15.36,32-31.8C164,90.36,147.85,76,128,76Zm100,52A100,100,0,1,1,128,28,100.11,100.11,0,0,1,228,128Zm-8,0a92,92,0,1,0-92,92A92.1,92.1,0,0,0,220,128Z"}))]]),g=n.forwardRef((a,s)=>n.createElement($,{ref:s,...a,weights:G}));g.displayName="QuestionIcon";const b={yes:{Icon:m,cls:"text-primary-text",label:"Yes"},partial:{Icon:N,cls:"text-warning",label:"Partial"},no:{Icon:w,cls:"text-muted-foreground",label:"No"},unknown:{Icon:g,cls:"text-muted-foreground",label:"Varies"}},z=[{capability:"Client-side end-to-end encryption",category:"Encryption",envless:"AES-256-GCM, PBKDF2-SHA256 200k iterations, per-workspace salt"},{capability:"Zero-knowledge server storage",category:"Encryption",envless:"Server stores ciphertext only; never sees plaintext or passphrase"}
1,{capability:"Workspace key rotation",category:"Encryption",envless:"Set, verify, rotate, and clear workspace passphrases"},{capability:"Typed runtime SDK import",category:"Developer tooling",envless:"TypeScript import with auto coercion, no .env files"},{capability:"Generated type declarations",category:"Developer tooling",envless:"envless types emits envless-env.d.ts for compile-time checks"},{capability:"Server/client secret separation",category:"Developer tooling",envless:"Enforced via bundler plugin, ESLint, runtime checks"},{capability:"Sync to .env files",category:"Sync",envless:"envless sync writes idempotent .env.<slug> files"},{capability:"Process wrapping",category:"Sync",envless:"envless run injects vars into a child process, no disk"},{capability:"Multi-environment merging",category:"Sync",envless:"run and build merge environments, later wins; sync writes one file each"},{capability:"On-disk encrypted caching",category:"Performance",envless:"On-disk ciphertext cache, 0600, 15-minute freshness window"},{capability:"Offline fallback",category:"Performance",envless:"whoami serves the cached profile when the API is unreachable"}],U=[{capability:"Framework integrations",category:"Integrations",envless:"Next.js, Vite, Node, Bun, Cloudflare/Vercel/Netlify edge"},{capability:"CI/CD and deploy targets",category:"Integrations",envless:"GitHub/GitLab/CircleCI, Vercel, Docker, K8s, Fly, Railway, Render"},{capability:"Variable versioning and rollback",category:"Versioning",envless:"Snapshots with notes, full history, one-click rollback"},{capability:"Workspace change history",category:"Versioning",envless:"Attributed per-variable history; every change sent as a signed webhook"},{capability:"Role-based access control",category:"Access control",envless:"Owner/Admin/Viewer plus custom roles, 45 permissions"},{capability:"Scoped API keys",category:"Access control",envless:"Per-resource read/write/none scopes, SHA-256 hashed"},{capability:"REST API with bulk ops",category:"API",envless:"Full CRUD plus bulk variable create/delete"},{capability:"Signed webhooks",category:"Automation",envless:"48 events, HMAC-SHA256 (Standard Webhooks), retries"},{capability:"CLI device-code auth",category:"Authentication",envless:"Browser OAuth device flow, locally cached tokens"},{capability:"Multi-provider sign-in",category:"Authentication",envless:"Email, Google, GitHub OAuth, and email OTP, with an optional per-user TOTP second factor"}],K=[...z,...U],W=(a,s=2)=>{const t=a.match(/[^.!?]+[.!?]+/g)??[a];return{lead:t.slice(0,s).join(" ").trim(),rest:t.slice(s).join(" ").trim()}},v=({src:a,alt:s,mono:t=!1})=>e.jsx("img",{src:a,alt:s,width:"28",height:"28",loading:"eager",decoding:"async",className:"vs-tile__logo","data-mono":t?"true":void 0}),q=({competitor:a,logo:s,logoMono:t=!1,stats:r})=>e.jsxs(R,{size:_.HERO,title:"comparison",children:[e.jsxs("div",{className:"flex min-h-0 flex-1 items-center justify-center gap-5",children:[e.jsx("span",{className:"vs-tile vs-tile--hero",children:e.jsx(v,{src:F.envless,alt:"Envless"})}),e.jsx("span",{className:"font-display text-3xl text-muted-foreground",children:"vs"}),e.jsx("span",{className:"vs-tile vs-tile--hero",children:e.jsx(v,{src:s,alt:a,mono:t})})]}),e.jsx(Z,{proofs:r})]}),Q=({competitor:a,logo:s,logoMono:t=!1,title:r,subtitle:o,stats:i})=>e.jsx(I,{kind:P.FEATURE,title:r,subtitle:o,lead:e.jsx(M,{variant:"secondary",children:"Comparison"}),visual:e.jsx(q,{competitor:a,logo:s,logoMono:t,stats:i})}),j=({title:a,items:s,accent:t=!1,step:r=0})=>e.jsxs("div",{...d(r),className:`rounded-3xl p-6 md:p-8 shadow-[0_8px_24px_-12px_var(--shade-strong)] ${t?"bg-primary-soft":"bg-tertiary"}`,children:[e.jsx("h3",{className:"font-display font-normal text-foreground text-xl mb-5",children:a}),e.jsx("ul",{className:"flex flex-col gap-3",children:s.map(o=>e.jsxs("li",{className:"flex items-start gap-3 text-body leading-relaxed",children:[e.jsx("span",{className:`mt-1 flex-shrink-0 inline-flex items-center justify-center w-5 h-5 rounded-full ${t?"bg-primary text-primary-foreground":"bg-foreground
1/10 text-foreground"}`,children:e.jsx(m,{size:12,weight:"bold",color:"currentColor"})}),e.jsx("span",{children:o})]},o))})]}),Y=({lead:a,rest:s,label:t="Read more"})=>e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"definition text-lg md:text-xl text-foreground leading-relaxed",children:a}),s&&e.jsxs("details",{className:"read-more group mt-4",children:[e.jsxs("summary",{className:'relative inline-flex items-center gap-1.5 text-sm font-medium text-primary-text cursor-pointer select-none list-none before:absolute before:inset-x-0 before:-inset-y-3 before:content-[""]',children:[e.jsx("span",{className:"group-open:hidden",children:t}),e.jsx("span",{className:"hidden group-open:inline",children:"Show less"}),e.jsx(O,{size:14,weight:"bold",color:"currentColor",className:"transition-transform group-open:rotate-180"})]}),e.jsx("p",{className:"mt-4 text-body leading-relaxed",children:s})]})]}),J=({competitor:a,intro:s,stats:t})=>{const{lead:r,rest:o}=W(s);return e.jsx("section",{className:"pb-6",children:e.jsxs("div",{className:"max-w-section mx-auto px-5 md:px-[60px]",children:[e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-5 gap-5",children:[e.jsxs("div",{...d(),className:"lg:col-span-3 rounded-3xl bg-tertiary p-6 md:p-8 shadow-[0_8px_24px_-12px_var(--shade-strong)] flex flex-col gap-4",children:[e.jsx("span",{className:"text-xs font-medium uppercase tracking-wide text-muted-foreground",children:"The short version"}),e.jsx(Y,{lead:r,rest:o,label:"Read the full breakdown"})]}),e.jsx("div",{className:"lg:col-span-2 grid grid-cols-1 sm:grid-cols-3 lg:grid-cols-1 gap-5",children:t.map((i,l)=>e.jsxs("div",{...d(l+1),className:`rounded-3xl p-6 shadow-[0_8px_24px_-12px_var(--shade-strong)] flex flex-col gap-1 ${i.accent?"bg-primary-soft":"bg-tertiary"}`,children:[e.jsx("span",{className:"font-display text-4xl text-foreground leading-none",children:i.value}),e.jsx("span",{className:"text-sm text-muted-foreground",children:i.label})]},i.label))})]}),e.jsxs("p",{className:"sr-only",children:["Compared against ",a,"."]})]})})},X=({row:a})=>{const s=b[a.level]??b.unknown,t=s.Icon;
1return e.jsxs("tr",{className:"border-t border-foreground/5 align-top",children:[e.jsx("th",{scope:"row",className:"py-5 px-4 md:px-6 font-medium text-body",children:a.capability}),e.jsx("td",{className:"py-5 px-4 md:px-6",children:e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:"mt-0.5 flex-shrink-0 inline-flex text-primary-text",children:e.jsx(m,{size:18,weight:"bold",color:"currentColor"})}),e.jsx("span",{className:"text-foreground",children:a.envless})]})}),e.jsx("td",{className:"py-5 px-4 md:px-6",children:e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:`mt-0.5 flex-shrink-0 inline-flex ${s.cls}`,title:s.label,children:e.jsx(t,{size:18,weight:"bold",color:"currentColor"})}),e.jsx("span",{className:"text-muted-foreground",children:a.note||s.label})]})})]},a.capability)},ee=({groups:a})=>e.jsx(e.Fragment,{children:a.map(s=>e.jsxs(n.Fragment,{children:[e.jsx("tr",{children:e.jsx("th",{colSpan:3,scope:"colgroup",className:"bg-background py-3 px-4 md:px-6 text-xs font-medium uppercase tracking-wide text-muted-foreground",children:s.category})}),s.rows.map(t=>e.jsx(X,{row:t},t.capability))]},s.category))}),se=a=>{const s=[];for(const t of a){let r=s.find(o=>o.category===t.category);r||(r={category:t.category,rows:[]},s.push(r)),r.rows.push(t)}return s},te=({competitor:a,envlessCount:s,competitorYes:t})=>e.jsx("thead",{children:e.jsxs("tr",{className:"text-sm font-display font-normal",children:[e.jsx("th",{className:"py-6 px-4 md:px-6 text-foreground w-1/2",children:"Capability"}),e.jsxs("th",{className:"py-6 px-4 md:px-6 text-primary-text",children:["Envless",e.jsxs("span",{className:"block text-xs font-normal text-muted-foreground mt-0.5",children:[s," / ",s]})]}),e.jsxs("th",{className:"py-6 px-4 md:px-6 text-foreground",children:[a,e.jsxs("span",{className:"block text-xs font-normal text-muted-foreground mt-0.5",children:[t," / ",s," fully"]})]})]})}),ae=()=>e.jsxs("div",{className:"flex flex-wrap items-center gap-x-6 gap-y-2 px-5 md:px-6 py-4 text-xs text-muted-foreground border-t border-foreground
1/5",children:[e.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[e.jsx("span",{className:"inline-flex text-primary-text",children:e.jsx(m,{size:14,weight:"bold",color:"currentColor"})}),"Supported"]}),e.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[e.jsx("span",{className:"inline-flex text-warning",children:e.jsx(N,{size:14,weight:"bold",color:"currentColor"})}),"Partial"]}),e.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[e.jsx("span",{className:"inline-flex text-muted-foreground",children:e.jsx(w,{size:14,weight:"bold",color:"currentColor"})}),"Not built in"]}),e.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[e.jsx("span",{className:"inline-flex text-muted-foreground",children:e.jsx(g,{size:14,weight:"bold",color:"currentColor"})}),"Varies / unverified"]})]}),re=({competitor:a,rows:s})=>{const t=se(s),r=s.length,o=s.filter(i=>i.level==="yes").length;return e.jsxs("div",{...d(),className:"overflow-hidden rounded-3xl bg-tertiary shadow-[0_8px_24px_-12px_var(--shade-strong)]",children:[e.jsxs("p",{className:"flex items-center gap-2 border-b border-foreground
1/5 px-5 py-3 text-xs text-muted-foreground md:hidden",children:[e.jsx(T,{size:14,weight:"bold",color:"currentColor"})," Swipe the table sideways to see every column."]}),e.jsxs("div",{className:"relative",children:[e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full min-w-[560px] md:min-w-[760px] border-collapse text-left",children:[e.jsx(te,{competitor:a,envlessCount:r,competitorYes:o}),e.jsx("tbody",{children:e.jsx(ee,{groups:t})})]})}),e.jsx("span",{"aria-hidden":"true",className:"pointer-events-none absolute inset-y-0 right-0 w-8 bg-linear-to-l from-tertiary to-transparent md:hidden"})]}),e.jsx(ae,{})]})},E=a=>{const s=V.find(t=>t.slug===a);if(!s)throw new Error(`No comparison for slug "${a}"`);return s},ne=a=>K.map(s=>{const t=a.matrix.find(r=>r.capability===s.capability);return{...s,level:(t==null?void 0:t.level)??"unknown",note:(t==null?void 0:t.note)??""}}),oe=(a,s)=>{const t=s.filter(o=>o.level==="yes").length,r=s.length-t;return[{value:`${s.length}`,label:"capabilities compared"},{value:`${t}/${s.length}`,label:`${a} covers fully`},{value:`${r}`,label:r===1?"place they differ":"places they differ",accent:!0}]},ie=({params:a})=>{const{slug:s,title:t,metaDescription:r,h1:o,faqs:i}=E(D(a.slug)),l=`${c}${h.compare}/${s}`,p={"@type":"BreadcrumbList",itemListElement:[{"@type":"ListItem",position:1,name:"Home",item:c+h.home},{"@type":"ListItem",position:2,name:"Compare",item:c+h.compare},{"@type":"ListItem",position:3,name:o,item:l}]},x={"@type":"WebPage","@id":`${l}/#webpage`,url:l,name:t,description:r,isPartOf:{"@id":`${c}/#website`},about:{"@id":`${c}/#software`},speakable:{"@type":"SpeakableSpecification",cssSelector:[H.DEFINITION]}};return{title:t,description:r,jsonLd:[p,x,B(i)]}},_e={page:ie},Ze=C(function(){const s=E(k().slug),{competitor:t,logo:r,logoMono:o,h1:i,subtitle:l,intro:p,chooseEnvless:x,chooseCompetitor:S,faqs:A}=s,u=ne(s),f=oe(t,u);return e.jsxs(e.Fragment,{children:[e.jsx(Q,{competitor:t,logo:r,logoMono:o,title:i,subtitle:l,stats:f}),e.jsx(J,{competitor:t,intro:p,stats:f}),e.jsx("section",{className:"py-16 md:py-24",children:e.jsxs("div",{className:"max-w-section mx-auto px-5 md:px-[60px]",children:[e.jsx(y,{badge:"Side by side",title:"Capability by capability",subtitle:`Every capability we track, with how Envless and ${t} each handle it.`}),e.jsx(re,{competitor:t,rows:u})]})}),e.jsx("section",{className:"pb-16 md:pb-24",children:e.jsxs("div",{className:"max-w-section mx-auto px-5 md:px-[60px]",children:[e.jsx(y,{badge:"Which one",title:"Pick the right fit",subtitle:"Both are good tools. This is about which trade-offs match your team."}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-5",children:[e.jsx(j,{title:"Choose Envless when",items:x,accent:!0}),e.jsx(j,{title:`Choose ${t} when`,items:S,step:1})]})]})}),e.jsx(L,{heading:`Envless vs ${t} FAQ`,subtitle:"Common questions about comparing and switching.",faqs:A})]})});export{Ze as default,_e as handle};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.