hollowscan_app/
├── App.js # Main app entry & navigation setup
├── Constants.js # Global constants & branding
├── index.js # React Native entry point
├── package.json # Dependencies (with expo-linear-gradient)
│
├── screens/ # All app screens
│ ├── HomeScreen.js # ✨ ENHANCED: Main feed with deals
│ ├── ProductDetailScreen.js # ✨ ENHANCED: Deal details & profit calc
│ ├── SavedScreen.js # Saved/bookmarked deals
│ ├── AlertsScreen.js # Push notifications
│ └── ProfileScreen.js # User profile & settings
│
├── context/ # React Context for state management
│ └── SavedContext.js # Manages saved deals
│
├── components/ # Reusable UI components (empty - ready for future)
│
├── data/ # Local data files
│ ├── channels.json # List of monitored Discord channels
│ ├── bot_users.json # Registered bot users
│ └── active_codes.json # Subscription/promo codes
│
├── assets/ # Images, fonts, etc (from Expo)
│
└── UI_IMPROVEMENTS.md # 📋 Detailed design documentation
Purpose: Display live deals from selected region and category
Key Features:
- Horizontal region selector (US, UK, CA)
- Category filter with modal (All, Collectors Amazon, etc.)
- Infinite scrolling product feed
- Pull-to-refresh functionality
- Quota tracker (4 free daily alerts)
- Search functionality
State Management:
- selectedRegion: 'US' | 'UK' | 'CA'
- selectedSub: 'ALL' | category name
- searchQuery: user search input
- alerts: array of products
- dynamicCategories: fetched from API
- quota: { used, limit }API Endpoints Used:
GET /v1/categories- Fetch available categories by regionGET /v1/feed- Fetch products with filtersGET /v1/user/status- Check daily quota
Purpose: Show detailed information about a specific product
Key Features:
- Large product image with gradient overlay
- Profit calculator (Buy, Sell, Fees, Net Profit, ROI)
- Category and region badges
- Research links (eBay, Amazon, Google)
- Transaction summary (Where to buy/sell)
- Save/Share functionality
Components:
LinkRow: Reusable link component with icon and arrow- Gradient cards for profit analysis
- Action buttons at bottom
Purpose: View bookmarked/saved deals
Features:
- Shows all saved products
- Removes from context on delete
- Access full product details via tap
Purpose: Manage push notifications and alert preferences
Features:
- Category selection for alerts
- Toggle notifications on/off
- Notification history
Purpose: User account and app settings
Features:
- User profile info
- Subscription status
- App settings
- Help/Support links
Constants.API_BASE_URL = 'http://10.246.149.243:8000'GET /v1/categories
Response: {
"US": ["Amazon US", "Walmart", ...],
"UK": ["Collectors Amazon", "Argos Instore", ...],
"CA": ["Amazon CA", ...]
}
GET /v1/feed?user_id={userId}&country={country}&category={category}&offset={offset}&limit={limit}
Response: [
{
id: "message_id",
category_name: "Collectors Amazon",
country_code: "UK",
is_locked: false,
created_at: "2024-01-31T...",
product_data: {
title: "Product Title",
price: "49.99",
resell: "99.99",
roi: "100",
image: "https://...",
buy_url: "https://..."
}
}
]
GET /v1/user/status?user_id={userId}
Response: {
views_used: 2,
views_limit: 4
}
BRAND: {
BLUE: '#2D82FF', // Primary action color
PURPLE: '#9B4DFF', // Secondary accent
DARK_BG: '#0A0A0B', // Dark mode background
LIGHT_BG: '#F8F9FE' // Light mode background
}// Headers
fontSize: 24, fontWeight: '900' // Page titles
fontSize: 22, fontWeight: '900' // Card titles
fontSize: 17, fontWeight: '900' // Section titles
// Body
fontSize: 15, fontWeight: '700' // Main text
fontSize: 14, fontWeight: '600' // Secondary text
fontSize: 13, fontWeight: '600' // Tertiary text
// Labels
fontSize: 11, fontWeight: '800' // Small labels
fontSize: 10, fontWeight: '900' // Tiny labels with spacing// Sections
marginBottom: 28px // Between major sections
marginBottom: 20px // Between cards
marginBottom: 14px // Between title and content
// Padding
paddingHorizontal: 20px
paddingHorizontal: 16px
paddingVertical: 12-16px// Small (subtle separators)
shadowOpacity: 0.05, shadowRadius: 4, elevation: 1
// Medium (cards)
shadowOpacity: 0.08-0.12, shadowRadius: 8-12, elevation: 3-5
// Large (floating elements)
shadowOpacity: 0.15-0.3, shadowRadius: 12-20, elevation: 8-10{
savedDeals: Set<id>,
toggleSave: (product) => void,
isSaved: (id) => boolean
}Usage:
const { toggleSave, isSaved } = useContext(SavedContext);
const saved = isSaved(product.id);
toggleSave(product);{
"@react-navigation/bottom-tabs": "^7.10.1",
"@react-navigation/native": "^7.1.28",
"@react-navigation/native-stack": "^7.11.0",
"expo": "~54.0.32",
"expo-blur": "~15.0.8",
"expo-linear-gradient": "~14.0.1", // NEW: Gradient support
"expo-status-bar": "~3.0.9",
"react-native": "0.81.5",
"react-native-safe-area-context": "~5.6.0"
}cd hollowscan_app
npm install
npm startnpx expo start --tunnel- Download Expo Go app
- Scan QR code from terminal
- App opens on your device
Edit Constants.js:
BRAND: {
BLUE: '#NEW_COLOR',
PURPLE: '#NEW_COLOR'
}Edit individual screen files, look for marginBottom, paddingHorizontal, etc.
Search for fontSize, fontWeight in screen files and update values.
- Create new screen in
screens/ - Add to bottom tab navigator in
App.js - Import and configure routing
const fetchData = async () => {
try {
const response = await fetch(`${Constants.API_BASE_URL}/v1/endpoint`);
const data = await response.json();
setData(data);
} catch (e) {
console.log("Error:", e);
}
};- Create
components/ProductCard.js - Accept
{ product, onPress }as props - Export and use in screen
Check isDarkMode variable and apply conditional colors:
const colors = isDarkMode ? { ... } : { ... };- Check API is running:
http://10.246.149.243:8000/v1/categories - Verify
channels.jsonis populated in Discord backend - Check network connectivity
- Verify product image URLs are valid
- Check CORS if fetching from external sources
- Use
https://via.placeholder.com/400as fallback
- Ensure
setFilterVisible(true)is called - Check TouchableOpacity onPress handler
- Verify Modal visibility state
Last Updated: January 31, 2026