EEltaCrew
Home › Blog

How to open .md files on Android when AI-generated markdown shows up as raw symbols

Published 2026-09-29Measured 2026-09-28About 2 min readelta · EltaCrew

Open a .md file from ChatGPT, Claude or Codex, an Obsidian note or a GitHub README on your phone and you often see raw #, * and |. Why that happens, three ways to read markdown properly on Android, and what breaks most often, from building a markdown viewer.

Why you only see symbols

Markdown (.md) stores formatting as plain-text instructions. # Title means "this line is a heading", - [ ] means "checkbox", | a | b | means "a table row". A renderer has to read those instructions and draw the heading, table or checklist.

On a computer, VS Code, Obsidian or GitHub does that for you. On a phone, tapping the file often opens a plain text editor, so you see the instructions instead of the result. This has become much more common because of AI tools: CLAUDE.md and AGENTS.md config files, and every "summarize this chat as a .md file" export, are all markdown.

Three ways to read it properly on your phone

  1. GitHub app or website — simplest for a README that already lives in a repository. It does not help with files you received by email or chat.
  2. Import into a notes app — create a vault in Obsidian mobile or a similar app and drop the file in. A lot of setup just to glance at one file.
  3. Open it directly in a markdown viewer app — tap the file or pick it from the app's "Open file" and it renders right away. For checking one file quickly, this is the shortest path.

What to check in a viewer

While building an Android markdown viewer (MdViewer), these are the parts that break most often on real files:

Summary

AndroidMarkdownProductivityMdViewer

Related

R8 on, build green, app broken: five runtime traps that actually hit across 15 appsI enabled R8 in 15 apps for Play's 2027 code-optimization requirement. Every build passed, but 2 of the first 7 I installed broke at runtime. Gson deserialization, getIdentifier resource lookups, Room _Impl classes, and debuggable builds that silently disable R8: the kinds of failure that never show up in a crash log.Why switching language inside the app sometimes does nothing: setApplicationLocales only recreates activities that are on screen"I switched to English and it stayed Korean until I restarted the app." The cause is that AppCompat recreates only the activities that are started at that moment; screens that were stopped behind it come back in the old language. The fix I applied to 8 apps, and five traps that came with it.Seven rules I rewrote 13 home-screen widgets against, after placing them next to Samsung'sPutting 13 widgets from 5 apps on a real home screen beside Samsung's weather and wallet widgets showed that "the code exists" and "it looks like a shipped product" are very different. System dark mode, designed empty states, previewLayout and label, dp corner radii, and the theme lag of bitmap widgets.