---
title: Things I Learned - 09 Nov 2025
date: 2025-11-09T00:00:00+00:00
categories:
- til
description: I explored building community influence, Android data export for automation, and advanced coding agent tools like Claude Code and Gemini CLI. I also investigated fine-tuning ROI and mapped out OpenAI TTS costs and usage APIs.
keywords: [til, llm-friendly, claude code, gemini cli, android automation, fine-tuning, openai tts, pmtiles]
---
This week, I learned:
- "But when an identity based belief was challenged, the brain responded as if under physical attack." [Why Engineers Can't Be Rational About Programming Languages](https://spf13.com/p/the-hidden-conversation/)
- Notes from [How to build a cult](https://www.youtube.com/watch?v=I9Njb8Lw5Xc), Lulu Cheng, The Knowledge Project podcast
- Conviction is infectious.
- Communicate at the INTERSECTION of interests. Learn theirs
- Begin with "why your story matters to them" (first sentence). That beats "how you tell it" > "where you tell it".
- The easiest way to align with an audience is to find your community.
- Humor, curiosity, awe, any strong emotion is a hook.
- Culture has momentum. Best way to break it is to show an alternative that works. People will copy that
- REPEAT messages over and over with complete CONVICTION to convince people who TRUST you. That works, but you need all three.
- Trust builds from likeability, repeated exposure, common beliefs.
- An excellent way to defend against online criticism (when it matters) is to just SHOW UP and THANK them for feedback.
- Serious reputational damage must either be fixed immediately - or you live with it forever.
- Between a story and statistics, the story will always wins. Never fight a story with a statistic. Dig into your statistics and uncover BETTER stories.
- ⭐ Prebuttals are a great idea. Start with all possible criticisms yourself and diffuse them. The other person has nothing left to say
- Sparring keeps you sharp. Spar with LLMs.
- To defend, show how the attack targets other people, increasing the surface area. Show how the SPECIFIC attack targets a larger group. Create a SPECIFIC cause worth fighting for.
- Each role has specific objective to optimise for. The leader's role is to balance across these.
- Cheerleader effect. People look beautiful next to a cheerleader. Associations taint.
- Each person has dozens of aspects to their persona. We cannot remember all of them. Each person can make a choice on who they project themselves to be in any group. Shaping their persona.
- ~~The [Rainbow CSV](https://marketplace.visualstudio.com/items?itemName=mechatroner.rainbow-csv) extension may be causing delays (infinite spinner) when pasting Markdown in VS Code. Restarting it seems to fix the issue.~~
- ⭐ [Claude scientific skills](https://github.com/K-Dense-AI/claude-scientific-skills/) is a collection of skills teaching Claude how to use scientific libraries, databases, and APIs across several domains. This may be a good example of a non-trivial skill library - that is hard for AI coding agents to infer by themselves.
- Notes from [How I use every Claude Code feature](https://blog.sshh.io/p/how-i-use-every-claude-code-feature)
- Use AGENTS.md as guardrails, not a manual. Document what it gets wrong.
- Use self-documenting tools/APIs rather than documenting.
- Docs: Explain why and when to read each doc.
- Never say "Never." Explain when to which which alternative.
- Prefer CLIs for stateless tools, MCPs for stateful, authenticated, or complex (e.g. Playwright).
- Coding agents work well with version control. [Simon Willison](https://simonwillison.net/2025/Nov/4/datasette-10a20/)
- Break up uncommitted changes into small commits
- Rewrite branch history for readability
- Use `gh` CLI to fetch line-wise comments from a PR and make requested changes (e.g. renaming, refactoring, adding types, etc.)
- ⭐ When using MCPs or tools with private data, "color untrusted content in red, unsafe actions in blue, and never mix colors." [Good advice](https://timkellogg.me/blog/2025/11/03/colors).
- ⭐ DeepWiki offers a [codemaps](https://cognition.ai/blog/codemaps) feature that explains code in an interactive way. It shows a structured explanation on the left. You can click on any note to see the code on the right. It's an effective way to understand how a library or tool executes a task. [Here's an example of how Mermaid works](https://deepwiki.com/search/draw-a-codemap_59d591f6-fc79-40f0-973d-bfa0e149b41a).
- [Gemini offers RAG with free storage](https://blog.google/technology/developers/file-search-gemini-api/). RAG costs are quite high. This simplifies the process a lot. But I tried running the sample program and after an hour, it still had not completed uploading a single file. Best to wait and watch.
- [OpenRouter supports embedding models](https://openrouter.ai/models?fmt=cards&order=top-weekly&output_modalities=embeddings) using an [OpenAI-like API](https://openrouter.ai/docs/api-reference/embeddings/create-embeddings)
- [Kimi K2 Thinking](https://openrouter.ai/moonshotai/kimi-k2-thinking) seems popular because
- It's an open-weights model on par with the top models on Humanity’s Last Exam (text-only) and BrowseComp
- Can run 200-300 tool calls without human guidance
- 4x cheaper than GPT-5 with low tokens (32B active on 1T parameters, INT4 quantized)
- Based on responses to [Simon Willison's question](https://x.com/simonw/status/1979254349235925084), [ChatGPT](https://chatgpt.com/share/690b4fa0-7dec-800c-87a5-6e01dda36f7e)
- Fine-tuning helps when:
- Lower latency, e.g. for type-ahead, at lower cost (**37 mentions**)
- Structured extraction, parsing and classifiers, e.g. postal address, detecting secrets (18 mentions)
- Custom vision models, e.g. check containers (12 mentions)
- Domain-specific code and stacks (niche languages, stack-specific generation, text→SQL) (11 mentions)
- ... and a long tail.
- Fine tuning does not help:
- When A base model plus prompting or RAG does as well or better (**15 mentions**)
- When you risk being leapfrogged by a new release (4 mentions)
- When cost and data do not justify the ROI (3 mentions)
- The data I can export from my Android phone includes the below. 🟢 indicates it's tracked. 🟡 might need action, e.g. enabling / coding. [#](https://chatgpt.com/c/69089221-9430-8320-9cb0-5350a17fc486)
- 🟢 GPS/GNSS location (current & history). Turn on device Location. If you want a timeline you can export, enable Google Location History and later export via Google Takeout → Location History (JSON/KML).
- 🟡 GNSS raw measurements (engineering traces). Android exposes GNSS “raw” logs on many devices; capture with dev tools or logging apps if supported (intended for research). See GNSS Raw Measurements API.
- 🟢 Wi-Fi scans (nearby SSIDs/BSSIDs). Toggle Location scanning → Wi-Fi scanning in Location settings; apps need location permission to read results.
- 🟡 Wi-Fi RTT distance to APs (indoor ranging). Apps can use Wi-Fi RTT (802.11mc/az) to measure distance to compatible APs; requires location permission.
- 🟢 Bluetooth proximity/traffic. For packet-level logs, enable Developer options → Enable Bluetooth HCI snoop log, then pull `/sdcard/btsnoop_hci.log` (Wireshark).
- 🟢 Cell towers (IDs, signal strength). Apps can read via TelephonyManager (e.g., `getAllCellInfo()`), with appropriate telephony permissions.
- 🟢 Activity recognition (walking, running, in vehicle). Apps must request ACTIVITY_RECOGNITION (runtime) from Android 10+.
- 🟢 Steps (step counter / detector). Use sensors API; from Android 10+ you must declare ACTIVITY_RECOGNITION to access step counter/step detector.
- 🟢 Accelerometer / gyroscope / magnetometer streams. Apps read via SensorManager; some high-rate reads require HIGH_SAMPLING_RATE_SENSORS.
- 🟢 Ambient light / proximity. Read via SensorManager; typically no special permission.
- 🟢 Google Fit data (steps, workouts, heart rate from wearables, etc.). Manage and export from Google Fit / Google account Download your data.
- 🟢 Contacts. MIUI → Settings → System apps → Contacts → Import/Export to .vcf (vCard).
- 🟢 Call history / SMS (device). MIUI local/cloud backup can include call logs & messages; export by creating a local/Cloud backup and downloading. Note: 3P apps can’t read call/SMS logs unless they’re the default dialer/SMS.
- 🟡 Gmail, Calendar, Contacts (Google). Export via Google Takeout (MBOX/ICS/CSV etc.).
- 🟡 WhatsApp / Telegram / Signal chats. Use in-app exports: WhatsApp → Export chat, Telegram Desktop → Export, Signal → encrypted backup.
- 🟢 Advertising ID. View/reset in Settings → Google → Ads (wording varies), per Google help on Ad ID reset.
- 🟡 Per-app screen time / unlocks / opens. Third-party “usage” apps (e.g., analytics or “digital wellbeing” clones) require Usage Access (PACKAGE_USAGE_STATS). Use Android’s UsageStatsManager or apps that export CSV. Stock Digital Wellbeing does not offer an export.
- 🟡 Notification history (last 24h). Settings → Notifications → Notification history → On. OEM-optional, but present on most devices. Viewable once enabled.
- 🟡 Notification content stream (live). Grant an app Notification access to capture/export notifications going forward. (User-granted API via NotificationListenerService.) |
- 🟢 Per-app data usage (mobile/Wi-Fi). Apps/ADB can query NetworkStatsManager; Settings shows per-app totals. Advanced dumps via `adb shell dumpsys netstats`.
- 🟡 Wi-Fi detailed logs. Developer options → Enable Wi-Fi verbose logging for richer diagnostics.
- 🟡 Bluetooth packet logs. Developer options → Enable Bluetooth HCI snoop log; export file and analyze in Wireshark.
- 🟢 Per-app storage usage. Apps/ADB can query StorageStatsManager; Settings shows per-app storage.
- 🟡 Photo/video metadata (EXIF incl. location). Enable “Save location” in Camera app to embed GPS in EXIF; export files normally (EXIF remains). |
- 🟢 Downloads & file metadata. Use a file manager or connect via USB; metadata is in the files themselves. |
- 🟢 Battery usage history (per-UID/app), wakelocks, jobs. Generate adb bugreport and analyze with Battery Historian or `dumpsys batterystats`.
- 🟡 System/device logs (logcat). You can view via ADB/Android Studio. Android restricts 3rd-party access to system-wide logs for privacy.
- 🟢 Developer quick tiles (Sensors off). Developer options → Quick settings developer tiles → Sensors off to globally cut Camera/Mic & SensorManager sensors on demand.
- 🟡 Google Takeout: one-stop export for Location History (Timeline), Gmail (MBOX), Calendar (ICS), Google Photos, Drive, YouTube, Fit, etc.
- [MacroDroid](https://play.google.com/store/apps/details?id=com.arlosoft.macrodroid), [Automate](https://play.google.com/store/apps/details?id=com.llamalab.automate) and [Tasker](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm) sound like powerful Android workflow automation tools. Some uses I can put it to:
- Automatically upload recordings to Dropbox
- Turn off hotspot when I reach office
- Vibrate if I'm walking slowly
- Adding `` is an emerging approach for pointing to LLMs.txt. It works. I asked Codex to read the [CloudFlare vitest page](https://developers.cloudflare.com/workers/testing/vitest-integration/write-your-first-test/). It read the file truncating the middle, found the `