Custom Server
Configure rn-iconify to use a custom Iconify API server for faster loading, offline support, or enterprise requirements.
Why Use a Custom Server?โ
- Faster loading: Server in your region/network
- Offline/air-gapped: No external network required
- Enterprise: Compliance with network policies
- Custom icons: Serve your own icon sets
Configurationโ
Set the Iconify API server URL using configure:
import { configure } from 'rn-iconify';
// Configure before using any icons
configure({
api: {
apiUrl: 'https://your-iconify-server.com',
},
});
Self-Hosted Iconify APIโ
Docker Setupโ
Run the official Iconify API server:
docker run -d \
--name iconify-api \
-p 3000:3000 \
iconify/api
Then configure rn-iconify:
import { configure } from 'rn-iconify';
configure({
api: {
apiUrl: 'http://localhost:3000',
},
});
Production Docker Composeโ
# docker-compose.yml
version: '3.8'
services:
iconify-api:
image: iconify/api
ports:
- "3000:3000"
volumes:
- iconify-cache:/app/cache
restart: unless-stopped
environment:
- ICONIFY_SOURCE=full
volumes:
iconify-cache:
Custom Icon Setsโ
Add your own icons to the server:
# Create custom icon set
mkdir -p icons/my-icons
# Add icon JSON files
cat > icons/my-icons/icons.json << 'EOF'
{
"prefix": "my",
"icons": {
"logo": {
"body": "<path d=\"M12 2L2 7l10 5 10-5-10-5z\"/>"
},
"custom-icon": {
"body": "<circle cx=\"12\" cy=\"12\" r=\"10\"/>"
}
},
"width": 24,
"height": 24
}
EOF
# Mount to Docker container
docker run -d \
-p 3000:3000 \
-v $(pwd)/icons:/app/icons \
iconify/api
Use custom icons:
import { Icon } from 'rn-iconify';
// Use your custom icon set
<Icon name="my:logo" size={24} />
<Icon name="my:custom-icon" size={24} />
Network Configurationโ
Timeout and Retriesโ
import { configure } from 'rn-iconify';
configure({
api: {
apiUrl: 'https://your-server.com',
timeout: 10000, // 10 seconds
retries: 3,
retryDelay: 1000, // 1 second between retries
},
});
Custom Headersโ
Add custom headers (for authentication, etc.):
import { configure } from 'rn-iconify';
configure({
api: {
apiUrl: 'https://api.company.com/icons',
headers: {
'Authorization': 'Bearer your-token',
'X-API-Key': 'your-api-key',
},
},
});
Enterprise Setupโ
Internal CDNโ
Host icon assets on your CDN:
import { configure } from 'rn-iconify';
configure({
api: {
apiUrl: 'https://cdn.company.com/iconify',
},
});
Air-Gapped Environmentsโ
For completely offline environments:
- Bundle all icons using Babel plugin:
// babel.config.js
['rn-iconify/babel', {
include: ['mdi:*', 'heroicons:*'],
}],
- Or use offline bundles:
import { loadOfflineBundle } from 'rn-iconify';
import iconBundle from './icon-bundle.json';
loadOfflineBundle(iconBundle);
Server Health Checkโ
Verify server connectivity:
import { checkAPIHealth } from 'rn-iconify';
async function verifyIconServer() {
const isHealthy = await checkAPIHealth();
if (!isHealthy) {
console.error('Icon server unreachable');
// Fall back to bundled icons or show error
}
console.log('Icon server is healthy');
}
Monitoring with Performance APIโ
Monitor icon loading from your server:
import { PerformanceMonitor, enablePerformanceMonitoring } from 'rn-iconify';
// Enable monitoring
enablePerformanceMonitoring();
// Subscribe to load events
PerformanceMonitor.subscribe((event) => {
console.log(`Loaded ${event.iconName} in ${event.duration}ms`);
if (event.type === 'error') {
console.error(`Failed to load ${event.iconName}:`, event.error);
}
});
Cache Configurationโ
Configure caching behavior:
import { configure } from 'rn-iconify';
configure({
cache: {
// Max icons in memory
maxMemoryItems: 500,
// Enable disk cache (MMKV)
enableDiskCache: true,
// Disk cache key prefix
diskCachePrefix: 'rn-iconify:',
},
});
Development vs Productionโ
import { configure } from 'rn-iconify';
if (__DEV__) {
// Local server for development
configure({
api: {
apiUrl: 'http://localhost:3000',
},
});
} else {
// Production CDN
configure({
api: {
apiUrl: 'https://icons.company.com',
},
});
}
API Compatibilityโ
Custom servers must implement the Iconify API v3 endpoints:
| Endpoint | Description |
|---|---|
GET /{prefix}.json | Full icon set |
GET /{prefix}/{name}.json | Single icon |
GET /{prefix}?icons={names} | Multiple icons |
The official Iconify API Docker image implements all required endpoints.
Get Current Configurationโ
Check the current configuration:
import { getConfiguration } from 'rn-iconify';
const config = getConfiguration();
console.log('API URL:', config.api.apiUrl);
console.log('Timeout:', config.api.timeout);
Reset Configurationโ
Reset to default configuration:
import { resetConfiguration } from 'rn-iconify';
resetConfiguration();
Troubleshootingโ
CORS Errorsโ
Configure server CORS headers:
# nginx.conf
location /iconify/ {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods "GET, OPTIONS";
}
Connection Refusedโ
Check server is running and accessible:
curl http://localhost:3000/mdi.json?icons=home
Icons Not Loadingโ
Enable verbose logging:
import { configure, enablePerformanceMonitoring } from 'rn-iconify';
// Enable performance monitoring for debugging
enablePerformanceMonitoring();
// Check API health
import { checkAPIHealth } from 'rn-iconify';
const isHealthy = await checkAPIHealth();
console.log('API healthy:', isHealthy);
Next Stepsโ
- Offline Bundles - Full offline support
- Babel Plugin - Build-time bundling
- Architecture - Understanding the system