The official MrDemonWolf mobile app for my website. Portfolio, blog reader, bookmarks, push notifications, and dark mode — built with Expo and React Native.
- About — Profile screen with circular avatar, role tagline, social links, and bio pulled directly from a WordPress user.
- Blog — Infinite scroll blog feed with featured images, author metadata, categories, and full post reading with rich HTML rendering.
- Bookmarks — Save blog posts locally with SQLite-backed offline bookmarks.
- Portfolio — Portfolio showcase with detail screens.
- Contact — Contact form with invisible device attestation via Firebase App Check and PackRelay/WPForms backend.
- Push Notifications — Subscribe to new blog post notifications via TailSignal, with automatic device registration, auto re-registration on app launch, rich notification images (iOS), and deep linking to posts.
- Settings — Theme (light/dark/auto), font size scaling, haptic feedback toggle (iOS), notifications toggle, and cache management.
- Tab Persistence — Remembers your last visited tab across app launches.
- Platform Optimized — Native tabs with SF Symbols on iOS, Material Design on Android.
- Framework: Expo SDK 55 with React Native 0.83 (New Architecture)
- Navigation: Expo Router with native tabs and file-based routing
- Data Fetching: React Query with WordPress REST API
- Styling: NativeWind (Tailwind CSS) with light/dark mode support
- Icons: expo-symbols (SF Symbols on iOS), MaterialIcons via @expo/vector-icons (Android)
- Local Storage: expo-sqlite for bookmarks, AsyncStorage for settings
- Notifications: expo-notifications with TailSignal backend, iOS Notification Service Extension for rich images
- State: React Context with AsyncStorage persistence
- Platforms: iOS, Android, and web
- Node.js 20.x or later
- pnpm 9.x
- Xcode (for iOS development)
- Android Studio (for Android development)
-
Clone the repository:
git clone https://github.com/MrDemonWolf/official-app.git cd official-app -
Install dependencies:
pnpm install
-
Copy environment variables:
cp .env.example .env
-
Configure your environment variables in
.env(see Environment Variables below) -
Start the development server:
pnpm start
pnpm start— Start Expo dev serverpnpm ios— Run on iOS simulatorpnpm android— Run on Android emulatorpnpm web— Start for webpnpm lint— Run ESLintpnpm type-check— Run TypeScript type checkingpnpm prebuild— Generate native projectspnpm prebuild:clean— Clean and regenerate native projects
Copy .env.example to .env and configure the values for your WordPress site:
| Variable | Description |
|---|---|
EXPO_PUBLIC_WORDPRESS_API_URL |
WordPress REST API base URL (e.g. https://yoursite.com/wp-json/wp/v2) |
EXPO_PUBLIC_WORDPRESS_USER_ID |
WordPress user ID for the About screen profile (defaults to 1) |
EXPO_PUBLIC_APP_VARIANT |
App variant — development or production |
EXPO_PUBLIC_PACKRELAY_API_URL |
PackRelay REST API base URL for the contact form (e.g. https://yoursite.com/wp-json/packrelay/v1) |
EXPO_PUBLIC_PACKRELAY_FORM_ID |
WPForms form ID used by PackRelay for the contact form |
EXPO_PUBLIC_TAILSIGNAL_API_URL |
TailSignal REST API base URL for push notification device registration |
APPLE_TEAM_ID |
Apple Developer Team ID (required for iOS builds — used by @bacons/apple-targets for extension code signing) |
| Plugin | Description |
|---|---|
| TailSignal | Push notification registration and delivery for Expo apps |
| PackRelay | Contact form relay that bridges WPForms with mobile apps via Firebase App Check |
| ACF (Advanced Custom Fields) | Custom user fields for social links and role/tagline |
The About screen pulls social links and a role/tagline from ACF (Advanced Custom Fields) user fields. Install the ACF plugin on your WordPress site, then create a field group:
-
Go to ACF > Field Groups and create a new group (e.g. "User Profile")
-
Add a Text field for
role_title -
Add a Repeater field named
social_linkswith these sub-fields:Sub-field Label Field Name Field Type Required Platform platformSelect or Text Yes URL urlURL Yes Icon URL icon_urlURL No Label labelText No -
Set the Location rule to: User Role is equal to All
-
Under Settings, enable Show in REST API
-
Add social links on your WordPress user profile — each row is a platform + URL
The app bundles icons for 14 platforms: github, discord, x, twitch, youtube, facebook, instagram, bluesky, linkedin, mastodon, threads, tiktok, reddit, steam. Use website for a globe icon. For any other platform, provide an icon_url pointing to a remote SVG/PNG and it will be loaded automatically. Add, remove, or reorder links in WordPress without any app changes.
This project uses:
- ESLint for code linting
- TypeScript for type safety
- React Compiler for automatic optimization
- Typed Routes for compile-time route checking
Builds are managed through EAS Build.
# Build for iOS
eas build --platform ios
# Build for Android
eas build --platform android
# Submit to App Store
eas submit --platform ios
# Submit to Play Store
eas submit --platform android| Profile | Distribution | Channel | Description |
|---|---|---|---|
development |
Internal | development |
Development client for testing |
production |
Store | production |
Production build with auto-increment versioning |
If you have any questions, suggestions, or feedback, feel free to reach out!
- Discord: Join my server
Made with ❤️ by MrDemonWolf, Inc.