diff --git a/docs/.vitepress/theme/Layout.vue b/docs/.vitepress/theme/Layout.vue index 4f2c483440..e55b9f0338 100644 --- a/docs/.vitepress/theme/Layout.vue +++ b/docs/.vitepress/theme/Layout.vue @@ -10,45 +10,63 @@ - + - + @@ -65,11 +83,33 @@ import { ref } from "vue"; import EndevFooter from "./EndevFooter.vue"; const copied = ref(false); +const installCommand = "curl https://mise.run | sh"; + +async function copyInstall() { + if (await copyText(installCommand)) { + copied.value = true; + setTimeout(() => (copied.value = false), 2000); + } +} + +async function copyText(text: string) { + try { + await navigator.clipboard?.writeText(text); + if (navigator.clipboard) return true; + } catch { + // Fall back to the temporary textarea path below. + } -function copyInstall() { - navigator.clipboard.writeText("curl https://mise.run | sh"); - copied.value = true; - setTimeout(() => (copied.value = false), 2000); + const textarea = document.createElement("textarea"); + textarea.value = text; + textarea.setAttribute("readonly", ""); + textarea.style.position = "fixed"; + textarea.style.opacity = "0"; + document.body.appendChild(textarea); + textarea.select(); + const copiedText = document.execCommand("copy"); + document.body.removeChild(textarea); + return copiedText; } @@ -166,122 +206,6 @@ function copyInstall() { 50% { transform: translate(20px, -30px) scale(1.05); } } -/* ═══════════════════════════════════════════ - CHEF LOGO — commanding centerpiece - ═══════════════════════════════════════════ */ -.hero-chef-logo { - display: flex; - justify-content: flex-start; - margin-bottom: 12px; -} - -.hero-chef-logo .chef-logo { - width: 420px; - max-width: 90vw; - height: auto; - filter: drop-shadow(0 4px 20px rgba(139, 34, 82, 0.15)); - transition: filter 0.4s ease; -} - -.hero-chef-logo .chef-logo:hover { - filter: drop-shadow(0 8px 32px rgba(139, 34, 82, 0.25)); -} - -/* Light mode: show light (black) logo, hide dark */ -.hero-chef-logo .chef-logo-dark { - display: none; -} - -/* Dark mode: swap logos */ -.dark .hero-chef-logo .chef-logo-light { - display: none; -} - -.dark .hero-chef-logo .chef-logo-dark { - display: inline; -} - -.dark .hero-chef-logo .chef-logo { - filter: drop-shadow(0 4px 24px rgba(199, 91, 122, 0.2)); -} - -.dark .hero-chef-logo .chef-logo:hover { - filter: drop-shadow(0 8px 40px rgba(199, 91, 122, 0.35)); -} - -@keyframes heroLogoIn { - from { - opacity: 0; - transform: translateY(-30px) scale(0.95); - } - to { - opacity: 1; - transform: translateY(0) scale(1); - } -} - -/* ═══════════════════════════════════════════ - AUBE PROMO — compact cross-project banner - ═══════════════════════════════════════════ */ -.hero-aube-banner { - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 2px; - width: 100%; - padding: 8px 12px; - color: var(--vp-c-text-1); - background: - linear-gradient(90deg, rgba(107, 127, 78, 0.12), rgba(139, 34, 82, 0.08)), - var(--vp-c-bg-soft); - border: 1px solid rgba(107, 127, 78, 0.35); - border-radius: 8px; - text-decoration: none; - box-shadow: 0 8px 24px rgba(26, 18, 16, 0.06); - transition: - border-color 0.2s ease, - box-shadow 0.2s ease, - transform 0.2s ease; -} - -.hero-aube-banner:hover { - border-color: var(--vp-c-brand-1); - box-shadow: 0 12px 32px rgba(139, 34, 82, 0.12); - transform: translateY(-1px); -} - -.dark .hero-aube-banner { - background: - linear-gradient(90deg, rgba(143, 168, 110, 0.14), rgba(199, 91, 122, 0.1)), - var(--vp-c-bg-soft); - border-color: rgba(143, 168, 110, 0.35); - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.16); -} - -.aube-kicker { - font-family: "Roc Grotesk", sans-serif; - font-size: 0.72rem; - line-height: 1; - font-weight: 600; - letter-spacing: 0.06em; - text-transform: uppercase; -} - -.aube-kicker { - color: #6B7F4E; -} - -.dark .aube-kicker { - color: #8FA86E; -} - -.aube-message { - min-width: 0; - font-size: 0.78rem; - line-height: 1.25; - color: var(--vp-c-text-2); -} - /* ═══════════════════════════════════════════ INSTALL COMMAND — signature dish ═══════════════════════════════════════════ */ @@ -292,16 +216,6 @@ function copyInstall() { margin-top: 0; } -.install-label { - font-family: "Roc Grotesk", sans-serif; - font-weight: 400; - font-size: 0.75rem; - letter-spacing: 0.15em; - text-transform: uppercase; - color: var(--vp-c-text-3); - margin-bottom: 8px; -} - .install-command { display: flex; align-items: center; @@ -355,15 +269,12 @@ function copyInstall() { margin-top: 10px; font-size: 0.85rem; font-family: "Roc Grotesk", sans-serif; -} - -.install-alt a { color: var(--vp-c-text-3); text-decoration: none; transition: color 0.2s ease; } -.install-alt a:hover { +.install-alt:hover { color: var(--vp-c-brand-1); } @@ -382,19 +293,6 @@ function copyInstall() { RESPONSIVE ═══════════════════════════════════════════ */ @media (max-width: 768px) { - .hero-chef-logo .chef-logo { - max-width: 280px; - } - - .hero-aube-banner { - align-items: center; - text-align: center; - } - - .aube-message { - font-size: 0.85rem; - } - .hero-glow-1 { width: 350px; height: 350px; } .hero-glow-2 { width: 300px; height: 300px; } .hero-glow-3 { width: 250px; height: 250px; } @@ -404,9 +302,4 @@ function copyInstall() { } } -@media (max-width: 480px) { - .hero-chef-logo .chef-logo { - max-width: 220px; - } -} diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index 976891c359..50992d94eb 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -419,13 +419,6 @@ h1, h2, h3, h4, h5, h6, gap: 0 60px; } -/* Left column: logo */ -.VPHero .main .hero-chef-logo { - grid-column: 1; - grid-row: 1; - justify-content: flex-start; -} - /* Hide the default VitePress hero name and actions */ .VPHero .name { display: none !important; @@ -463,6 +456,7 @@ h1, h2, h3, h4, h5, h6, display: flex; gap: 12px; flex-wrap: wrap; + margin-top: 12px; } .action-btn { @@ -709,7 +703,7 @@ div[class*="language-"] .copy:hover { .VPFeature { border: 1px solid var(--vp-c-divider); - border-radius: 14px; + border-radius: 8px; transition: all 0.35s cubic-bezier(0.22, 1, 0.36, 1) !important; background: var(--vp-c-bg); position: relative; @@ -935,12 +929,6 @@ div[class*="language-"] .copy:hover { grid-template-columns: 1fr !important; } - .VPHero .main .hero-chef-logo { - grid-column: 1; - grid-row: auto; - justify-content: center; - } - .VPHero .tagline { grid-column: 1; grid-row: auto; @@ -1009,3 +997,706 @@ div[class*="language-"] .copy:hover { color: var(--vp-c-danger-1); border: 1px solid var(--vp-c-danger-2); } + +/* ═══ Claude Design handoff landing page ═══ */ +.VPHero .name, +.VPHero .tagline, +.VPHero .actions { + display: none !important; +} + +.VPHero { + padding-top: 76px !important; + padding-bottom: 64px !important; +} + +.VPHero .container { + max-width: 1120px !important; +} + +.VPHero .main { + display: grid !important; + grid-template-columns: minmax(0, 0.95fr) minmax(360px, 1.05fr); + gap: 56px; + align-items: center; +} + +.VPHero .text { + max-width: none !important; +} + +.VPContent.is-home, +.VPHome { + overflow-x: hidden; +} + +.hero-copy { + position: relative; + z-index: 1; + min-width: 0; +} + +.hero-eyebrow, +.landing-kicker { + font-family: var(--vp-font-family-mono); + font-size: 0.72rem !important; + line-height: 1.3 !important; + letter-spacing: 0.14em; + text-transform: uppercase; + color: var(--vp-c-text-3); +} + +.hero-eyebrow::before, +.landing-kicker::before { + content: ""; + display: inline-block; + width: 24px; + height: 1px; + margin-right: 10px; + vertical-align: middle; + background: currentColor; +} + +.hero-lockup { + margin-top: 18px; +} + +.hero-lockup .chef-logo { + width: min(340px, 72vw); + height: auto; + filter: drop-shadow(0 12px 34px rgba(139, 34, 82, 0.16)); +} + +.hero-lockup .chef-logo-dark { + display: none; +} + +.dark .hero-lockup .chef-logo-light { + display: none; +} + +.dark .hero-lockup .chef-logo-dark { + display: inline; +} + +.hero-copy h1 { + margin: 22px 0 0; + font-family: "Cormorant Garamond", Georgia, serif; + font-size: clamp(3.4rem, 7vw, 5.75rem); + font-style: italic; + font-weight: 300; + line-height: 0.95; + letter-spacing: 0; + color: var(--vp-c-brand-1); +} + +.hero-copy h1 em, +.landing-section h2 em { + font-family: "Cormorant Garamond", Georgia, serif; + font-style: italic; + font-weight: 300; + color: inherit; +} + +.hero-copy p { + max-width: min(42ch, 100%); + margin: 22px 0 0; + color: var(--vp-c-text-2); + font-size: 1.1rem; + line-height: 1.65; + overflow-wrap: break-word; +} + +.hero-right { + display: flex; + flex-direction: column; + gap: 18px; + min-width: 0; +} + +.hero-terminal { + width: 100%; + max-width: 100%; + overflow: hidden; + border: 1px solid var(--vp-c-divider); + border-radius: 8px; + background: var(--vp-c-bg-soft); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.04), + 0 22px 48px -28px rgba(0, 0, 0, 0.5); + font-family: var(--vp-font-family-mono); + font-size: 0.82rem; +} + +.terminal-bar { + display: flex; + align-items: center; + gap: 8px; + padding: 11px 14px; + border-bottom: 1px solid var(--vp-c-divider); + background: var(--vp-c-bg-mute); +} + +.terminal-bar span { + width: 10px; + height: 10px; + border-radius: 50%; +} + +.terminal-bar span:nth-child(1) { + background: var(--vp-c-danger-1); +} + +.terminal-bar span:nth-child(2) { + background: var(--vp-c-warning-1); +} + +.terminal-bar span:nth-child(3) { + background: var(--vp-c-success-1); +} + +.terminal-bar strong { + margin-left: auto; + margin-right: auto; + color: var(--vp-c-text-3); + font-size: 0.68rem; + font-weight: 400; + letter-spacing: 0.08em; +} + +.terminal-body { + padding: 18px 20px; + color: var(--vp-c-text-1); + line-height: 1.75; + white-space: nowrap; + overflow: auto; +} + +.terminal-body .prompt { + color: var(--vp-c-brand-1); +} + +.terminal-body .ok { + color: var(--vp-c-success-1); +} + +.terminal-body .key { + color: var(--vp-c-warning-1); +} + +.terminal-body .dim { + color: var(--vp-c-text-3); +} + +.hero-install { + align-items: stretch; +} + +.hero-install .install-command { + width: 100%; + justify-content: space-between; + border-radius: 8px; + font-size: 0.88rem; +} + +.hero-install .install-copy { + font-size: 0.74rem; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.hero-install .install-alt { + align-self: flex-start; +} + +.VPHome .vp-doc { + max-width: none; + padding: 0 24px 80px; +} + +.landing-page { + max-width: 1120px; + margin: 0 auto; +} + +.landing-section { + margin-top: 76px; +} + +.landing-metaphor { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(320px, 0.9fr); + gap: 64px; + align-items: center; + padding-top: 72px; + border-top: 1px solid var(--vp-c-divider); +} + +.landing-section h2 { + margin: 12px 0 0; + font-family: "Cormorant Garamond", Georgia, serif; + font-size: clamp(2.5rem, 5vw, 4rem); + font-style: italic; + font-weight: 300; + line-height: 1; + letter-spacing: 0; + color: var(--vp-c-brand-1); +} + +.landing-section p { + color: var(--vp-c-text-2); +} + +.landing-definition { + padding: 22px; + border-left: 2px solid var(--vp-c-brand-1); + border-radius: 0 8px 8px 0; + background: var(--vp-c-bg-soft); +} + +.definition-word { + font-family: "Cormorant Garamond", Georgia, serif; + font-size: 1.7rem; + font-style: italic; + color: var(--vp-c-text-1); +} + +.definition-word span { + margin-left: 8px; + font-family: var(--vp-font-family-mono); + font-size: 0.8rem; + color: var(--vp-c-text-3); +} + +.landing-section-heading { + display: flex; + align-items: flex-end; + justify-content: space-between; + gap: 24px; + margin-bottom: 34px; +} + +.landing-section-heading.centered { + display: block; + max-width: 720px; + margin-right: auto; + margin-left: auto; + text-align: center; +} + +.landing-section-heading.centered .landing-kicker::before, +.landing-cta .landing-kicker::before { + display: none; +} + +.landing-small-button, +.landing-links a { + display: inline-flex; + align-items: center; + min-height: 38px; + padding: 0 16px; + border: 1px solid var(--vp-c-divider); + border-radius: 6px; + color: var(--vp-c-text-1); + font-family: var(--vp-font-family-mono); + font-size: 0.72rem; + letter-spacing: 0.08em; + text-transform: uppercase; + text-decoration: none; +} + +.landing-feature-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 18px; +} + +.landing-feature-card { + position: relative; + min-width: 0; + min-height: 260px; + padding: 28px; + border: 1px solid var(--vp-c-divider); + border-radius: 8px; + background: var(--vp-c-bg-soft); + color: var(--vp-c-text-1); + text-decoration: none !important; + transition: + border-color 0.2s ease, + transform 0.2s ease, + box-shadow 0.2s ease; +} + +.landing-feature-card:hover { + border-color: var(--vp-c-brand-1); + transform: translateY(-2px); + box-shadow: 0 18px 44px -32px rgba(139, 34, 82, 0.45); +} + +.card-number, +.card-link { + font-family: var(--vp-font-family-mono); + font-size: 0.72rem; + letter-spacing: 0.1em; + color: var(--vp-c-text-3); +} + +.card-icon { + position: absolute; + top: 22px; + right: 22px; + display: grid; + place-items: center; + width: 56px; + height: 56px; + border: 1px solid var(--vp-c-divider); + border-radius: 50%; + background: var(--vp-c-bg); + font-size: 1.55rem; +} + +.landing-feature-card h3 { + margin: 70px 0 10px; + font-family: "Roc Grotesk", sans-serif; + font-size: 2rem; + font-weight: 500; + line-height: 1.05; +} + +.landing-feature-card p { + margin: 0; + font-size: 0.95rem; + line-height: 1.6; +} + +.card-link { + display: inline-block; + margin-top: 20px; + color: var(--vp-c-brand-1); +} + +.landing-tools { + position: relative; + width: 100vw; + margin: 76px calc(50% - 50vw) 0; + padding: 28px 0; + overflow: hidden; + border-top: 1px solid var(--vp-c-divider); + border-bottom: 1px solid var(--vp-c-divider); + background: var(--vp-c-bg-soft); +} + +.landing-tools p { + margin: 0 0 14px; + text-align: center; + font-family: var(--vp-font-family-mono); + font-size: 0.68rem; + letter-spacing: 0.14em; + text-transform: uppercase; + color: var(--vp-c-text-3); +} + +.landing-tools-track { + display: flex; + gap: 42px; + width: max-content; + animation: landing-scroll 60s linear infinite; +} + +.landing-tools-track a { + white-space: nowrap; + font-family: "Cormorant Garamond", Georgia, serif; + font-style: italic; + font-size: 1.75rem; + font-weight: 300; + color: var(--vp-c-text-2); + text-decoration: none; +} + +@keyframes landing-scroll { + to { + transform: translateX(-50%); + } +} + +.landing-aube { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(220px, 0.42fr); + gap: 28px; + align-items: center; + margin: 48px auto 0; + padding: 28px; + border: 1px solid rgba(107, 127, 78, 0.35); + border-radius: 8px; + background: + linear-gradient(135deg, rgba(107, 127, 78, 0.12), transparent 44%), + var(--vp-c-bg-soft); + color: var(--vp-c-text-1); + text-decoration: none !important; + transition: + border-color 0.2s ease, + box-shadow 0.2s ease, + transform 0.2s ease; +} + +.landing-aube:hover { + border-color: var(--vp-c-brand-1); + transform: translateY(-2px); + box-shadow: 0 18px 44px -32px rgba(107, 127, 78, 0.55); +} + +.dark .landing-aube { + background: + linear-gradient(135deg, rgba(143, 168, 110, 0.14), transparent 48%), + var(--vp-c-bg-soft); + border-color: rgba(143, 168, 110, 0.35); +} + +.landing-aube h2 { + margin: 12px 0 0; + font-family: "Cormorant Garamond", Georgia, serif; + font-size: clamp(2.2rem, 4vw, 3.4rem); + font-style: italic; + font-weight: 300; + line-height: 1; + letter-spacing: 0; + color: var(--vp-c-brand-1); +} + +.landing-aube h2 em { + font-family: "Cormorant Garamond", Georgia, serif; + font-style: italic; + font-weight: 300; + color: inherit; +} + +.landing-aube p:not(.landing-kicker) { + max-width: 58ch; + margin: 16px 0 0; + color: var(--vp-c-text-2); +} + +.aube-ticket { + display: flex; + align-items: center; + width: 220px; + max-width: 100%; + min-height: 86px; + padding: 0 22px; + border: 1px dashed rgba(107, 127, 78, 0.5); + border-radius: 8px; + background: var(--vp-c-bg); +} + +.aube-ticket code { + font-family: var(--vp-font-family-mono); + font-size: 1.35rem; + line-height: 1; + background: transparent; + color: var(--vp-c-success-1); +} + +.landing-recipe-grid { + display: grid; + position: relative; + grid-template-columns: 260px minmax(0, 1fr); + overflow: hidden; + border: 1px solid var(--vp-c-divider); + border-radius: 8px; +} + +.landing-mini-install { + display: flex; + align-items: center; + min-height: 48px; + padding: 0 16px; + overflow: auto; + border: 1px solid var(--vp-c-divider); + border-radius: 8px; + background: var(--vp-c-bg); + color: var(--vp-c-text-1); + font-family: var(--vp-font-family-mono); + font-size: 0.88rem; +} + +.landing-quickstart { + display: grid; + grid-template-columns: 260px minmax(0, 1fr); + gap: 48px; +} + +.recipe-steps { + padding: 20px 0; + border-right: 1px solid var(--vp-c-divider); + background: var(--vp-c-bg-soft); +} + +.recipe-tab-input { + position: absolute; + opacity: 0; + pointer-events: none; +} + +.recipe-step { + display: flex; + gap: 12px; + align-items: center; + margin: 0; + padding: 14px 18px; + border-left: 2px solid transparent; + color: var(--vp-c-text-2); + cursor: pointer; + transition: + background-color 0.2s ease, + color 0.2s ease; +} + +.recipe-step:hover { + background: color-mix(in srgb, var(--vp-c-brand-1) 8%, transparent); + color: var(--vp-c-text-1); +} + +#recipe-tab-1:checked ~ .recipe-steps .recipe-step-1, +#recipe-tab-2:checked ~ .recipe-steps .recipe-step-2, +#recipe-tab-3:checked ~ .recipe-steps .recipe-step-3, +#recipe-tab-4:checked ~ .recipe-steps .recipe-step-4 { + border-left: 2px solid var(--vp-c-brand-1); + background: var(--vp-c-bg); + color: var(--vp-c-text-1); +} + +.recipe-steps span { + font-family: var(--vp-font-family-mono); + font-size: 0.72rem; + color: var(--vp-c-text-3); +} + +.recipe-panel { + display: none; + height: 100%; +} + +#recipe-tab-1:checked ~ .landing-code .recipe-panel-1, +#recipe-tab-2:checked ~ .landing-code .recipe-panel-2, +#recipe-tab-3:checked ~ .landing-code .recipe-panel-3, +#recipe-tab-4:checked ~ .landing-code .recipe-panel-4 { + display: block; +} + +.landing-code pre { + height: 100%; + min-height: 280px; + margin: 0; + padding: 24px; + overflow: auto; + border: 0; + border-radius: 0; + background: var(--vp-code-block-bg); + color: var(--vp-c-text-1); +} + +.landing-code code { + font-family: var(--vp-font-family-mono); + font-size: 0.88rem; + line-height: 1.8; +} + +.landing-cta { + padding: 64px 28px; + border: 1px solid var(--vp-c-divider); + border-radius: 8px; + background: + radial-gradient(600px 260px at 50% 0%, rgba(139, 34, 82, 0.14), transparent), + var(--vp-c-bg-soft); + text-align: center; +} + +.landing-cta h2 { + color: var(--vp-c-text-1); + font-family: "Roc Grotesk", sans-serif; + font-style: normal; + margin-bottom: 24px; +} + +.landing-cta h2 em { + color: var(--vp-c-brand-1); +} + +.landing-cta .landing-mini-install { + max-width: 460px; + margin: 0 auto; + justify-content: center; +} + +.landing-links { + display: flex; + flex-wrap: wrap; + gap: 10px; + justify-content: center; + margin-top: 22px; +} + +@media (max-width: 960px) { + .VPHero .main, + .landing-aube, + .landing-metaphor, + .landing-quickstart, + .landing-recipe-grid { + grid-template-columns: 1fr !important; + } + + .landing-feature-grid { + grid-template-columns: 1fr; + } + + .recipe-steps { + border-right: 0; + border-bottom: 1px solid var(--vp-c-divider); + } + + .landing-section-heading { + display: block; + } +} + +@media (max-width: 640px) { + .VPHero { + padding-top: 42px !important; + padding-bottom: 48px !important; + } + + .VPHero .container { + padding-right: 24px !important; + padding-left: 24px !important; + } + + .hero-copy h1 { + font-size: 2.75rem; + } + + .hero-lockup .chef-logo { + width: min(260px, 100%); + } + + .hero-copy p { + font-size: 1rem; + max-width: 30ch; + } + + .terminal-body { + font-size: 0.76rem; + } + + .landing-section { + margin-top: 54px; + } + + .landing-aube { + margin-top: 40px; + padding: 22px; + } + + .landing-metaphor { + padding-top: 48px; + } +} diff --git a/docs/index.md b/docs/index.md index dfeb647eaf..f265a1d376 100644 --- a/docs/index.md +++ b/docs/index.md @@ -5,28 +5,123 @@ title: Home hero: name: mise-en-place tagline: The front-end to your dev env - actions: - - theme: brand - text: Getting Started - link: /getting-started - - theme: alt - text: Demo - link: /demo - - theme: alt - text: About - link: /about - -features: - - title: Dev Tools - link: /dev-tools/ - icon: 🔪 - details: A polyglot tool version manager. Replaces asdf, nvm, pyenv, rbenv, and more — one tool for every language. - - title: Environments - details: Switch sets of environment variables per project directory. A smarter, simpler replacement for direnv. - icon: 🫕 - link: /environments/ - - title: Tasks - link: /tasks/ - details: A powerful task runner that replaces make and npm scripts. Define, compose, and run with ease. - icon: 🍳 --- + +
+
+
+

The Idea

+

Everything in its place, before you code.

+

+ In a professional kitchen, mise en place is the ritual of prep: + knives sharpened, onions diced, stock warm, station clean. The work + before the work. +

+

+ mise does the same for your dev env. It activates the right language + versions, loads the right env vars, and wires up the right tasks for + the commands you run. +

+
+
+
mise en place /meez ahn plahs/
+

1. the gathering and arrangement of ingredients and tools before cooking.

+

2. a polyglot tool that keeps your project tools, env, and tasks in one place.

+
+
+ +
+
+

The Menu

+

Three dishes, one kitchen.

+ All docs +
+ +
+ +
+

— pantry · 900+ tools, 1 toml file —

+ +
+ + +
+

Chef's Special

+

Meet aube, a fast Node.js package manager.

+

+ New from en.dev by @jdx. aube uses your existing lockfile and is ready + to try in beta. +

+
+ +
+ +
+
+

The Recipe

+

Four steps to a prepped station.

+
+
+ + + + +
+ + + + +
+
+
+
$ curl https://mise.run | sh
✓ mise installed

$ mise doctor
✓ mise is ready
+
+
+
$ mise use node@24 python@3.13 terraform@1
✓ wrote mise.toml

$ mise install
✓ installed 3 tools
+
+
+
$ cat .env.local
DATABASE_URL=postgres://localhost/orders

$ mise env -s bash
export DATABASE_URL=postgres://localhost/orders
+
+
+
$ mise run test
→ lint · typecheck · unit · e2e
✓ 4 tasks complete

$ mise run deploy
✓ shipped
+
+
+
+
+ +
+

Ready When You Are

+

Allez, prep your station.

+
curl https://mise.run | sh
+ +
+