myDefendtheParksApp is an Expo React Native mobile app focused on U.S. national parks, public-land stewardship, and Indigenous history connected to those lands.
This README is not final and is currently being polished as the app develops
- Built as a multi-screen mobile app with Expo Router.
- Pulls live park data from the National Park Service API.
- Adds Indigenous land context using the Native Land API.
- Lets users save parks locally and revisit them later.
- In active development before publishing on Apple App Store and Google Play Store.
- Helps users explore National Park Service sites by state.
- Shows a "Featured Park of the Day" on the home screen.
- Provides park profile pages with overview, hours, weather, fees, passes, contact info, image gallery, and action links from National Park Service API.
- Adds Indigenous context for park locations, including territories, languages, treaties, and place-name information when available from Native Land API.
- Lets users save and remove parks using persistent local storage.
- Emphasizes accessibility, responsive layout behavior, and clear mobile navigation.
Open What This Repo Contains
learning-react-native-app/:- full Expo React Native source code for the app
- tabs, dynamic routes, screens, components, hooks, services, and context providers
README.md:- repo-level documentation for setup, app flow, and portfolio context
- NPS + Native Land service integration:
- park lookup by state
- park detail lookup by park code
- featured park selection logic
- Indigenous context lookup by coordinates
- Local persistence layer:
- saved parks are stored with AsyncStorage and restored on app launch
Open Table of Contents
Open Requirements
- This repository is source code, not a double-click compiled app package.
- You will run it through Expo from a terminal.
- If you have never used Expo before, the easiest starting point is:
- install Node.js
- install project dependencies with
npm install - start the app with
npx expo start - open it in Expo Go, iOS Simulator, Android Emulator, or web preview
- This app is currently provided as a GitHub source repository.
- The main application lives inside
learning-react-native-app/. - There are no compiled desktop binaries or mobile store releases included in this repo at this time.
- Source availability for the current published version is governed by the custom terms in
LICENSE, and future versions may be distributed differently.
- Node.js 20+ recommended
- npm
- Expo CLI via
npx expo - One of the following to preview the app:
- Expo Go on a phone
- iOS Simulator
- Android Emulator
- web browser via Expo web
- Optional but recommended:
EXPO_PUBLIC_NPS_API_KEYEXPO_PUBLIC_NATIVE_LAND_API_KEY
- Node.js: https://nodejs.org/
- Expo: https://docs.expo.dev/
- Expo Go: https://expo.dev/go
- Android Studio: https://developer.android.com/studio
- Xcode: https://developer.apple.com/xcode/
- Install Node.js 20+.
- easiest beginner option: download from
nodejs.org - Homebrew option:
brew install node
- easiest beginner option: download from
- Confirm installs:
node --versionnpm --version
- Open a terminal in
learning-react-native-app/. - Install dependencies:
npm install
- Start Expo:
npx expo start
- Install Node.js 20+.
- easiest beginner option: download from
nodejs.org - winget option:
winget install OpenJS.NodeJS
- easiest beginner option: download from
- Confirm installs:
node --versionnpm --version
- Open a terminal in
learning-react-native-app/. - Install dependencies:
npm install
- Start Expo:
npx expo start
EXPO_PUBLIC_NATIVE_LAND_API_KEYis important if you want Indigenous context records to load reliably.- Add your own
EXPO_PUBLIC_NPS_API_KEYif you want live NPS data in your local setup. - Saved parks are local to the device/emulator because they use AsyncStorage.
- The app currently uses the folder/app config name
soft210in some Expo metadata because it grew out of course work, but the app itself is being presented and documented asmyDefendtheParksApp.
- Clone this repo:
git clone https://github.com/mp3li/myDefendtheParksApp.git
- Or download the repository ZIP from GitHub and extract it.
- Open a terminal in the app folder:
cd myDefendtheParksApp/learning-react-native-app
- Install dependencies:
npm install
- Start the Expo development server:
npx expo start
- From there you can:
- press
ifor iOS Simulator - press
afor Android Emulator - press
wfor web - scan the QR code with Expo Go on a physical phone
- press
- Start on the Home tab:
- read the project intro
- review the Featured Park of the Day
- save or remove the featured park
- Open the States tab:
- search a state
- select it
- browse parks returned by the NPS API
- Open a Park Profile:
- read the overview
- review Indigenous context when available
- check hours, address, weather, fees, passes, images, and support links
- Open the Saved Parks tab:
- revisit parks you saved earlier
- remove parks from the list
Open Full Feature List
- Introductory project messaging about conservation, land history, and stewardship.
- Featured Park of the Day:
- selected from live NPS data using date-based logic
- includes image, title, state, save/remove action, and full park content preview
- Quick actions for:
- browsing all 50 states
- opening saved parks
- refreshing the featured park
- Searchable list of all 50 U.S. states.
- Filters by state name or abbreviation.
- Simple tap-through navigation into each state's park list.
- Loads parks for the selected state from the NPS API.
- Sort order is alphabetical by park name.
- Each park row can include:
- NPS image
- full park name
- designation
- brief description
- Opens a dedicated park profile page for the selected park.
- Full park profile built from NPS park data.
- Indigenous context lookup using the park's coordinates and the Native Land API.
- Content sections include:
- Indigenous peoples connected to the land
- place-name meanings when returned
- territories, languages, and treaties
- overview/description
- activities
- topics
- weather
- operating hours
- address
- contact information
- entrance fees
- entrance passes
- image gallery with tap-to-expand modal
- "Get Involved and Defend this Park" resource links
- Supports saving/removing the park from the local saved list.
- Refreshes data when the screen regains focus.
- Hydrates local saved parks from AsyncStorage on startup.
- Lists saved parks with:
- name
- designation
- state codes
- saved date/time
- Supports reopening a saved park profile.
- Supports removing saved items from the list.
- Tab badge updates to reflect current saved count.
- Responsive layout helpers for phone/tablet sizing.
- Accessible button component designed around minimum touch-target sizing.
- Snackbar system for info/error feedback.
- Theme-aware UI behavior.
- Mobile-first navigation using Expo Router tabs plus dynamic routes.
- Continue polishing README, repo naming, and public presentation.
- Replace remaining course-era naming where appropriate.
- Strengthen testing and validation beyond linting/manual checks.
- Improve empty states, loading states, and API failure messaging.
- Expand portfolio documentation around architecture and development decisions.
Open Development Notes
- Active development.
- Originally built as course work, now being reshaped into a stronger standalone app.
- Core app flow is already implemented:
- home
- states search
- state park list
- park detail
- saved parks persistence
- Current work is centered on cleanup, presentation, and continued polish.
- Expo
~54.0.31 - React
19.1.0 - React Native
0.81.5 - Expo Router
~6.0.21 - TypeScript
~5.9.2 - Local checks currently available in repo:
npm run lintnpx tsc --noEmitnpx expo start
- This repository is source-visible on GitHub.
- The current published version is provided under the custom source-available terms in
LICENSE. - This is not an open-source license.
- Future versions of this project may not remain source-available.
- Please do not assume unrestricted reuse, redistribution, or commercial use rights.
Open Technical Specs
- App type:
- Expo React Native mobile app
- Language:
- TypeScript
- Routing:
- Expo Router
- Data sources:
- National Park Service API
- Native Land API
- Persistence:
- AsyncStorage
- Core app sections:
- Home
- States
- Park Profile
- Saved Parks