7.2 KiB
Evening Sprint - 2025-01-29 @ 7pm ET
PRIORITY 1: Flutter Styleguide (BLOCKING DEPLOYMENT!)
Task: Trash current styleguide, rebuild from scratch using exact CSS values.
Source: https://inou.com/static/style.css (saved to /tmp/inou-style.css)
Approach:
- Extract ALL values from the CSS exactly
- Font: Sora (Google Fonts)
- Base: 15px, line-height 1.5
- Match every font-size, weight, letter-spacing exactly
- Test side-by-side with web version
Key Typography (from styleguide page):
- Page Title: 2.5rem / 700
- Section Title: 1.4rem / 600
- Subsection Title: 1.1rem / 600
- Label/Category: 0.75rem / 600 / caps
- Intro text: 1.15rem / 300
- Body light: 1rem / 300
- Body regular: 1rem / 400
- Mono: SF Mono
Colors:
- Accent: #B45309
- Text: #1C1917
- Text Muted: #78716C
- Background: #F8F7F6
- Success: #059669
- Danger: #DC2626
PRIORITY 2: MoltMobile Phone Assistant
Goal
Full phone assistant functionality — answer calls, handle spam, relay messages.
Features to Build
1. Answer Phone Calls (InCallService)
- Implement Android InCallService to actually control calls
- Hook into DirectGateway command handlers
- call.answer → actually pick up
- call.reject → actually reject
- call.hangup → actually hang up
2. Spam Call Handling
When "spam likely" or unknown number calls:
- Pick up automatically
- Ask: "Who is calling and from what company?"
- Speak legal disclaimer:
"This call is being recorded. You have reached a number registered on the Do Not Call list. This is an unsolicited call. We request immediate removal from your calling list. Any recurring call from your organization will result in a formal complaint to the Florida Department of Agriculture and Consumer Services and may result in penalties of up to $10,000 per violation under the Florida Telemarketing Act."
- Listen for response
- Store full conversation verbatim in
~/clawd/memory/calls/YYYY-MM-DD-HH-MM-number.md - Hang up
3. Known Number Handling
When a known/saved contact calls:
- Pick up
- Say: "Hello, this is James, Johan's assistant. How can I help you?"
- Listen to their message
- Respond: "I'll relay [summary] to Johan. Is there anything else?"
- Say goodbye and hang up
- Store verbatim transcript in
~/clawd/memory/calls/YYYY-MM-DD-HH-MM-contact.md - Send summary to Johan via Signal
4. Answer Texts (SMS)
- Capture incoming SMS via notification
- Identify spam vs legitimate
- For spam: auto-reply "STOP"
- For legitimate: relay to Johan, await instructions
5. TTS/STT Integration
- Need text-to-speech for speaking to callers
- Need speech-to-text for transcribing caller's responses
- Options: Android built-in, Google Cloud, ElevenLabs
6. 🚨 SUPER ATTENTION MODE
Purpose: Maximum urgency alerts — make the phone go CRAZY to get attention.
Triggers:
- Gateway command:
POST /attention/super - Use case: Medical emergency, Sophia alert, critical system failure
All of these simultaneously:
- 📢 Volume: Force to MAX (ignore Do Not Disturb)
- 🔔 Ringtone: Loudest/most jarring tone available
- 📳 Vibration: Continuous strong vibration pattern
- 💡 Screen: Full brightness, flashing colors (red/white strobe)
- 🔦 Flashlight: Strobe the camera flash LED
- 🔊 Audio: Play alarm sound on loop
- 📱 Wake: Force screen on, prevent sleep
- 🔁 Loop: Continue until acknowledged via app or gateway
Android APIs needed:
AudioManager.setStreamVolume(STREAM_ALARM, max, FLAG_ALLOW_RINGER_MODES)Vibrator.vibrate(VibrationEffect.createWaveform(pattern, repeat))WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | FLAG_TURN_SCREEN_ONCameraManager.setTorchMode()for flash strobePowerManager.WakeLockto prevent sleep- Override DND with
NotificationManager.INTERRUPTION_FILTER_ALL
Stop conditions:
- User taps "ACKNOWLEDGE" button on full-screen alert
- Gateway sends
POST /attention/stop - Timeout (configurable, default: none — keep going until ack)
7. 🌐 Remote Browser (WebView GUI)
Purpose: Let James control a browser on the phone — open URLs, interact with pages, take screenshots.
Simple GUI:
- Full-screen WebView activity
- Can be launched via gateway command
- Status bar shows "James is browsing"
Gateway endpoints:
POST /browser/open— Launch browser activity with URLPOST /browser/navigate— Go to new URLPOST /browser/js— Execute JavaScriptGET /browser/screenshot— Capture current viewPOST /browser/close— Close browser activity
Use cases:
- Check websites that need mobile view
- Fill out forms that require phone
- Debug mobile-specific issues
- Access phone-only services
- Screenshots of mobile layouts
Implementation:
class RemoteBrowserActivity : AppCompatActivity() {
lateinit var webView: WebView
override fun onCreate(savedInstanceState: Bundle?) {
webView = WebView(this).apply {
settings.javaScriptEnabled = true
settings.domStorageEnabled = true
webViewClient = WebViewClient()
}
setContentView(webView)
// Load URL from intent
intent.getStringExtra("url")?.let { webView.loadUrl(it) }
}
fun executeJs(script: String, callback: (String) -> Unit) {
webView.evaluateJavascript(script, callback)
}
fun captureScreenshot(): Bitmap {
val bitmap = Bitmap.createBitmap(webView.width, webView.height, Bitmap.Config.ARGB_8888)
webView.draw(Canvas(bitmap))
return bitmap
}
}
Permissions needed:
android.permission.INTERNET(already have)- No special permissions for WebView
Technical Requirements
Android InCallService
class MoltMobileCallService : InCallService() {
override fun onCallAdded(call: Call) {
// Can now control the call
call.answer(VideoProfile.STATE_AUDIO_ONLY)
call.reject(false, null)
call.disconnect()
}
}
Manifest:
<service android:name=".calls.MoltMobileCallService"
android:permission="android.permission.BIND_INCALL_SERVICE">
<meta-data android:name="android.telecom.IN_CALL_SERVICE_UI" android:value="false"/>
<intent-filter>
<action android:name="android.telecom.InCallService"/>
</intent-filter>
</service>
Florida Legal Reference
- Florida Telemarketing Act (Chapter 501, Part IV)
- Do Not Call list violations: up to $10,000 per call
- FDACS complaint: https://www.fdacs.gov/Consumer-Resources/Consumer-Rights-and-Responsibilities/Telemarketing
Files to Create/Modify
calls/MoltMobileCallService.kt- InCallService implementationcalls/CallHandler.kt- Logic for spam vs known caller handlingcalls/TtsEngine.kt- Text-to-speech wrappercalls/SttEngine.kt- Speech-to-text wrappergateway/DirectGateway.kt- Wire up call controlAndroidManifest.xml- Add InCallService
Gateway Endpoints Needed
- POST /call/speak - TTS to caller
- POST /call/listen - Get transcription
- POST /call/transcript - Full call transcript
- POST /sms/reply - Send SMS reply
Testing
- Test with wife's phone (known contact)
- Test with Google Voice number (unknown)
- Wait for actual spam call 😈