Files
Folo/apps/mobile
DIYgod a993acb754 fix(mobile): make streaming TTS start, stop and hand over reliably
Long articles often failed to start: the stream had to produce decodable
audio within a fixed 10 s, while tts.folo.is takes several seconds to send
the first bytes of a long text. The timeout didn't stop the WebView, which
kept downloading and later played audio the app no longer tracked, and
playEntryTts fell back to downloading the whole file, which could start
playing over a newer stream minutes later.

- The start timeout is a 15 s stall timer that WebView progress events
  (response headers, then chunks) restart, and it stops the WebView.
- Bridge events carry the request id, so events of a replaced or stopped
  request are ignored, and a play command always starts over instead of
  toggling the entry that is playing.
- Each WebView playback is isolated, so work left over from a replaced one
  can't stop or report on the one that replaced it.
- A superseded or stopped request never falls back and its fallback
  download is aborted. The player's stop button cancels a loading request.
- Segments start after the audio already queued (desktop got this in
  4ab06f42b), a paused stream stays paused while more audio decodes, and
  the last decode of a stream is no longer dropped.
- TTS and native playback no longer overlap: a starting stream pauses the
  native player, and native playback (a podcast, the lock screen) stops
  TTS unless that TTS request is the newer one.
- A stream whose download stalls after it started reports an error once
  its queued audio ran out, and a WebView whose content process the system
  killed is recreated instead of swallowing every later request.
- Cached TTS files are pruned once the player is set up and before each
  fallback download, keeping the file the player still holds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 18:19:26 +08:00
..
…
…
…
2026-09-18 19:14:53 +08:00

Folo Mobile App 📱

This is the mobile client for Folo, built with Expo. Folo organizes content into one timeline, keeping you updated on what matters, noise-free.

Features

  • Customized information hub for content discovery
  • AI-powered features like translation and summary
  • Dynamic content support (articles, videos, images, audio)
  • $POWER integration for creator economy
  • Cross-platform support (iOS & Android [WIP])
  • Modern UI design with native feel

Getting Started

  1. Enable Corepack (if not already enabled)

    corepack enable
    
  2. Install dependencies

    pnpm install
    
  3. Start the development server

    pnpm run dev
    

You can run the app on:

  • iOS Simulator (pnpm run ios)
  • iOS Device (pnpm run ios:device)
  • Android Emulator (pnpm run android)
  • Development build for full native feature testing

Project Structure

src/
├── modules/         # Feature-specific modules
│   ├── discover/    # Discovery feed features
│   └── ...
├── screens/         # App screens using file-based routing
└── ...

Development

  • Built with Expo SDK [>=52]
  • Uses Expo Router for navigation
  • Styling with NativeWind
  • State management with Jotai and Zustand
  • API integration with Tanstack Query
  • Full TypeScript support

Useful Resources

Need Help?

  • Join our Discord
  • Follow us on Twitter
  • Contact the mobile development team

License

This project is licensed under the GNU Affero General Public License version 3. See the main project repository for full license details.