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: There is more than one way the world could unfold. What happens when your software meets other possible worlds?

MOLINA

What happens when your software meets other possible worlds? A disk that says saved before it is, a power cut, servers cut apart: I build those circumstances on my machine and record what your software does in them.

Two things I built because of how I work: SageFS, a live F# REPL for your editor and your AI agents, and Molina, which shows what your software does when the world changes underneath it.

[BUFFERS: Latest Rants]

:ls all

newsletter.txt

100%
:SageTech --ready