← showcase

· showcase · vesk native · android

Fieldbook

Field notes for biologists. Photos, GPS, voice — syncs when back online. Built once in .vsk, runs on the web for planning and on Android for the field.

240 ms
cold start
RN equiv 410 ms (same device)
offline
by default
offline.vsk = native offline UI
1 codebase
web + android
~92% code share
same IR, different emitter

Web — DOM

						
							component Note(props: { id: string }) {
  const note = useFetch.json<Note>(`/api/note/${props.id}`)
  <article>{note.data.title}</article>
}
						
					

Emit: document.createElement + per-cell effect.

Android — Compose

						
							// same .vsk IR
@Composable fun Note(id: String) {
  val note = useFetchJson<Note>("/api/note/$id")
  Text(note.data.title)
}
						
					

Emit: @Composable + Material 3 — no WebView.

Why Vesk over alternatives?

  • React Native: bridge + Yoga — camera/GPS plugins each add bridge cost. Vesk: direct Kotlin.
  • Flutter: Dart island. Good performance, but 0% web share — two teams.
  • Tauri/Capacitor: WebView — offline is a hack, not a first-class offline.vsk .

What shipped

  • Photos + EXIF → VeskResponse.json + presigned S3, same handler web/native.
  • GPS → native capability, typed via @vesk/native shim, mocked on web.
  • Sync → mutate(noteKey) optimistic, revalidate on reconnect.
  • Same validation: Zod schema shared, issuesToFieldMap on both.