Screen recording with on-chain proof-of-existence for the Solana Seeker
Built for the MONOLITH Hackathon — Solana Mobile Track
Screen recordings are trivial to create but impossible to prove. There is no way to verify when a recording was made, by whom, or whether it has been tampered with after the fact. In legal disputes, insurance claims, content licensing, and whistleblower scenarios, the authenticity of screen recordings is always in question.
ScreenRecSkr is a native screen recording app for the Solana Seeker that anchors every recording to the Solana blockchain. After capturing a screen recording, the app computes a SHA-256 hash of the file and writes it on-chain via the Solana Memo Program. The recording never leaves the device -- only its cryptographic fingerprint does. Anyone can later verify the recording by re-hashing the file and comparing against the immutable on-chain record.
The Seeker's Seed Vault provides hardware-backed signing through a Trusted Execution Environment (TEE), meaning proofs are signed in secure silicon -- not in app memory. Combined with device attestation embedded in the memo, this creates a verifiable chain of custody: this file, on this device, signed by this wallet, at this moment in time.
- Resolution: 480p, 720p, 1080p, 2K, 4K -- configurable per-recording
- Frame rate: 24 / 30 / 60 fps
- Codecs: H.264 (broad compatibility) and H.265/HEVC (smaller files)
- Audio capture: Microphone, system audio, or both simultaneously
- Floating overlay: Draggable controls that stay on top of any app
- Shake-to-stop: Physical gesture to end recording without touching the overlay
- Video trimming: Built-in editor using Android MediaExtractor -- trim start/end without re-encoding
- SHA-256 hashing: Cryptographic fingerprint of the entire recording file
- Memo Program v2: Hash written on-chain as a permanent, immutable record
- Device attestation: Device fingerprint embedded in the proof memo
- Batch proof: Prove multiple recordings in a single transaction (one fee)
- Proof certificates: Shareable images with QR codes linking to Solana Explorer
- Proof persistence: Proofs survive app restarts (SharedPreferences-backed store)
- Share-with-proof: Send the recording file alongside proof text and Explorer link
- Incoming verification: Receive files from other apps and check them against on-chain proofs
- Sign In With Solana (SIWS): Modern authentication via Mobile Wallet Adapter 2.0.3
- Seed Vault signing: All transactions signed inside the Seeker's TEE
- SKR token payments: SPL TransferChecked for SKR-denominated access
- SOL payments: SystemProgram.Transfer as an alternative payment method
- ATA creation: CreateAssociatedTokenAccountIdempotent ensures recipient accounts exist
- SGT verification: Seeker Genesis Token holders get unlimited access (soulbound token check)
- Freemium model: 3 free recordings per day, then pay-per-use or hold SGT
- AES-256-GCM: Encrypted wallet storage via AndroidX Security Crypto
- Geo-blocking: 22+ sanctioned jurisdictions blocked (OFAC / EU / UK / AU / UN)
- Multi-layer detection: SIM, network carrier, locale, timezone heuristics -- no GPS required
- Network security: HTTPS-only via
networkSecurityConfig,allowBackup=false - R8 obfuscation: Minified release builds with 57 ProGuard keep rules
- 6 legal documents: Privacy Policy, Terms of Service, Copyright, License, Disclaimer, Sanctions
- 28 languages supported
ScreenRecSkr/
app/src/main/kotlin/com/screenrecskr/app/
|
+-- MainActivity.kt # Entry point, intent handler, ActivityResultSender
+-- ScreenRecSkrApp.kt # Application class
|
+-- data/ # Data layer
| +-- model/
| | +-- Recording.kt # Recording metadata (MediaStore)
| | +-- ProofData.kt # On-chain proof (txSig, hash, timestamp, wallet)
| | +-- RecordingConfig.kt # Resolution, FPS, codec, audio settings
| +-- GeoBlocker.kt # Multi-layer sanctions compliance (22 jurisdictions)
| +-- ProofStore.kt # SharedPreferences-backed proof persistence
| +-- RecordingRepository.kt # MediaStore queries for recordings library
| +-- SolanaRpc.kt # JSON-RPC client (getLatestBlockhash, etc.)
| +-- SolanaTransaction.kt # Transaction builders (SOL, SPL, Memo)
| +-- UserPreferences.kt # Singleton preferences manager (wallet, SGT, credits)
| +-- VideoTrimmer.kt # MediaExtractor-based video trimmer
|
+-- service/ # Background services
| +-- RecordingService.kt # Foreground service (MediaProjection + MediaRecorder)
| +-- FloatingControlService.kt # Overlay controls (SYSTEM_ALERT_WINDOW)
|
+-- ui/ # Presentation layer (Jetpack Compose + Material3)
| +-- components/
| | +-- RecordingCard.kt # Library card with proof badge + actions
| | +-- WalletBadge.kt # Wallet connection status + connecting state
| | +-- ProofDetailSheet.kt # Bottom sheet with proof details + Explorer link
| | +-- ProofCertificate.kt # Shareable proof certificate with QR code
| +-- screens/
| | +-- HomeScreen.kt # Recording controls + quick stats
| | +-- RecordingsScreen.kt # Library grid with proof indicators
| | +-- SettingsScreen.kt # Resolution, FPS, codec, audio, wallet
| | +-- OnboardingScreen.kt # First-run walkthrough
| | +-- TermsScreen.kt # Legal document viewer
| | +-- WalletGateScreen.kt # SIWS + SGT gate + payment options
| | +-- TrimScreen.kt # Video trim editor
| | +-- VerifyScreen.kt # File verification UI
| | +-- LegalScreen.kt # Legal documents hub
| | +-- BlockedRegionScreen.kt # Sanctions geo-block notice
| +-- navigation/
| | +-- NavGraph.kt # Navigation routes
| +-- theme/
| +-- Color.kt # Color system
| +-- Theme.kt # Material3 theme
|
+-- viewmodel/ # ViewModels (lifecycle-aware)
+-- WalletViewModel.kt # Wallet, SIWS, payments, proofs, verification
+-- RecordingViewModel.kt # Recording lifecycle, library management
31 Kotlin source files. 15,000+ lines of code. Zero third-party Solana SDKs -- all transaction serialization (SOL transfers, SPL TransferChecked, ATA derivation, Memo encoding) is hand-rolled using raw ByteBuffer wire format per the Solana transaction specification.
ScreenRecSkr
Proof Flow
+-------------------+ +--------------------+ +-------------------+
| 1. RECORD | | 2. HASH | | 3. BUILD MEMO |
| | | | | |
| MediaProjection | --> | SHA-256 digest | --> | SCREENRECSKR |
| + MediaRecorder | | of entire file | | |v1|<hash> |
| Save to | | (streaming, | | |<filename> |
| MediaStore | | 8KB chunks) | | |<epoch> |
+-------------------+ +--------------------+ | |<device_attest> |
+--------+----------+
|
+-------------------------------------------+
|
v
+-------------------+ +--------------------+ +-------------------+
| 4. SIGN & SEND | | 5. PERSIST | | 6. VERIFY |
| | | | | |
| MWA 2.0.3 | | Save locally: | | Re-hash file |
| signAndSend | | - txSignature | | Compare against |
| Transactions() | | - sha256Hash | | on-chain memo |
| | | - proofTimestamp | | |
| Seed Vault TEE | | - walletAddress | | Match = Verified |
| signs in secure | | - memoText | | Mismatch = |
| silicon | | | | Tampered |
+-------------------+ +--------------------+ +-------------------+
SCREENRECSKR|v1|<sha256_hex>|<filename>|<unix_epoch>|<device_fingerprint>
Each field:
| Field | Description |
|---|---|
SCREENRECSKR |
App identifier prefix |
v1 |
Proof format version |
<sha256_hex> |
64-character hex SHA-256 hash of the recording file |
<filename> |
Original filename from MediaStore |
<unix_epoch> |
Unix timestamp (seconds) when proof was created |
<device_fingerprint> |
Device attestation hash for chain-of-custody |
Anyone with the original recording file can verify its authenticity:
- Compute SHA-256 hash of the file
- Look up the transaction on Solana Explorer
- Read the memo data from the transaction
- Compare the hash in the memo to the computed hash
- Match = the file is identical to what was proven on-chain
- Mismatch = the file has been modified since the proof was created
ScreenRecSkr can also verify incoming files: share a video into the app, and it will hash it and check against all stored proofs automatically.
| Layer | Technology | Version |
|---|---|---|
| Language | Kotlin | 2.0.0 |
| UI Framework | Jetpack Compose + Material3 | BOM 2024.06.00 |
| Build System | Gradle + AGP | 8.5.2 |
| Target SDK | Android 35 | API 35 (min 26) |
| Wallet | Solana Mobile Wallet Adapter | 2.0.3 |
| SGT Checker | seeker-verify | 1.1.0 |
| Serialization | kotlinx.serialization | 1.6.3 |
| Coroutines | kotlinx.coroutines | 1.8.1 |
| Image Loading | Coil (+ video frames) | 2.6.0 |
| Video Playback | Media3 ExoPlayer | 1.3.1 |
| Encryption | AndroidX Security Crypto | 1.0.0 |
| Navigation | Navigation Compose | 2.7.7 |
| JVM Target | JDK 17 | -- |
| Program | Purpose |
|---|---|
Memo Program v2 (MemoSq4g...) |
Proof-of-existence (hash storage) |
| SystemProgram | SOL transfer payments |
SPL Token Program (Tokenkeg...) |
SKR TransferChecked payments |
Associated Token Program (ATokenGP...) |
CreateIdempotent for recipient ATAs |
- Android Studio (Arctic Fox or later)
- JDK 17 (bundled with Android Studio)
- Solana Seeker device connected via USB
- ADB installed and device authorized
# Set JAVA_HOME to Android Studio's bundled JDK
export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"
# Build the release APK (R8 minified + signed)
./gradlew assembleRelease
# Install on connected Seeker device
adb install -r app/build/outputs/apk/release/app-release.apk
# Launch
adb shell am start -n com.screenrecskr.app/.MainActivityexport JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"
./gradlew assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apkScreenshots will be added before final submission.
| Home | Recording | Library | Proof |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| Verify | Settings | Wallet Gate | Certificate |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| Access Tier | Requirement | Recording Limit |
|---|---|---|
| Free | No wallet needed | 3 recordings / day |
| Pay-per-use (SOL) | 0.01 SOL per session | 1 additional recording |
| Pay-per-use (SKR) | 0.01 SKR per session | 1 additional recording |
| SGT Holder | Hold Seeker Genesis Token | Unlimited |
SGT verification is automatic on wallet connect. The soulbound token is checked against mainnet, and holders are granted unlimited access for the lifetime of their connection.
- On-chain verification -- Query Solana RPC to verify proofs directly from the chain (not just local store)
- Multi-device sync -- Proof store backed by on-chain account data (PDA-based)
- Proof marketplace -- List verified recordings as NFTs with embedded proof metadata
- Witness mode -- Multi-party attestation (multiple wallets co-sign a proof)
- IPFS pinning -- Optional decentralized storage for recordings with on-chain CID reference
- Desktop verifier -- Web app that accepts a file and tx signature, verifies against Solana
- Compression analytics -- Per-recording bitrate/filesize estimates before recording starts
- Scheduled recordings -- Timer-based and calendar-triggered recording
- Livestream proof -- Rolling hash of live stream segments with periodic on-chain anchoring
| Package | com.screenrecskr.app |
| Version | 1.0.0 (versionCode 1) |
| Min SDK | 26 (Android 8.0) |
| Target SDK | 35 (Android 15) |
| Publisher | MidMightBit Games / Aardappvark |
| Legal | aardappvark/screenrecskr-legal |
| SKR Mint | SKRbvo6Gf7GondiT3BbTfuRDPqLWei4j2Qy2NPGZhW3 |
| Treasury | DD4aPDhf396NhNDxa4PBVf1u3uzCUP2QYm2dFMmJWq2Q |
Built on Solana Mobile for the Seeker








