A presentation at Berlin Functional Programming Group in in Berlin, Germany by Brooklyn Zelenka
✨ UNIVERSAL HOSTLESS S U B S T R AT E 🌖 🌑 F U L L S TA C K W E B A P P S W I T H O U T A B A C K E N D … A N D M O R E 🚀
A U N I V E R S A L H O S T L E S S S U B S T R AT E B R O O K LY N Z E L E N K A , @ e x p e d e
A U N I V E R S A L H O S T L E S S S U B S T R AT E B R O O K LY N Z E L E N K A , @ e x p e d e • Cofounder/CTO at Fission — https://fission.codes • Functional Programming • Founder of the Vancouver FP meetup • Mainly known in FP-land for Witchcraft • Fission is very much informed by FP mindset • Universality, orthogonality, properties, &c • PLT, VMs, Distributed Systems • Previously an Ethereum Core Dev • Spending a lot of time with IPFS, ECC, CRDTs, & Bloom Clocks
A U N I V E R S A L H O S T L E S S S U B S T R AT E W H AT W E ’ R E C O V E R I N G
A U N I V E R S A L H O S T L E S S S U B S T R AT E W H AT W E ’ R E C O V E R I N G • Content addressing • Global file system • User-controlled auth • Portable compute
A U N I V E R S A L H O S T L E S S S U B S T R AT E S TA C K
A U N I V E R S A L H O S T L E S S S U B S T R AT E S TA C K • Server — Haskell (servant-server) • CLI — Haskell (servant-client) • Fission Drive (web file explorer) — Elm • Browser-based Authorization — Elm • Browser SDK — TypeScript • IPFS Responsive Image Resizer — Rust (native & wasm)
W E H AV E S T I C K E R S !
W E H AV E S T I C K E R S ! PING ME AND WE’LL MAIL SOME
SOME BACKGROUND CONTEXT
SOME BACKGROUND CONTEXT W H AT S E T O F P R O B L E M S I S F I S S I O N S O LV I N G ?
BACKGROUND CONTEXT S H I P P I N G A W E B A P P I N 2 0 2 0 I S TO O H A R D ! Backends DevOps • Multi-tenant • Expensive & complex • Increasingly sharded • Very much its specialty • Highly concurrent • We’re close to peak Kubernetes • Data leaks everywhere 😱 • ACL complexity & GDPR
BACKGROUND CONTEXT S H I P P I N G A W E B A P P I N 2 0 2 0 I S TO O H A R D ! Backends DevOps • Multi-tenant • Expensive & complex • Increasingly sharded • Very much its specialty • Highly concurrent • We’re close to peak Kubernetes • Data leaks everywhere 😱 • ACL complexity & GDPR
BACKGROUND CONTEXT F R O N T E N D I S E AT I N G T H E B A C K E N D 🍔 😋 • Frontend is never going away • Browsers keep getting more powerful (e.g. WebAssembly, WebAuthN, WebCrypto) • Trend to more granular/edge (Cloudflare Workers or Fastly Edge Cloud) • Empower front end devs / full stack web apps for the 20’s and beyond 🚀 LAMP C O N TA I N E R S SERVERLESS W E B N AT I V E ☁ 🌐 λ
BACKGROUND CONTEXT CONSTRAINTS
BACKGROUND CONTEXT CONSTRAINTS • Everything for a modern web app directly in the browser • Vanilla browsers only — no plug-ins • As secure or better than traditional cloud infra • Equal or easier UX • Users fully control their data • Apps must work both offline and networked • Infrastructure agnostic — “local is the same as prod”
BACKGROUND CONTEXT CONSTRAINTS • Everything for a modern web app directly in the browser • Vanilla browsers only — no plug-ins • As secure or better than traditional cloud infra • Equal or easier UX • Users fully control their data • Apps must work both offline and networked • Infrastructure agnostic — “local is the same as prod”
BACKGROUND CONTEXT W E H AV E S O M E N E W B U I L D I N G B L O C K S ! • Start thinking “universally” • WebCrypto API • Self-sovereign identity / DID • Content addressing • Macaroons & SPKI auth • CRDTs (Disclaimer: taken care of under the hood, but interoperable) • Immutable (functional) data structures at web scale!
BACKGROUND CONTEXT W E H AV E S O M E N E W B U I L D I N G B L O C K S ! • Start thinking “universally” • WebCrypto API • Self-sovereign identity / DID • Content addressing • Macaroons & SPKI auth • CRDTs (Disclaimer: taken care of under the hood, but interoperable) • Immutable (functional) data structures at web scale!
BACKGROUND CONTEXT “ W E B N AT I V E ” + COMPUTE IDENTITY STORAGE 🔨 Build web apps more like native mobile & desktop 🛂 Password-less login, end-to-end encryption, secure by default 💽 Local-first, secure, user controlled, global file & hosting platform
BACKGROUND CONTEXT U P S H OT ?
BACKGROUND CONTEXT U P S H OT ? • Go from zero to production on a plane ✈ • Move data to compute and vice versa 🔄 • Scale sub-linearly 📈 • Serve areas that lack sufficient cloud hardware 🖥 • Anyone can be a service provider (lower bar to entry) 💁💁
CONTENT ADDRESSING
CONTENT ADDRESSING 🕸 M E E T T H E I N T E R P L A N E TA R Y F I L E S Y S T E M 👋
CONTENT ADDRESSING I N T E R P L A N E TA R Y F I L E S Y S T E M
CONTENT ADDRESSING I N T E R P L A N E TA R Y F I L E S Y S T E M
CONTENT ADDRESSING I N T E R P L A N E TA R Y F I L E S Y S T E M
CONTENT ADDRESSING I N T E R P L A N E TA R Y F I L E S Y S T E M
CONTENT ADDRESSING L O C AT I O N A D D R E S S I N G
CONTENT ADDRESSING L O C AT I O N A D D R E S S I N G • Predominantly single-source (per file) server/client
CONTENT ADDRESSING L O C AT I O N A D D R E S S I N G • Predominantly single-source (per file) server/client • Like a key/value store {ip => {path => content}}
CONTENT ADDRESSING L O C AT I O N A D D R E S S I N G • Predominantly single-source (per file) server/client • Like a key/value store {ip => {path => content}} • “Location addressing” • DNS maps names to IP addresses • Focused on the physical network VIRTUAL ADDRESS P H Y S I C A L L O C AT I O N
CONTENT ADDRESSING L O C AT I O N A D D R E S S I N G • Predominantly single-source (per file) server/client • Like a key/value store {ip => {path => content}} • “Location addressing” • DNS maps names to IP addresses • Focused on the physical network • Mutable addressing • www.foo.com/baz may be JSON today, but a video tomorrow • …or altered content VIRTUAL ADDRESS P H Y S I C A L L O C AT I O N
CONTENT ADDRESSING CONTENT IDS VIRTUAL ADDRESS P H Y S I C A L L O C AT I O N
CONTENT ADDRESSING CONTENT IDS • A layer of abstraction above location CONTENT ID VIRTUAL ADDRESS P H Y S I C A L L O C AT I O N
CONTENT ADDRESSING CONTENT IDS • A layer of abstraction above location • Like a key/value store {hash(content) => content} CONTENT ID • Content hash AKA “content identifier” or CID • Special “universal” relationship to content VIRTUAL ADDRESS P H Y S I C A L L O C AT I O N
CONTENT ADDRESSING CONTENT IDS • A layer of abstraction above location • Like a key/value store {hash(content) => content} CONTENT ID • Content hash AKA “content identifier” or CID • Special “universal” relationship to content VIRTUAL ADDRESS • Focused on the data P H Y S I C A L L O C AT I O N
CONTENT ADDRESSING CONTENT IDS • A layer of abstraction above location • Like a key/value store {hash(content) => content} CONTENT ID • Content hash AKA “content identifier” or CID • Special “universal” relationship to content VIRTUAL ADDRESS • Focused on the data • Does not care where it lives P H Y S I C A L L O C AT I O N
CONTENT ADDRESSING CONTENT IDS • A layer of abstraction above location • Like a key/value store {hash(content) => content} CONTENT ID • Content hash AKA “content identifier” or CID • Special “universal” relationship to content VIRTUAL ADDRESS • Focused on the data • Does not care where it lives • Still have paths • Immutable DAG • Why no loops? P H Y S I C A L L O C AT I O N
CONTENT ADDRESSING L I N K E D D ATA
CONTENT ADDRESSING L I N K E D D ATA { Qm123456…: { data: “Hello world”, links: [ {name: “company”, hash: Qmabcdef…} {name: “license”, hash: Qmzyxwvu…} ] } }
CONTENT ADDRESSING L I N K E D D ATA { { Qm123456…: { data: “Hello world”, links: [ {name: “company”, hash: Qmabcdef…} {name: “license”, hash: Qmzyxwvu…} ] } } Qmabcdef…: { data: “FISSION”, links: [ {name: “city”, hash: Qm1gb5sn…}, {name: “about”, hash: Qmzyxwvu…} ] } }
CONTENT ADDRESSING L I N K E D D ATA { { Qm123456…: { data: “Hello world”, links: [ {name: “company”, hash: Qmabcdef…} {name: “license”, hash: Qmzyxwvu…} ] } } Qmabcdef…: { data: “FISSION”, links: [ {name: “city”, hash: Qm1gb5sn…}, {name: “about”, hash: Qmzyxwvu…} ] } } ipfs cat /ipfs/Qm123456…/company/about/founder => “Brooke”
CONTENT ADDRESSING RO U T I N G & LO O KU P 🔍🌊
CONTENT ADDRESSING RO U T I N G & LO O KU P 🔍🌊 💁
CONTENT ADDRESSING RO U T I N G & LO O KU P 🔍🌊 💁
CONTENT ADDRESSING RO U T I N G & LO O KU P 🔍🌊 💁
CONTENT ADDRESSING RO U T I N G & LO O KU P 🔍🌊 💻 💻 ☕ 💻 💁
CONTENT ADDRESSING RO U T I N G & LO O KU P 🔍🌊 💻 💻 ☕ 💻 💁
CONTENT ADDRESSING RO U T I N G & LO O KU P 🔍🌊 💻 💻 💻 💻 💻 ☕ 💻 💻 💁 💻 💻 💻 💻 💻
CONTENT ADDRESSING RO U T I N G & LO O KU P 🔍🌊 💻 💻 💻 💻 💻 ☕ 💻 💻 💁 💻 💻 💻 💻 💻
CONTENT ADDRESSING RO U T I N G & LO O KU P 🔍🌊 💻 💻 💻 💻 💻 ☕ 💻 💻 💁 💻 💻 💻 💻 💻
CONTENT ADDRESSING RO U T I N G & LO O KU P 🔍🌊 💻 💻 💻 💻 💻 ☕ 💻 💻 💁 💻 💻 💻 💻 💻
CONTENT ADDRESSING RO U T I N G & LO O KU P 🔍🌊 💻 💻 💁 💻
CONTENT ADDRESSING RO U T I N G & LO O KU P 🔍🌊 💻 💻 💁 💻
CONTENT ADDRESSING O N E H U G E N A M E S PA C E T O R U L E T H E M A L L 💍 🌋
CONTENT ADDRESSING O N E H U G E N A M E S PA C E T O R U L E T H E M A L L 💍 🌋 • Same file = same hash • Zero file duplication per node • No matter when 🕓 • Replication = CDN-ish features • No matter where 🌍🌌 • Immutable data structures • No matter who 👩🔧🤖👩🚀👨🎤🦊 • Structural sharing = dedup blocks • Files & data living together! • Automerge, OrbitDB, &c
CONTENT ADDRESSING FISSION FILE SYSTEM
CONTENT ADDRESSING FISSION FILE SYSTEM • Unix file system interface
CONTENT ADDRESSING FISSION FILE SYSTEM • Unix file system interface • Same files across apps (think native apps instead of trad. web apps)
CONTENT ADDRESSING FISSION FILE SYSTEM • Unix file system interface • Same files across apps (think native apps instead of trad. web apps) • Fully immutable, temporal data structure • Peek & rollback (like Apple Time Machine for the web)
CONTENT ADDRESSING FISSION FILE SYSTEM • Unix file system interface • Same files across apps (think native apps instead of trad. web apps) • Fully immutable, temporal data structure • Peek & rollback (like Apple Time Machine for the web) • Event-sourced file system (apps can consume stream)
CONTENT ADDRESSING D R I V E — “ F U L LY U S E R C O N T R O L L E D D R O P B O X ” https://drive.fission.codes
UCAN
UCAN 🔑 C L I E N T- S I D E A U T H N & A U T H Z 👩🎤
STEP ONE U S E R I D S W I T H O U T A D ATA B A S E
U S E R I D S W I T H O U T A D ATA B A S E S TA N D A R D I Z AT I O N 🏢
U S E R I D S W I T H O U T A D ATA B A S E S TA N D A R D I Z AT I O N 🏢 • W3C, Microsoft, BC, etc • For users, devices, and more • Based on public-key cryptography • Truly “universal” UUIDs • Agnostic about backing
U S E R I D S W I T H O U T A D ATA B A S E S E L F - S O V E R E I G N I D E N T I T Y ( S S I ) 🔑 👩🎤
U S E R I D S W I T H O U T A D ATA B A S E S E L F - S O V E R E I G N I D E N T I T Y ( S S I ) 🔑 👩🎤 • Generate your own globally-unique, verifiable user ID!
U S E R I D S W I T H O U T A D ATA B A S E S E L F - S O V E R E I G N I D E N T I T Y ( S S I ) 🔑 👩🎤 • Generate your own globally-unique, verifiable user ID! • As many as you like 🤷
U S E R I D S W I T H O U T A D ATA B A S E S E L F - S O V E R E I G N I D E N T I T Y ( S S I ) 🔑 👩🎤 • Generate your own globally-unique, verifiable user ID! • As many as you like 🤷 • Many methods — we’re starting with did:key
U S E R I D S W I T H O U T A D ATA B A S E S E L F - S O V E R E I G N I D E N T I T Y ( S S I ) 🔑 👩🎤 • Generate your own globally-unique, verifiable user ID! • As many as you like 🤷 • Many methods — we’re starting with did:key • Not super readable, so publicize over DNS TXT record _did.USERNAME.fission.name
U S E R I D S W I T H O U T A D ATA B A S E S E L F - S O V E R E I G N I D E N T I T Y ( S S I ) 🔑 👩🎤 • Generate your own globally-unique, verifiable user ID! • As many as you like 🤷 • Many methods — we’re starting with did:key • Not super readable, so publicize over DNS TXT record _did.USERNAME.fission.name did:key:zBR4m3DNZHT1G8Nb2RHzgKK7TrWxEmJjZskgvFdncTthzUHzngyNKmKx4VKWEJE6sk4SE4Ka3kH92MxU2YC7CcePHy77GzZy8 Ed25519 — AAAAC3NzaC1lZDI1NTE5AAAAIB7/gFUQ9llI1BTrEjW7Jq6fX6JLsK1J4wXK/dn9JMcO
STEP TWO DISTRIBUTED READ CONTROL
DISTRIBUTED READ CONTROL OCAP / READ KEYS
DISTRIBUTED READ CONTROL OCAP / READ KEYS • ACLs • “Reactive access control” • Authority by association
DISTRIBUTED READ CONTROL OCAP / READ KEYS • ACLs • “Reactive access control” • Authority by association • OCAP • “Proactive” access control • Authority by possession • “You either have the key, or you don’t”
DISTRIBUTED READ CONTROL OCAP / READ KEYS • ACLs • “Reactive access control” • Authority by association • OCAP • “Proactive” access control • Authority by possession • “You either have the key, or you don’t” • “Just” normal AES-256 keys
DISTRIBUTED READ CONTROL MORE GRANULAR ACCESS: CRYPTREES 🔐🌳
DISTRIBUTED READ CONTROL MORE GRANULAR ACCESS: CRYPTREES 🔐🌳 • Public keys playing double duty: IDs and secure key exchange!
DISTRIBUTED READ CONTROL MORE GRANULAR ACCESS: CRYPTREES 🔐🌳 • Public keys playing double duty: IDs and secure key exchange! • Encrypt the encryption with more encryption • Each layer (file or dir) is encrypted with a key • Dirs contain keys for each sub dir / file • Recurse!
DISTRIBUTED READ CONTROL MORE GRANULAR ACCESS: CRYPTREES 🔐🌳 • Public keys playing double duty: IDs and secure key exchange! • Encrypt the encryption with more encryption • Each layer (file or dir) is encrypted with a key • Dirs contain keys for each sub dir / file • Recurse! root
DISTRIBUTED READ CONTROL MORE GRANULAR ACCESS: CRYPTREES 🔐🌳 • Public keys playing double duty: IDs and secure key exchange! • Encrypt the encryption with more encryption root • Each layer (file or dir) is encrypted with a key • Dirs contain keys for each sub dir / file • Recurse! 🔑 🔑
DISTRIBUTED READ CONTROL MORE GRANULAR ACCESS: CRYPTREES 🔐🌳 • Public keys playing double duty: IDs and secure key exchange! • Encrypt the encryption with more encryption root • Each layer (file or dir) is encrypted with a key • Dirs contain keys for each sub dir / file • Recurse! • Access granted to a directory and below • i.e. Same UX Dropbox/Google Drive • Full user controlled 🔑 🔑
DISTRIBUTED READ CONTROL MORE GRANULAR ACCESS: CRYPTREES 🔐🌳 • Public keys playing double duty: IDs and secure key exchange! • Encrypt the encryption with more encryption root • Each layer (file or dir) is encrypted with a key • Dirs contain keys for each sub dir / file • Recurse! • Access granted to a directory and below • i.e. Same UX Dropbox/Google Drive • Full user controlled • Revocation = key rotation & DH exchange 🔑 🔑
STEP THREE D E L E G AT E D W R I T E A C C E S S
D E L E G AT E D W R I T E A C C E S S S I D E - BY-S I D E
D E L E G AT E D W R I T E A C C E S S S I D E - BY-S I D E Now can also be: • Another device (same human) • A user’s peer (different human) • Some service
D E L E G AT E D W R I T E A C C E S S U C A N : U S E R C O N T R O L L E D A U T H O R I Z AT I O N N E T W O R K 🦜 Delegate 3 Delegate 2 Delegate 1 Root Proof • Solves for user-centrism • Decentralized delegation • Attenuation • Shrink size with CIDs • Assumes PKI
D E L E G AT E D W R I T E A C C E S S E A C H L AY E R F O L L O W S T H I S F O R M { “alg”: “RS256”, “typ”: “JWT“, “cty”: “JWT“ } { “iss”:“did:key:z1MdJPaWBebKxtE33AszRWYTF67wCLeFdcsqc3R87hyLKzBK…”, “aud”:“did:key:zBR4m3DNZHT1G8Nb2RHzgKK7TrWxEmJjZskgvFdncTthzUH…”, “scp”:“/public/photos/covid2020/”, “pty”:”APPEND_ONLY”, “prf”:<JWT PROOF>, “exp”:1589423547 } <SIGNATURE>
D E L E G AT E D W R I T E A C C E S S E A C H L AY E R F O L L O W S T H I S F O R M { “alg”: “RS256”, “typ”: “JWT“, “cty”: “JWT“ } { “iss”:“did:key:z1MdJPaWBebKxtE33AszRWYTF67wCLeFdcsqc3R87hyLKzBK…”, “aud”:“did:key:zBR4m3DNZHT1G8Nb2RHzgKK7TrWxEmJjZskgvFdncTthzUH…”, “scp”:“/public/photos/covid2020/”, “pty”:”APPEND_ONLY”, “prf”:<JWT PROOF>, “exp”:1589423547 } <SIGNATURE>
D E L E G AT E D W R I T E A C C E S S E A C H L AY E R F O L L O W S T H I S F O R M { “alg”: “RS256”, “typ”: “JWT“, “cty”: “JWT“ } { “iss”:“did:key:z1MdJPaWBebKxtE33AszRWYTF67wCLeFdcsqc3R87hyLKzBK…”, “aud”:“did:key:zBR4m3DNZHT1G8Nb2RHzgKK7TrWxEmJjZskgvFdncTthzUH…”, “scp”:“/public/photos/covid2020/”, “pty”:”APPEND_ONLY”, “prf”:<JWT PROOF>, “exp”:1589423547 } <SIGNATURE>
D E L E G AT E D W R I T E A C C E S S E A C H L AY E R F O L L O W S T H I S F O R M { “alg”: “RS256”, “typ”: “JWT“, “cty”: “JWT“ } { “iss”:“did:key:z1MdJPaWBebKxtE33AszRWYTF67wCLeFdcsqc3R87hyLKzBK…”, “aud”:“did:key:zBR4m3DNZHT1G8Nb2RHzgKK7TrWxEmJjZskgvFdncTthzUH…”, “scp”:“/public/photos/covid2020/”, “pty”:”APPEND_ONLY”, “prf”:<JWT PROOF>, Recursive “exp”:1589423547 } <SIGNATURE> Problem: gets pretty big
D E L E G AT E D W R I T E A C C E S S HASHING IT DOWN ⬛◼◾▪ { “alg”: “RS256”, “typ”: “JWT“, “cty”: “JWT“ } { “iss”:“did:key:z1MdJPaWBebKxtE33AszRWYTF67wCLeFdcsqc3R87hyLKzBK…”, “aud”:“did:key:zBR4m3DNZHT1G8Nb2RHzgKK7TrWxEmJjZskgvFdncTthzUH…”, “scp”:“/public/photos/covid2020/”, “pty”:”APPEND_ONLY”, “prf”:”QmaEmBULputJ5sAJX4bRQYwwWV2DUPnwNSz2R2eTvHV4DT”, “exp”:1589423547 } <SIGNATURE>
D E L E G AT E D W R I T E A C C E S S HASHING IT DOWN ⬛◼◾▪ { “alg”: “RS256”, “typ”: “JWT“, “cty”: “JWT“ } { “iss”:“did:key:z1MdJPaWBebKxtE33AszRWYTF67wCLeFdcsqc3R87hyLKzBK…”, “aud”:“did:key:zBR4m3DNZHT1G8Nb2RHzgKK7TrWxEmJjZskgvFdncTthzUH…”, “scp”:“/public/photos/covid2020/”, “pty”:”APPEND_ONLY”, “prf”:”QmaEmBULputJ5sAJX4bRQYwwWV2DUPnwNSz2R2eTvHV4DT”, “exp”:1589423547 } <SIGNATURE>
P O R TA B L E C O M P U T E
P O R TA B L E C O M P U T E ⚡ A D D M O R E P O W E R TO J S & WAS M A N D ST I R 🤖
P O R TA B L E C O M P U T E D Y N A M I C FA A S
P O R TA B L E C O M P U T E D Y N A M I C FA A S • Run everything locally by default • Good for devs with powerful machines • Slow for students with Chromebooks
P O R TA B L E C O M P U T E D Y N A M I C FA A S • Run everything locally by default • Good for devs with powerful machines • Slow for students with Chromebooks • Farm out longer running computation to service providers • …dynamically at runtime
P O R TA B L E C O M P U T E D Y N A M I C FA A S • Run everything locally by default • Good for devs with powerful machines • Slow for students with Chromebooks • Farm out longer running computation to service providers • …dynamically at runtime • Heavy compute, parallel workloads, &c
P O R TA B L E C O M P U T E APPROACH & TRADE-OFFS
P O R TA B L E C O M P U T E APPROACH & TRADE-OFFS • Code-as-data • Memoization • Compiler techniques at web scale (“world computer”) • Network latency (normally zero, now x) • Restricted subset (e.g. total) • Event-based w/ two-phase commit • Trusted (incl. AWS Lambda 🤷)
P O R TA B L E C O M P U T E T O TA L I T Y
P O R TA B L E C O M P U T E T O TA L I T Y Side Effects Pure Functions 👩💻
P O R TA B L E C O M P U T E T O TA L I T Y Side Effects Pure Functions 👩💻
P O R TA B L E C O M P U T E T O TA L I T Y Side Effects Pure Functions 👩💻
P O R TA B L E C O M P U T E E V E N T B AS E D ( A B ST R ACT U S E R ST R E A M, C R DTS )
P O R TA B L E C O M P U T E E V E N T B AS E D ( A B ST R ACT U S E R ST R E A M, C R DTS ) Off-Platform Side Effect Stream Platform Effect Stream Pure Function Stream Base Event Stream
P O R TA B L E C O M P U T E E V E N T B AS E D ( A B ST R ACT U S E R ST R E A M, C R DTS ) Off-Platform Side Effect Stream Platform Effect Stream Pure Function Stream Base Event Stream
P O R TA B L E C O M P U T E E V E N T B AS E D ( A B ST R ACT U S E R ST R E A M, C R DTS ) Off-Platform Side Effect Stream Platform Effect Stream Pure Function Stream Base Event Stream
P O R TA B L E C O M P U T E E V E N T B AS E D ( A B ST R ACT U S E R ST R E A M, C R DTS ) Off-Platform Side Effect Stream Platform Effect Stream Pure Function Stream Base Event Stream
P O R TA B L E C O M P U T E E V E N T B AS E D ( A B ST R ACT U S E R ST R E A M, C R DTS ) Off-Platform Side Effect Stream Platform Effect Stream Pure Function Stream Base Event Stream
P O R TA B L E C O M P U T E E V E N T B AS E D ( A B ST R ACT U S E R ST R E A M, C R DTS ) Off-Platform Side Effect Stream Platform Effect Stream Pure Function Stream Base Event Stream
P O R TA B L E C O M P U T E E V E N T B AS E D ( A B ST R ACT U S E R ST R E A M, C R DTS ) Off-Platform Side Effect Stream Platform Effect Stream Pure Function Stream Base Event Stream
A U N I V E R S A L H O S T L E S S S U B S T R AT E RECAP
A U N I V E R S A L H O S T L E S S S U B S T R AT E RECAP • Build and use fully locally • No such thing as “deployment” • Zero config • Default: only serve the app, not data • Efficient bandwidth
A U N I V E R S A L H O S T L E S S S U B S T R AT E RECAP • One identity for all services • Build and use fully locally • Flexible client-side auth • No such thing as “deployment” • Military-grade security • Zero config • User owned data • Default: only serve the app, not data • Share nothing with site/app by default • Efficient bandwidth • Flexible FaaS without pre-deployment • Offline-first and local-network aware
https://fission.codes https://talk .fission.codes h t t p s : / /d i s c o r d . g g / z A Q B D E q 🇩🇪 T H A N K Y O U , B E R L I N F P 🎉 brooklyn@fission.codes g i t h u b . c o m /e x p e d e @expede
https://fission.codes https://talk .fission.codes h t t p s : / /d i s c o r d . g g / z A Q B D E q 🇩🇪 T H A N K Y O U , B E R L I N F P 🎉 brooklyn@fission.codes g i t h u b . c o m /e x p e d e @expede
The last 60 years have seen the rise and fall of several models of computing: mainframes, private server, shared hosting, containers, and serverless (to name a few). We have one final phase left: “hostless” or universal apps. By leveraging technologies like secure multiparty compute, the content-addressable web, and the rise of Wasm, we are seeing the beginnings of a future liberated from specialized providers, acting on a distributed substrate of storage and compute. With all this in place, users fully control their own data (and it never touches your servers), deployment is as simple as setting a flag on your local environment, and developers maintain zero infrastructure. Come learn about what is being built today for the next wave of computing, how we evolve past the serverless paradigm, and how it can make life simpler for developers and end users!