@@ -72,7 +72,7 @@ <h1 style="margin:26px 0 0;font-family:var(--sans);font-weight:800;letter-spacin
7272 </ div >
7373 </ section >
7474
75- < section id ="philosophy " style ="max-width:1080px ;margin:0 auto;padding:34px 28px 8px ">
75+ < section id ="philosophy " style ="max-width:1180px ;margin:0 auto;padding:34px 28px 8px ">
7676 < p style ="margin:0;font-family:var(--mono);font-size:13px;letter-spacing:1.5px;text-transform:uppercase;color:var(--accent) "> Why btravstack</ p >
7777 < h2 style ="margin:14px 0 0;font-weight:800;letter-spacing:-1px;line-height:1.08;font-size:clamp(28px,4vw,40px);max-width:680px "> Building blocks for the TypeScript backend.</ h2 >
7878 < p style ="margin:16px 0 0;max-width:640px;font-size:16.5px;line-height:1.65;color:var(--muted) "> Each package is small, focused and does one thing well — but they share a worldview: your interfaces are contracts, failure is part of the type, and the compiler should catch what tests can't.</ p >
@@ -114,13 +114,13 @@ <h2 style="margin:14px 0 30px;font-weight:800;letter-spacing:-1px;font-size:clam
114114 </ div >
115115 < h3 style ="margin:18px 0 0;font-weight:800;font-size:23px;letter-spacing:-0.6px;color:var(--text) "> amqp-contract</ h3 >
116116 < code style ="display:inline-block;margin:7px 0 0;font-family:var(--mono);font-size:13px;color:var(--accent) "> @amqp-contract/contract</ code >
117- < p style ="margin:14px 0 0;font-size:14.5px;line-height:1.6;color:var(--muted) "> Type-safe contracts for AMQP & RabbitMQ. Define your exchanges, queues and messages once — get types and runtime validation on both ends.</ p >
117+ < p style ="margin:14px 0 0;min-height:92px; font-size:14.5px;line-height:1.6;color:var(--muted) "> Type-safe contracts for AMQP & RabbitMQ. Define your exchanges, queues and messages once — get types and runtime validation on both ends.</ p >
118118 < ul style ="list-style:none;margin:18px 0 0;padding:0;display:flex;flex-direction:column;gap:9px ">
119119 < li style ="display:flex;align-items:flex-start;gap:9px;font-size:14px;line-height:1.4;color:var(--text) "> < svg width ="15 " height ="15 " viewBox ="0 0 16 16 " fill ="none " style ="margin-top:2px;flex:none "> < path d ="M2.5 8.5l3 3 8-8 " stroke ="#46B86C " stroke-width ="2.2 " stroke-linecap ="round " stroke-linejoin ="round "> </ path > </ svg > < span > End-to-end type safety</ span > </ li >
120120 < li style ="display:flex;align-items:flex-start;gap:9px;font-size:14px;line-height:1.4;color:var(--text) "> < svg width ="15 " height ="15 " viewBox ="0 0 16 16 " fill ="none " style ="margin-top:2px;flex:none "> < path d ="M2.5 8.5l3 3 8-8 " stroke ="#46B86C " stroke-width ="2.2 " stroke-linecap ="round " stroke-linejoin ="round "> </ path > </ svg > < span > Reliable retry with Dead Letter Queues</ span > </ li >
121121 < li style ="display:flex;align-items:flex-start;gap:9px;font-size:14px;line-height:1.4;color:var(--text) "> < svg width ="15 " height ="15 " viewBox ="0 0 16 16 " fill ="none " style ="margin-top:2px;flex:none "> < path d ="M2.5 8.5l3 3 8-8 " stroke ="#46B86C " stroke-width ="2.2 " stroke-linecap ="round " stroke-linejoin ="round "> </ path > </ svg > < span > AsyncAPI 3.0 generation</ span > </ li >
122122 </ ul >
123- < div class ="codeblk " data-copy ="pnpm add @amqp-contract/contract " title ="Click to copy " style ="margin-top:20px ;display:flex;align-items:center;justify-content:space-between;gap:10px;font-family:var(--mono);font-size:12.5px;background:rgba(0,0,0,0.35);border:1px solid var(--border);border-radius:11px;padding:11px 13px;color:var(--text) ">
123+ < div class ="codeblk " data-copy ="pnpm add @amqp-contract/contract " title ="Click to copy " style ="margin-top:auto ;display:flex;align-items:center;justify-content:space-between;gap:10px;font-family:var(--mono);font-size:12.5px;background:rgba(0,0,0,0.35);border:1px solid var(--border);border-radius:11px;padding:11px 13px;color:var(--text) ">
124124 < span style ="min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap "> < span style ="color:var(--accent);user-select:none "> $ </ span > pnpm add @amqp-contract/contract</ span >
125125 < svg width ="15 " height ="15 " viewBox ="0 0 16 16 " fill ="none " style ="flex:none;opacity:0.6 "> < rect x ="5.5 " y ="5.5 " width ="8 " height ="8 " rx ="1.5 " stroke ="currentColor " stroke-width ="1.4 "> </ rect > < path d ="M3.5 10.5h-1A1.5 1.5 0 0 1 1 9V2.5A1.5 1.5 0 0 1 2.5 1H9a1.5 1.5 0 0 1 1.5 1.5v1 " stroke ="currentColor " stroke-width ="1.4 "> </ path > </ svg >
126126 </ div >
@@ -145,13 +145,13 @@ <h3 style="margin:18px 0 0;font-weight:800;font-size:23px;letter-spacing:-0.6px;
145145 </ div >
146146 < h3 style ="margin:18px 0 0;font-weight:800;font-size:23px;letter-spacing:-0.6px;color:var(--text) "> temporal-contract</ h3 >
147147 < code style ="display:inline-block;margin:7px 0 0;font-family:var(--mono);font-size:13px;color:var(--accent) "> @temporal-contract/contract</ code >
148- < p style ="margin:14px 0 0;font-size:14.5px;line-height:1.6;color:var(--muted) "> Type-safe contracts for Temporal.io. End-to-end types and automatic validation across workflows, activities and clients.</ p >
148+ < p style ="margin:14px 0 0;min-height:92px; font-size:14.5px;line-height:1.6;color:var(--muted) "> Type-safe contracts for Temporal.io. End-to-end types and automatic validation across workflows, activities and clients.</ p >
149149 < ul style ="list-style:none;margin:18px 0 0;padding:0;display:flex;flex-direction:column;gap:9px ">
150150 < li style ="display:flex;align-items:flex-start;gap:9px;font-size:14px;line-height:1.4;color:var(--text) "> < svg width ="15 " height ="15 " viewBox ="0 0 16 16 " fill ="none " style ="margin-top:2px;flex:none "> < path d ="M2.5 8.5l3 3 8-8 " stroke ="#46B86C " stroke-width ="2.2 " stroke-linecap ="round " stroke-linejoin ="round "> </ path > </ svg > < span > Zod validation at every boundary</ span > </ li >
151151 < li style ="display:flex;align-items:flex-start;gap:9px;font-size:14px;line-height:1.4;color:var(--text) "> < svg width ="15 " height ="15 " viewBox ="0 0 16 16 " fill ="none " style ="margin-top:2px;flex:none "> < path d ="M2.5 8.5l3 3 8-8 " stroke ="#46B86C " stroke-width ="2.2 " stroke-linecap ="round " stroke-linejoin ="round "> </ path > </ svg > < span > Compile-time implementation checks</ span > </ li >
152152 < li style ="display:flex;align-items:flex-start;gap:9px;font-size:14px;line-height:1.4;color:var(--text) "> < svg width ="15 " height ="15 " viewBox ="0 0 16 16 " fill ="none " style ="margin-top:2px;flex:none "> < path d ="M2.5 8.5l3 3 8-8 " stroke ="#46B86C " stroke-width ="2.2 " stroke-linecap ="round " stroke-linejoin ="round "> </ path > </ svg > < span > Result / Future error handling</ span > </ li >
153153 </ ul >
154- < div class ="codeblk " data-copy ="pnpm add @temporal-contract/contract " title ="Click to copy " style ="margin-top:20px ;display:flex;align-items:center;justify-content:space-between;gap:10px;font-family:var(--mono);font-size:12.5px;background:rgba(0,0,0,0.35);border:1px solid var(--border);border-radius:11px;padding:11px 13px;color:var(--text) ">
154+ < div class ="codeblk " data-copy ="pnpm add @temporal-contract/contract " title ="Click to copy " style ="margin-top:auto ;display:flex;align-items:center;justify-content:space-between;gap:10px;font-family:var(--mono);font-size:12.5px;background:rgba(0,0,0,0.35);border:1px solid var(--border);border-radius:11px;padding:11px 13px;color:var(--text) ">
155155 < span style ="min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap "> < span style ="color:var(--accent);user-select:none "> $ </ span > pnpm add @temporal-contract/contract</ span >
156156 < svg width ="15 " height ="15 " viewBox ="0 0 16 16 " fill ="none " style ="flex:none;opacity:0.6 "> < rect x ="5.5 " y ="5.5 " width ="8 " height ="8 " rx ="1.5 " stroke ="currentColor " stroke-width ="1.4 "> </ rect > < path d ="M3.5 10.5h-1A1.5 1.5 0 0 1 1 9V2.5A1.5 1.5 0 0 1 2.5 1H9a1.5 1.5 0 0 1 1.5 1.5v1 " stroke ="currentColor " stroke-width ="1.4 "> </ path > </ svg >
157157 </ div >
@@ -176,13 +176,13 @@ <h3 style="margin:18px 0 0;font-weight:800;font-size:23px;letter-spacing:-0.6px;
176176 </ div >
177177 < h3 style ="margin:18px 0 0;font-weight:800;font-size:23px;letter-spacing:-0.6px;color:var(--text) "> unthrown</ h3 >
178178 < code style ="display:inline-block;margin:7px 0 0;font-family:var(--mono);font-size:13px;color:var(--accent) "> unthrown</ code >
179- < p style ="margin:14px 0 0;font-size:14.5px;line-height:1.6;color:var(--muted) "> Explicit errors as values — with a separate defect channel for the unexpected. Only a true defect ever throws, and only at unwrap.</ p >
179+ < p style ="margin:14px 0 0;min-height:92px; font-size:14.5px;line-height:1.6;color:var(--muted) "> Explicit errors as values — with a separate defect channel for the unexpected. Only a true defect ever throws, and only at unwrap.</ p >
180180 < ul style ="list-style:none;margin:18px 0 0;padding:0;display:flex;flex-direction:column;gap:9px ">
181181 < li style ="display:flex;align-items:flex-start;gap:9px;font-size:14px;line-height:1.4;color:var(--text) "> < svg width ="15 " height ="15 " viewBox ="0 0 16 16 " fill ="none " style ="margin-top:2px;flex:none "> < path d ="M2.5 8.5l3 3 8-8 " stroke ="#46B86C " stroke-width ="2.2 " stroke-linecap ="round " stroke-linejoin ="round "> </ path > </ svg > < span > Errors as values, typed in E</ span > </ li >
182182 < li style ="display:flex;align-items:flex-start;gap:9px;font-size:14px;line-height:1.4;color:var(--text) "> < svg width ="15 " height ="15 " viewBox ="0 0 16 16 " fill ="none " style ="margin-top:2px;flex:none "> < path d ="M2.5 8.5l3 3 8-8 " stroke ="#46B86C " stroke-width ="2.2 " stroke-linecap ="round " stroke-linejoin ="round "> </ path > </ svg > < span > A separate defect channel</ span > </ li >
183183 < li style ="display:flex;align-items:flex-start;gap:9px;font-size:14px;line-height:1.4;color:var(--text) "> < svg width ="15 " height ="15 " viewBox ="0 0 16 16 " fill ="none " style ="margin-top:2px;flex:none "> < path d ="M2.5 8.5l3 3 8-8 " stroke ="#46B86C " stroke-width ="2.2 " stroke-linecap ="round " stroke-linejoin ="round "> </ path > </ svg > < span > Zero runtime dependencies</ span > </ li >
184184 </ ul >
185- < div class ="codeblk " data-copy ="pnpm add unthrown " title ="Click to copy " style ="margin-top:20px ;display:flex;align-items:center;justify-content:space-between;gap:10px;font-family:var(--mono);font-size:12.5px;background:rgba(0,0,0,0.35);border:1px solid var(--border);border-radius:11px;padding:11px 13px;color:var(--text) ">
185+ < div class ="codeblk " data-copy ="pnpm add unthrown " title ="Click to copy " style ="margin-top:auto ;display:flex;align-items:center;justify-content:space-between;gap:10px;font-family:var(--mono);font-size:12.5px;background:rgba(0,0,0,0.35);border:1px solid var(--border);border-radius:11px;padding:11px 13px;color:var(--text) ">
186186 < span style ="min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap "> < span style ="color:var(--accent);user-select:none "> $ </ span > pnpm add unthrown</ span >
187187 < svg width ="15 " height ="15 " viewBox ="0 0 16 16 " fill ="none " style ="flex:none;opacity:0.6 "> < rect x ="5.5 " y ="5.5 " width ="8 " height ="8 " rx ="1.5 " stroke ="currentColor " stroke-width ="1.4 "> </ rect > < path d ="M3.5 10.5h-1A1.5 1.5 0 0 1 1 9V2.5A1.5 1.5 0 0 1 2.5 1H9a1.5 1.5 0 0 1 1.5 1.5v1 " stroke ="currentColor " stroke-width ="1.4 "> </ path > </ svg >
188188 </ div >
0 commit comments