# Voboda
- 
## **Salvor Voboda**
I like making new things with cryptography.
- [email](mailto:voboda@voboda.com)
- [blog](http://blog.voboda.com/)
- [bluesky](https://bsky.app/profile/voboda.com)
Come play [One Line For Your Mind](https://onelineforyourmind.com), solve [Lost In Transaction](https://paragraph.xyz/@infinite/lost-in-transaction), or join us at [The Infinite Build](https://infinite.build).
## Apps
- ### One Line For Your Mind
A game [inspired by koan study](https://blog.voboda.com/the-anti-app/). Access your innate enlightenment.
- [Play](https://onelineforyourmind.com)
- ### Voice Rip
Private, local, in-browser voice notes
(still alpha!)
- [Speak](http://app.voice.rip)
## Cryptography & Privacy Explorations
- ### HDK Sessions
Tamper-proof sessions without cookies or server storage, using HD keys for client-custodied state.
[code](https://gitlab.com/voboda/hdk-sessions) / [demo](https://onelineforyourmind.com/) / [design.md](https://gitlab.com/voboda/hdk-sessions/-/blob/main/DESIGN.md?ref_type=heads&plain=1)
- ### Serverfull
Get git-deploy automation with your own server.
[code](https://github.com/voboda/serverfull/)
- ### zKal
A community calendar that respects everyone's privacy.
[](https://ethberlin.org)
[code](https://github.com/voboda/zKal) / [demo](https://poc.dev.zkal.voboda.com/) / [design](https://blog.voboda.com/proof-projectors) / [origin story](https://blog.voboda.com/the-third-floor-at-ethberlin/)
<span data-shield="ethBerlin" data-shield-gold></span>
- ### Fission
Non-antoganistic forking protocol. Spin out funded DAOs from minority-backed proposals.
[code](https://gitlab.com/infinite-build/fission)
- ### Fusion
Self-select your breakout group friends -- privately using MPC
[code](https://gitlab.com/infinite-build/fusion)
- ### Ephemerant
A Gibson-inspired system for anonymous communities with zero-knowledge tech.
[](https://minaprotocol.com)
[v1 code](https://github.com/voboda/ephemerant) / [v2 exploration](https://blog.voboda.com/meeting-where-ai-eyes-cant-follow/)
- 
## Play & learn
- ### The Immutalists
Learn cryptography through a quest game about DeFi history.
- [Start](https://immutalists.infinite.build/)
- ### Humanity’s Hidden Path
Making cryptography's math accessible and showing how it shapes society.
- [Start](https://atlas.infinite.build/compendium)
## Stories
- [Lost In Transaction](https://paragraph.xyz/@infinite/lost-in-transaction)
Who are the guilty behind crypto scams?
[Cleave](https://notes.infinite.build/s/Mwd_K26dT)
Losing ourselves and losing each other
- 
## Community
- ### The Infinite Build
A peer-support group for builders.
Philosophy: let everyone [choose their own adventure](https://blog.voboda.com/healthy-forks/), focus on [connection over containment](https://blog.voboda.com/node-connector-perspective/), build a culture of [response](https://blog.voboda.com/contributor-churn/).
- [Join us](https://infinite.build)
- ### Chaos Communication Congress
At [CCC](https://events.ccc.de/congress/), I help out at [Critical Decentralisation Cluster](https://decentral.community) and run [microlab](https://notes.infinite.build/s/UhHIMe9-t), problem-solving group sessions for FOSS projects.
- ### Social Distorti0n Protocol
Joined these time-travelling activists, who make technical [treasure hunt games](https://github.com/social-dist0rtion-protocol) for DevCon, CCC and ethBerlin.
- ### Minacon
I organised an unconferences where [60 builders unraveled the L1s most persistent knots](http://minaprotocol.com/blog/minacon-an-inflection-point).
The rallying call: [We are the preimage of a post-zk world.](https://notes.infinite.build/5EnkSX9jTQeuz42_JscxDA) The playbook: [Musters](https://notes.infinite.build/bLwmyb4kRvWmaIKSbeuolg)
o1 Labs wrote [a follow-up](https://www.o1labs.org/blog/minacon-2024-recap) and I describe some outcomes [here](https://blog.voboda.com/healthy-forks/).
## [Get an email when I make something new 📨](https://n8n.infinite.build/form/7367a63d-de01-4e12-a45a-a83115beab99)
<img src="https://voboda.goatcounter.com/count?p=/">
<style>
/*
HedgeDoc reset
Purpose: neutralize HedgeDoc / github-markdown presentation without breaking editor layout.
Scope: preview/rendered markdown only.
*/
:root {
--hd-page-pad-x: clamp(18px, 2.2vw, 28px);
--hd-page-pad-y: clamp(28px, 4vw, 56px);
--hd-flow-space: 1rem;
--hd-list-space: 0.5rem;
}
html {
box-sizing: border-box;
-webkit-text-size-adjust: 100%;
text-size-adjust: 100%;
}
*,
*::before,
*::after {
box-sizing: inherit;
}
html,
body {
margin: 0;
min-height: 100%;
width: 100%;
max-width: none !important;
}
body {
line-height: 1.5;
}
body > .container,
body > .container-fluid {
width: 100% !important;
max-width: none !important;
margin: 0 !important;
padding: 0 !important;
}
img,
picture,
svg,
canvas,
video,
iframe {
display: block;
max-width: 100%;
}
img {
height: auto;
border-style: none;
}
a {
color: inherit;
text-decoration-thickness: 0.08em;
text-underline-offset: 0.16em;
}
button,
input,
textarea,
select {
font: inherit;
}
pre,
code,
kbd,
samp {
font: inherit;
}
hr {
height: 0;
border: 0;
}
/* HedgeDoc chrome that is safe to hide in both view and edit */
#ui-toc-affix,
.ui-infobar,
.ui-toc,
.ui-affix-toc,
.ui-new-note,
.ui-extra-help {
display: none !important;
}
/* Do not touch split-pane/editor sizing. Only neutralize preview wrappers. */
.ui-view-area,
.ui-view-mode,
.ui-view-container {
background: transparent !important;
border: 0 !important;
box-shadow: none !important;
}
/* Full-width in view mode. */
body.view-mode,
body.view-mode .container,
body.view-mode .container-fluid,
body.view-mode .ui-view-area,
body.view-mode .ui-view-mode,
body.view-mode .ui-view-container {
width: 100% !important;
max-width: none !important;
margin: 0 !important;
padding: 0 !important;
}
/* Full-width preview pane in split/edit mode without touching editor pane sizing. */
.ui-view-area .container,
.ui-view-area .container-fluid,
.ui-view-mode .container,
.ui-view-mode .container-fluid,
.ui-view-container .container,
.ui-view-container .container-fluid {
width: 100% !important;
max-width: none !important;
margin: 0 !important;
padding: 0 !important;
}
/* In edit/split mode, leave HedgeDoc layout alone and only style the markdown content. */
.markdown-body {
width: 100% !important;
max-width: none !important;
margin: 0 !important;
padding: var(--hd-page-pad-y) var(--hd-page-pad-x) !important;
border: 0 !important;
background: transparent !important;
box-shadow: none !important;
color: inherit;
font-size: 70%;
line-height: inherit;
overflow-wrap: anywhere;
}
/* neutralize github-markdown spacing */
.markdown-body > * {
margin-top: 0;
}
.markdown-body > * + * {
margin-top: var(--hd-flow-space);
}
.markdown-body > :first-child,
.markdown-body > *:first-child {
margin-top: 0 !important;
}
.markdown-body :where(h1, h2, h3, h4, h5, h6) {
margin: 0;
padding: 0;
border: 0;
font-size: inherit;
font-weight: inherit;
line-height: inherit;
color: inherit;
}
.markdown-body :where(p, blockquote, ul, ol, dl, pre, table, figure) {
margin: 0;
}
.markdown-body :where(ul, ol) {
padding-left: 1.25em;
}
.markdown-body li + li {
margin-top: var(--hd-list-space);
}
.markdown-body :where(ul ul, ul ol, ol ul, ol ol) {
margin-top: var(--hd-list-space);
}
.markdown-body blockquote {
padding: 0;
color: inherit;
border-left: 0;
}
.markdown-body hr {
margin: clamp(1.5rem, 5vw, 4rem) 0;
background: none;
}
.markdown-body table {
width: 100%;
border-collapse: collapse;
border-spacing: 0;
background: transparent !important;
}
.markdown-body table,
.markdown-body tr,
.markdown-body th,
.markdown-body td {
border: 0 !important;
background: transparent !important;
}
.markdown-body th,
.markdown-body td {
padding: 0;
text-align: left;
}
.markdown-body pre,
.markdown-body code {
background: transparent;
border: 0;
border-radius: 0;
}
.markdown-body pre {
padding: 0;
overflow: auto;
}
.markdown-body code {
padding: 0;
white-space: break-spaces;
}
.markdown-body pre code {
white-space: pre;
}
.markdown-body img {
margin: 0;
background: transparent;
}
.markdown-body figure,
.markdown-body figcaption {
margin: 0;
padding: 0;
}
.markdown-body input[type="checkbox"] {
vertical-align: middle;
}
/* HedgeDoc / night mode overrides, limited to preview chrome */
body.night .ui-view-area,
body.night .ui-view-mode,
body.night .modal-content,
body.night .panel,
body.night .panel-heading,
body.night .markdown-body table,
body.night .markdown-body tr,
body.night .markdown-body th,
body.night .markdown-body td {
background: transparent !important;
color: inherit !important;
border-color: transparent !important;
}
/*
Voboda theme
Builds on hedgedoc-reset.css
Keeps the original card irregularities and text rhythm,
with only subtle shadow added.
*/
:root {
--bg: #180524;
--bg-2: #031a27;
--text: #eaeaea;
--card-text: #ccc;
--link: #5fa1dd;
--selection: #114283;
--surface: rgba(255, 255, 255, 0.05);
--rule: #e7e7e7;
--inline-code: #f0f0f0;
--shield-gold: #f4df57;
--shield-silver: #f3fef1;
--shield-bronze: #d99a5b;
--shadow: 0 14px 44px rgba(0, 0, 0, 0.26);
--font-sans: Arial, "Helvetica Neue", Helvetica, sans-serif;
--font-mono: Menlo, Inconsolata, monospace;
}
body {
margin: 0;
font-family: var(--font-sans);
letter-spacing: 0.02em;
font-size: clamp(24px, 1.15rem + 0.1vw, 40px);
line-height: 1.5;
background: var(--bg);
color: var(--text);
background-image: radial-gradient(circle 1939px at 144.7% 100%, var(--bg-2) 10%, var(--bg));
min-height: 100vh;
background-attachment: fixed;
background-size: cover;
background-repeat: no-repeat;
}
::selection,
::-moz-selection {
background: var(--selection);
color: #fff;
}
body > .container,
body > .container-fluid,
.ui-view-area .container,
.ui-view-area .container-fluid,
.ui-view-mode .container,
.ui-view-mode .container-fluid,
.ui-view-container .container,
.ui-view-container .container-fluid {
padding: 40px !important;
}
.markdown-body {
font-family: var(--font-sans);
color: var(--text);
line-height: 1.5;
max-width: none;
}
.markdown-body > *:first-child {
margin-top: 120px !important;
}
.markdown-body h1 {
display: none;
}
.markdown-body h2,
.markdown-body h3,
.markdown-body h4,
.markdown-body h5,
.markdown-body h6 {
margin: 0.83em 0 0.5em 0;
padding: 0.3em 0;
font-weight: normal;
line-height: 1.2;
font-size: 80%;
letter-spacing: 0.26em;
text-transform: uppercase;
text-align: left;
}
.markdown-body h2 {
margin-top: 8em;
border-bottom: none;
text-align: left;
}
.markdown-body > h2 + p {
text-align: left;
}
.markdown-body > h3 {
margin-top: 80px;
text-align: left;
}
.markdown-body ul h2 {
margin-top: 2em;
text-align: left;
font-size: 140%;
}
.markdown-body p {
text-align: left;
margin: 0 0 20px 0;
}
.markdown-body a,
.markdown-body li a {
color: var(--link);
}
.markdown-body hr {
height: 0.05em;
margin: 24px 0;
background-color: var(--rule);
border: 0;
}
.markdown-body code {
font-family: var(--font-mono);
font-size: calc(1em - 2px);
background-color: var(--inline-code);
color: #222;
padding: 0.2em 0.4em;
border-radius: 2px;
}
.markdown-body img[src*="shields.io/"] {
filter: saturate(0.3) contrast(0.7);
}
img {
filter: hue-rotate(140deg) saturate(30%);
}
.markdown-body > p > a > img {
width: 8em;
}
.markdown-body table {
width: 100%;
margin-bottom: 40px;
}
.markdown-body table,
.markdown-body table tr,
.markdown-body table td,
.markdown-body table th {
border: none;
background: transparent;
}
.markdown-body table th,
.markdown-body table td {
padding: 10px;
text-align: left;
}
.markdown-body > ul {
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
gap: 56px;
list-style: none;
padding: 0;
margin: 0;
}
.markdown-body > ul > li {
position: relative;
background-color: var(--surface);
color: var(--card-text);
text-align: left;
gap: 10px;
flex: 0 1 510px;
max-width: 465px;
min-width: 225px;
padding: 32px 42px 42px 42px;
border: 0;
box-shadow: var(--shadow);
border-top-left-radius: 255px 15px;
border-top-right-radius: 15px 225px;
border-bottom-right-radius: 225px 15px;
border-bottom-left-radius: 15px 255px;
}
.markdown-body > ul > li[data-shield] {
--shield-color: var(--link);
}
.markdown-body > ul > li[data-shield][data-gold] {
--shield-color: var(--shield-gold);
}
.markdown-body > ul > li[data-shield][data-silver] {
--shield-color: var(--shield-silver);
}
.markdown-body > ul > li[data-shield][data-bronze] {
--shield-color: var(--shield-bronze);
}
.markdown-body > ul > li[data-shield]::after {
content: attr(data-shield);
position: absolute;
top: 18px;
right: 22px;
max-width: calc(100% - 64px);
padding: 0.35em 0.7em;
border-radius: 999px;
color: var(--shield-color);
background: color-mix(in srgb, var(--shield-color) 14%, transparent);
box-shadow: 0 0 0 1px color-mix(in srgb, var(--shield-color) 28%, transparent) inset;
font-size: 0.42em;
line-height: 1.2;
letter-spacing: 0.12em;
text-transform: uppercase;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
pointer-events: none;
}
/* top-left corner */
.markdown-body > ul > li:nth-child(3n + 1) {
border-top-left-radius: 255px 15px;
}
.markdown-body > ul > li:nth-child(3n + 2) {
border-top-left-radius: 155px 15px;
}
.markdown-body > ul > li:nth-child(3n) {
border-top-left-radius: 205px 15px;
}
/* top-right corner */
.markdown-body > ul > li:nth-child(4n + 1) {
border-top-right-radius: 15px 225px;
}
.markdown-body > ul > li:nth-child(4n + 2) {
border-top-right-radius: 45px 225px;
}
.markdown-body > ul > li:nth-child(4n + 3) {
border-top-right-radius: 45px 25px;
}
.markdown-body > ul > li:nth-child(4n) {
border-top-right-radius: 30px 190px;
}
/* bottom-right corner */
.markdown-body > ul > li:nth-child(5n + 1) {
border-bottom-right-radius: 225px 15px;
}
.markdown-body > ul > li:nth-child(5n + 2) {
border-bottom-right-radius: 125px 15px;
}
.markdown-body > ul > li:nth-child(5n + 3) {
border-bottom-right-radius: 25px 15px;
}
.markdown-body > ul > li:nth-child(5n + 4) {
border-bottom-right-radius: 190px 40px;
}
.markdown-body > ul > li:nth-child(5n) {
border-bottom-right-radius: 160px 20px;
}
/* bottom-left corner */
.markdown-body > ul > li:nth-child(7n + 1) {
border-bottom-left-radius: 15px 255px;
}
.markdown-body > ul > li:nth-child(7n + 2) {
border-bottom-left-radius: 25px 255px;
}
.markdown-body > ul > li:nth-child(7n + 3) {
border-bottom-left-radius: 25px 255px;
}
.markdown-body > ul > li:nth-child(7n + 4) {
border-bottom-left-radius: 20px 180px;
}
.markdown-body > ul > li:nth-child(7n + 5) {
border-bottom-left-radius: 30px 200px;
}
.markdown-body > ul > li:nth-child(7n + 6) {
border-bottom-left-radius: 50px 220px;
}
.markdown-body > ul > li:nth-child(7n) {
border-bottom-left-radius: 25px 170px;
}
/* slight card wobble */
.markdown-body > ul > li:nth-child(9n + 1) {
transform: rotate(0.2deg);
}
.markdown-body > ul > li:nth-child(9n + 2) {
transform: rotate(0.5deg);
}
.markdown-body > ul > li:nth-child(9n + 3) {
transform: rotate(0.2deg);
}
.markdown-body > ul > li:nth-child(9n + 4) {
transform: rotate(-0.4deg);
}
.markdown-body > ul > li:nth-child(9n + 5) {
transform: rotate(-0.22deg);
}
.markdown-body > ul > li:nth-child(9n + 6) {
transform: rotate(-0.33deg);
}
.markdown-body > ul > li:nth-child(9n + 7) {
transform: rotate(0.5deg);
}
.markdown-body > ul > li:nth-child(9n + 8) {
transform: rotate(0.3deg);
}
.markdown-body > ul > li:nth-child(9n) {
transform: rotate(0deg);
}
.markdown-body li + li {
margin-top: 0;
}
.markdown-body > ul > li > img {
width: 100%;
object-fit: cover;
aspect-ratio: 1 / 1;
display: block;
margin-bottom: 10px;
}
.markdown-body > ul > li[data-shield] img[src*="shields.io/"] {
display: none;
}
.markdown-body > ul > li > h2,
.markdown-body > ul > li > h3,
.markdown-body > ul > li > p {
text-align: left;
}
.markdown-body > ul > li > h2,
.markdown-body > ul > li > h3 {
margin-top: 0.9em;
margin-bottom: 0.7em;
padding: 0.3em 0;
}
/* first card on the page only: center all direct content */
.markdown-body > ul:first-of-type > li:first-child {
text-align: center;
}
.markdown-body > ul:first-of-type h2,
.markdown-body > ul:first-of-type h3,
.markdown-body > ul:first-of-type p,
.markdown-body > ul:first-of-type ul {
text-align: center;
}
.markdown-body > ul:first-of-type > li:first-child > ul {
justify-content: center;
}
.markdown-body > ul:first-of-type > li:first-child > ul > li {
flex-grow: 0;
text-align: center;
}
.markdown-body > ul:first-of-type > li:first-child > h3 {
margin-bottom: 20px;
}
.markdown-body > ul > li > ul {
list-style: none;
margin-top: 20px;
padding: 0;
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.markdown-body > ul > li > ul > li {
flex-grow: 1;
margin: 0;
}
.markdown-body > ul > li > ul > li > a {
color: var(--link);
padding: 10px 15px;
border: 1px solid #ccc3;
border-radius: 10px;
text-decoration: none;
font-weight: bold;
text-align: center;
display: inline-block;
margin: 3px 0;
}
.markdown-body > ul > li > ul > li > a:hover,
.markdown-body > ul > li > ul > li > a:focus-visible {
background-color: #e0e0e0;
color: #180524;
}
body.night .ui-view-area,
body.night .ui-edit-area,
body.night .modal-content,
body.night .panel,
body.night .panel-heading {
background-color: transparent !important;
color: var(--text) !important;
}
body.night .CodeMirror {
background-color: #2d2d2d !important;
color: var(--text) !important;
}
body.night a {
color: #5eb7e0 !important;
}
body.night ::selection,
body.night ::-moz-selection {
background: var(--selection) !important;
color: #fff !important;
}