WiseLens (慧眼) is a mobile application designed to help elderly users identify fake news and misleading information, primarily in WeChat articles. It consists of:
- backend/ - Python FastAPI service that crawls articles and uses DeepSeek LLM for analysis (used by web app)
- ios/ - Primary iOS app (iPhone-only) built with Kotlin Multiplatform + SwiftUI. Calls DeepSeek API directly without backend.
- web/ - Expo-based web app that connects to the backend service
cd backend
pip install -r requirements.txt
python main.py # Runs on http://localhost:8000Requires DEEPSEEK_API_KEY in .env file.
cd ios
./gradlew :composeApp:linkDebugFrameworkIosSimulatorArm64 # Build for simulator
./gradlew :composeApp:linkDebugFrameworkIosArm64 # Build for deviceThen open ios/iosApp/iosApp.xcodeproj in Xcode and run.
cd web
npm install
npm run web # Web version at localhost:8081iOS App (standalone - no backend required):
- User shares URL from WeChat/Safari via Share Extension, or pastes content
- App fetches and parses WeChat article HTML directly (Ktor + regex)
- Sends content to DeepSeek API for credibility analysis
- Returns verdict:
reliable(✅),caution(⚠️ ), ormisleading(❌)
Web App (requires backend):
- User pastes URL or text content
- Web app sends POST to backend
/analyzeendpoint - Backend crawls WeChat article (BeautifulSoup) and calls DeepSeek LLM
- Returns verdict to web app
Backend:
main.py- FastAPI routes, WeChat crawler, and LLM integration
iOS (KMP):
composeApp/src/commonMain/kotlin/.../network/MediaFilterApi.kt- Ktor HTTP client (updatebaseUrlfor device testing)composeApp/src/commonMain/kotlin/.../data/Models.kt- Shared data modelsiosApp/iosApp/ContentView.swift- SwiftUI main view with dark/light themeiosApp/ShareExtension/ShareViewController.swift- iOS share extensioniosApp/ShareExtension/ShareExtensionPreprocessor.js- Extracts original URL from WeChat pages
Web (Expo):
app/index.tsx- Home screenlib/api.ts- API client
The iOS app uses a native Swift share extension with App Group group.com.wiselens.computerization. WeChat modifies URLs via history.replaceState, stripping parameters. The share extension uses a JavaScript preprocessor to extract the original URL from meta tags (og:url, canonical).
For physical device testing, update API URLs from localhost to your Mac's LAN IP:
- iOS:
ios/composeApp/src/commonMain/kotlin/.../network/MediaFilterApi.kt→baseUrl - Web:
web/lib/api.ts→API_BASE_URL
- iOS App:
com.wiselens.media-filter(iPhone-only, no iPad support) - iOS Share Extension:
com.wiselens.media-filter.ShareExtension - App Group:
group.com.wiselens.computerization - URL Scheme:
mediafilter-kmp - Web/Expo:
com.computerization.mediafilter