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

Molina settles an argument about a failure with an experiment. I run your software through failures like these on my machine, install nothing on yours, and hand over a recording of what happened.

Two things I built because of how I work: SageFS, a live F# REPL for your editor and your AI agents, and Molina, a service that reproduces failures.

[BUFFERS: Latest Rants]

:ls all

newsletter.txt

100%
:SageTech --ready