Will Ehrendreich // Sagetech.dev

Building software that behaves the way it should.

I build with F#: types that make illegal states impossible to write, and a compiler that does the babysitting.

Also open for contract and full-time work.

Engineer.fsutf-8[unix]
// WillTheEngineer.fstype Employment = | Contract | FullTime | Bothlet careerState = Both   // currently lookinglet whatItMeans (state: Employment) =  match state with  | Contract -> "Bring me a scope. I'll bring the receipts."  | FullTime -> "Hiring? You get types and code that ships."  | Both     -> "Contract or full-time. Let's build something simple."type Language    = | CSharp | FSharptype WebBackend  = | Falco | MinimalApitype WebFrontend = | Datastar | SPAtype DataLayer   = | Marten | EfCorelet chooseWeb (lang, backend, frontend, data) =  match lang, backend, frontend, data with  | FSharp, Falco, Datastar, Marten ->    "This site. One project, pure core, " +    "the compiler as my safety net."  | CSharp, MinimalApi, SPA, EfCore ->    "Been there, done that. " +    "Let me show you a simpler way."let webStacks =  [ (FSharp, Falco, Datastar, Marten)    (CSharp, MinimalApi, SPA, EfCore) ]  |> List.map chooseWeblet frontend = function  | Datastar -> Ok "HTML over the wire. SSE. As intended."  | SPA      -> Error "Five MB of JS for a login form? I refuse."
// Engineer.fstype Employment =  | Contract  | FullTime  | Bothlet careerState = Both   // currently lookinglet whatItMeans (state: Employment) =  match state with  | Contract ->    "Bring me a scope. " +    "I'll bring the receipts."  | FullTime ->    "Hiring? You get types " +    "and code that ships."  | Both ->    "Contract or full-time. " +    "Let's build something simple."type Language =  | CSharp  | FSharptype WebBackend =  | Falco  | MinimalApitype WebFrontend =  | Datastar  | SPAtype DataLayer =  | Marten  | EfCorelet chooseWeb (lang, backend, frontend, data) =  match lang, backend, frontend, data with  | FSharp, Falco, Datastar, Marten ->    "This site. One project, pure core, " +    "the compiler as my safety net."  | CSharp, MinimalApi, SPA, EfCore ->    "Been there, done that. " +    "Let me show you a simpler way."let webStacks =  [ (FSharp, Falco, Datastar, Marten)    (CSharp, MinimalApi, SPA, EfCore) ]  |> List.map chooseWeblet frontend = function  | Datastar ->    Ok "HTML over the wire. SSE. As intended."  | SPA ->    Error "Five MB of JS for a login form? " +          "I refuse."
F#57L, 1174BLF1:1
A tree of light on a navy field, one gold path forking into blue, violet and red branches, beside the Molina name and the words: Molina finds behavior that's impossible to write tests for. It injects network loss, power cuts, thread races, data corruption and more, and records everything your software does, so the failure can be run again.

MOLINA

Molina runs your software in many small worlds and breaks each one differently: a disk that says saved before it is, a power cut, servers cut apart. When a promise breaks, you get a recording and a replay code.

Two things I built because of how I work: SageFS, a live F# REPL for your editor and your AI agents, and Molina, which finds behavior that's impossible to write tests for.

[BUFFERS: Latest Rants]

:ls all

newsletter.txt

100%
:SageTech --ready