Source
This app’s code and revision history are public. Download a copy or explore the files below.
Public
The app’s code and revision history are public.
Run it yourself
Take the whole tree and run it on your own machine. The download needs no account. Cloning needs a sign-in.
Download .zip
bounded clone 80ddb8c5df822e290afdd3c7
A copy you download is not bounded. The guarantees this app runs under - declared egress, proven invariants, writes that fail closed - live in the runtime serving this page, not in the files. What you get is auditable source you can read and run, with no runtime guarantees attached.
src/styles.css
/* Drop. Shared look comes from /kit.css; this is the app's own layout. */
body.app-mode .landing-only, body.app-mode .site-head, body.app-mode .site-foot { display: none !important; }
body:not(.app-mode) #app:empty { display: none; }
/* Landing hero with the send and receive card */
.app-hero { padding: 48px 0 72px; background: linear-gradient(180deg, #faf6ee 0%, #fdfdfc 100%); border-bottom: 1px solid #f0ebe1; }
.app-hero-grid { display: grid; grid-template-columns: minmax(0, 1fr) 420px; gap: 56px; align-items: center; }
.app-hero h1 { margin-top: 14px; }
.app-hero .lede { margin-top: 18px; }
.hero-points { list-style: none; padding: 0; margin-top: 26px; display: grid; gap: 10px; font-size: 15.5px; color: #3c4048; }
.hero-points li { display: flex; gap: 10px; align-items: baseline; }
.hero-points li::before { content: ""; flex: 0 0 8px; height: 8px; border-radius: 50%; background: var(--cobalt); transform: translateY(-2px); }
.hero-art { width: 240px; height: auto; margin-bottom: -4px; }
.start-card { padding: 22px; }
@media (max-width: 900px) {
/* Phones: the card comes right after the headline, so the first screen does the job. */
.app-hero { padding: 24px 0 48px; }
.app-hero-grid { grid-template-columns: minmax(0, 1fr); gap: 0; }
.app-hero-grid > div:first-child { display: contents; }
.hero-art { width: 130px; margin-bottom: 4px; }
.start-card { order: 1; margin-top: 20px; padding: 16px; }
.app-hero .lede { order: 2; margin-top: 24px; }
.hero-points { order: 3; }
}
/* Send and receive card */
.start { display: grid; gap: 16px; }
.dropzone { display: grid; justify-items: center; gap: 10px; padding: 22px 18px 18px; border: 1.5px dashed var(--line-strong); border-radius: 14px; background: #fff; text-align: center; transition: border-color .15s, background .15s; }
body.dragging .dropzone { border-color: var(--cobalt); background: var(--cobalt-wash); }
.dz-icon { display: grid; place-items: center; width: 52px; height: 52px; border-radius: 14px; background: var(--paper-warm); border: 1px solid #ece2cf; color: var(--ink-solid); }
.dz-title { font: 380 26px/1.1 var(--serif); letter-spacing: -.02em; }
.dz-sub { max-width: 30ch; color: var(--muted); font-size: 14.5px; line-height: 1.45; margin-bottom: 4px; }
.dz-hint { color: var(--faint); font-size: 13px; }
.receive-form { display: grid; gap: 8px; }
.code-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 8px; }
.code-input { font: 600 22px/1 var(--sans); letter-spacing: .14em; text-align: center; font-variant-numeric: tabular-nums; }
.start-note { font-size: 13px; color: var(--muted); text-align: center; }
.resume { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 52px; padding: 0 16px; border-radius: 12px; background: var(--ink-solid); color: #fff; font: 600 15px/1.2 var(--sans); }
.resume:hover { background: #2a2c31; color: #fff; }
.resume-go { opacity: .85; font-size: 14px; }
/* Landing sections */
section[id] { scroll-margin-top: 72px; }
.steps { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 28px; margin-top: 28px; padding: 0; counter-reset: step; }
.steps li { list-style: none; counter-increment: step; }
.steps li::before { content: counter(step); display: grid; place-items: center; width: 34px; height: 34px; margin-bottom: 14px; border-radius: 50%; background: var(--ink-solid); color: #fff; font: 650 15px var(--sans); }
.steps h3, .features h3, .privacy-list h3 { font: 600 18px/1.3 var(--sans); }
.steps p, .features p, .privacy-list p { margin-top: 8px; color: #4a4e56; }
.features { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; margin-top: 26px; padding: 0; list-style: none; }
.features li { padding: 18px 20px; border: 1px solid var(--line); border-radius: 14px; background: #fff; }
.features p { margin-top: 6px; font-size: 15px; }
@media (max-width: 900px) { .features { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 760px) { .steps, .features { grid-template-columns: minmax(0, 1fr); } }
.privacy { background: var(--paper-warm); border-block: 1px solid #ece2cf; }
.privacy-grid { display: grid; grid-template-columns: minmax(0, .9fr) minmax(0, 1.1fr); gap: 40px; align-items: start; }
.privacy-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 22px 28px; padding: 0; list-style: none; }
.privacy-note { grid-column: 1 / -1; max-width: 80ch; }
@media (max-width: 900px) { .privacy-grid, .privacy-list { grid-template-columns: minmax(0, 1fr); } }
.limits { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; margin-top: 26px; padding: 0; list-style: none; }
.limits li { padding: 18px 20px; border-left: 3px solid var(--gold); background: #fff; border-radius: 0 12px 12px 0; }
.limits h3 { font: 600 17px/1.3 var(--sans); }
.limits p { margin-top: 6px; color: #4a4e56; font-size: 15px; }
@media (max-width: 760px) { .limits { grid-template-columns: minmax(0, 1fr); } }
.api-grid { display: grid; grid-template-columns: minmax(0, .9fr) minmax(0, 1.1fr); gap: 40px; align-items: start; }
.api-grid .code { font-size: 12.5px; }
@media (max-width: 900px) { .api-grid { grid-template-columns: minmax(0, 1fr); } }
.more-apps { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 12px; list-style: none; padding: 0; margin-top: 22px; }
.more-apps a { display: grid; gap: 4px; padding: 16px 18px; border: 1px solid var(--line); border-radius: 14px; background: #fff; color: var(--ink); }
.more-apps a:hover { border-color: var(--line-strong); box-shadow: var(--shadow); color: var(--ink); }
.more-apps strong { font: 400 22px/1.1 var(--serif); }
.more-apps span { color: var(--muted); font-size: 14px; }
.compare td:first-child { font-weight: 600; }
.compare { min-width: 720px; }
.updated { margin-top: 6px; color: var(--muted); font-size: 14px; }
/* ---------- App screens ---------- */
.app-page { width: min(1000px, 100%); margin-inline: auto; padding: 0 16px calc(40px + env(safe-area-inset-bottom)); display: flex; flex-direction: column; gap: 14px; }
.app-bar { position: sticky; top: 0; z-index: 5; display: flex; align-items: center; gap: 10px; min-height: 60px; margin-inline: -16px; padding: env(safe-area-inset-top) 16px 0; background: #fdfdfcf0; -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px); border-bottom: 1px solid var(--line); }
.app-brand { display: inline-flex; align-items: center; gap: 9px; color: var(--ink-solid); font: 650 17px/1 var(--sans); letter-spacing: -.02em; }
.app-brand:hover { color: var(--ink-solid); }
.app-bar-right { margin-left: auto; display: flex; align-items: center; gap: 8px; }
.app-h1 { margin-top: 14px; font: 350 clamp(30px, 4vw, 42px)/1.1 var(--serif); letter-spacing: -.028em; text-wrap: balance; }
.app-lede { max-width: 62ch; color: #4a4e56; font-size: 16.5px; line-height: 1.55; }
.app-page > .start-card { width: min(460px, 100%); }
.center-fill { display: flex; align-items: center; justify-content: center; min-height: 120px; color: var(--muted); }
.grow { flex: 1; min-width: 0; }
.label { font: 650 12px/1.2 var(--sans); letter-spacing: .1em; text-transform: uppercase; color: var(--muted); }
.send-grid { display: grid; grid-template-columns: 340px minmax(0, 1fr); gap: 16px; align-items: start; margin-top: 6px; }
.send-grid > :only-child { grid-column: 1 / -1; }
.send-side { display: grid; gap: 14px; min-width: 0; }
@media (max-width: 820px) { .send-grid { grid-template-columns: minmax(0, 1fr); } }
.share-card { display: grid; justify-items: center; gap: 10px; padding: 20px 18px; text-align: center; }
.share-card .label { justify-self: start; }
.qr { width: 188px; height: 188px; border-radius: 10px; }
.qr-wait { display: grid; place-items: center; width: 188px; height: 188px; border-radius: 10px; background: var(--panel); }
.share-hint { color: #4a4e56; font-size: 14.5px; line-height: 1.45; }
.pair-code { display: flex; align-items: center; justify-content: center; min-height: 52px; font: 650 44px/1 var(--sans); letter-spacing: .06em; font-variant-numeric: tabular-nums; color: var(--ink-solid); }
.pair-code > span:not(.spinner) { display: inline-block; width: .32em; }
.share-small { color: var(--muted); font-size: 13px; line-height: 1.45; max-width: 34ch; }
.link-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 8px; width: 100%; margin-top: 4px; }
.link-input { min-height: 36px; padding: 6px 10px; font: 13px/1.3 var(--mono); color: #3a3e46; }
.list-card { display: grid; gap: 12px; padding: 18px; min-width: 0; }
.files, .peers { list-style: none; padding: 0; display: grid; }
.files li, .peers li { display: flex; align-items: center; gap: 12px; min-height: 52px; padding: 8px 0; border-top: 1px solid var(--line); min-width: 0; }
.files li:first-child, .peers li:first-child { border-top: 0; }
.file-icon { display: grid; place-items: center; flex: 0 0 34px; height: 34px; border-radius: 9px; background: var(--panel); color: #3a3e46; }
.rx-done .file-icon { background: var(--sage-wash); color: var(--sage); }
.rx-failed .file-icon { background: var(--brick-wash); color: var(--brick); }
.file-name { display: block; min-width: 0; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 600 15px/1.3 var(--sans); }
.file-size { flex: none; color: var(--muted); font-size: 14px; font-variant-numeric: tabular-nums; }
.file-state, .peer-state { display: block; color: var(--muted); font-size: 13.5px; line-height: 1.4; font-variant-numeric: tabular-nums; }
.file-state.bad { color: var(--brick); }
.file-actions { flex: none; display: flex; align-items: center; gap: 6px; }
.peer-name { display: block; font: 600 15px/1.3 var(--sans); }
.dot { flex: 0 0 9px; height: 9px; border-radius: 50%; background: var(--line-strong); }
.dot.on { background: var(--sage); }
.progress { position: relative; height: 6px; margin-top: 6px; border-radius: 999px; background: var(--panel); overflow: hidden; }
.progress span { position: absolute; inset: 0 auto 0 0; border-radius: inherit; background: var(--cobalt); transition: width .3s linear; }
.overall { display: grid; gap: 4px; }
.overall .progress { height: 8px; margin-top: 0; }
.overall-line { color: #3a3e46; font: 600 14.5px/1.4 var(--sans); font-variant-numeric: tabular-nums; }
.receive-card { width: min(720px, 100%); }
.verify { padding-top: 12px; border-top: 1px solid var(--line); font-size: 14px; color: #4a4e56; }
.notes { --gap: 10px; width: min(720px, 100%); }
Change history
Point OpenApps links to openapps.free
Bind agent address in policy
Retry release capture
Use OpenApps service URLs and add contribution strip
Bounded source sync
Bounded source sync
Bounded source sync