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.
// 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
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.
[ EXPLORE_MOLINA ][ BOOK_A_CALL ]free, 30 minutes
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.
.png)