The problem#

Teachers and tutors already have the material: a PDF, a photo, a slide or a website. What they need is a simple way to draw on it, explain it aloud and get a video out.

The difficult part is not just capturing a pen stroke. The drawing, source material and narration need to stay together. The exported lesson should look like the preview, and a crash should not mean losing the whole recording.

What I built#

Annotastic is an Apple Pencil lesson app for iPad with a free Mac companion. Draw over photos, PDFs, slides and websites, record narration, then export a 2.5D video lesson.

A shared Swift package supplies AnnotateCore, AnnotateRender and AnnotateExport. The apps and the annotate-render CLI use the same rendering foundation. Bonjour sync connects the iPad and Mac workflow without making them separate products to maintain.

  • Swift 6
  • PencilKit
  • Core Image
  • Metal
  • Bonjour
Contact sheet of Annotastic lesson renders with several stage layouts, annotations and presenter positions
Real stage renders: source material, drawn annotations and presenter video composed into the lesson.

Results#

These are Mac-harness measurements, not iPad device benchmarks. They show what changed in the rendering and persistence paths. They do not establish device performance or release readiness.

4,136 ms → 220.9 mspreview first frame · Mac harness
0.0/255preview vs export pixel diff · 3 lessons
0.581 msper-stroke append + fsync · Mac harness

The preview's first frame no longer waits on the same amount of work. On the three measured lessons, preview and export matched pixel-for-pixel. Persisting each stroke was measured separately, so recording safety is not hidden inside a broad rendering benchmark.

Engineering decisions#

  1. One render path. Preview and export share the renderer instead of implementing the same visual rules twice. The CLI makes that path usable outside the app interface too.
  2. Swift 6 strict concurrency. Shared code needs clear boundaries between the interface, rendering and export work. Compiler-enforced concurrency is part of that contract.
  3. Save the recording as it happens. A crash-safe incremental journal appends and syncs each stroke, with checkpoints every 120 seconds. Saving is not postponed until the teacher presses export.
What is proven: preview/export parity on three Mac-harness lessons and the timings above. What is not: broad iPad device verification. Annotastic is pre-launch and is not yet on the App Store.

Why this matters to a client or employer#

A client needs the output to be dependable, not just the demo to look good. Here, that means a recorded lesson that survives interruption and exports the composition the teacher saw.

For an engineering team, this shows how I keep cross-platform work manageable: shared packages, a single rendering path, a CLI and specific measurements. The same discipline matters in business automation — one source of truth, recoverable work and evidence at the output.