v1.0.0 - First stable release
Stable version with: - WellNuo mobile app (React Native + Expo) - Beneficiaries management - Dashboard integration - API documentation in wellnuoSheme/ - App icons and assets - EAS build configuration 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
13
app.json
@ -9,7 +9,11 @@
|
|||||||
"userInterfaceStyle": "automatic",
|
"userInterfaceStyle": "automatic",
|
||||||
"newArchEnabled": true,
|
"newArchEnabled": true,
|
||||||
"ios": {
|
"ios": {
|
||||||
"supportsTablet": true
|
"supportsTablet": true,
|
||||||
|
"bundleIdentifier": "com.wellnuo.app",
|
||||||
|
"infoPlist": {
|
||||||
|
"ITSAppUsesNonExemptEncryption": false
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"android": {
|
"android": {
|
||||||
"adaptiveIcon": {
|
"adaptiveIcon": {
|
||||||
@ -43,6 +47,13 @@
|
|||||||
"experiments": {
|
"experiments": {
|
||||||
"typedRoutes": true,
|
"typedRoutes": true,
|
||||||
"reactCompiler": true
|
"reactCompiler": true
|
||||||
|
},
|
||||||
|
"extra": {
|
||||||
|
"router": {},
|
||||||
|
"eas": {
|
||||||
|
"projectId": "4a77e46d-7b0e-4ace-a385-006b07027234"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"owner": "kosyakorel1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { Tabs } from 'expo-router';
|
import { Tabs } from 'expo-router';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Ionicons } from '@expo/vector-icons';
|
import { Feather } from '@expo/vector-icons';
|
||||||
|
|
||||||
import { HapticTab } from '@/components/haptic-tab';
|
import { HapticTab } from '@/components/haptic-tab';
|
||||||
import { AppColors } from '@/constants/theme';
|
import { AppColors } from '@/constants/theme';
|
||||||
@ -18,6 +18,13 @@ export default function TabLayout() {
|
|||||||
tabBarStyle: {
|
tabBarStyle: {
|
||||||
backgroundColor: isDark ? '#151718' : AppColors.background,
|
backgroundColor: isDark ? '#151718' : AppColors.background,
|
||||||
borderTopColor: isDark ? '#2D3135' : AppColors.border,
|
borderTopColor: isDark ? '#2D3135' : AppColors.border,
|
||||||
|
height: 85,
|
||||||
|
paddingBottom: 25,
|
||||||
|
paddingTop: 10,
|
||||||
|
},
|
||||||
|
tabBarLabelStyle: {
|
||||||
|
fontSize: 11,
|
||||||
|
fontWeight: '500',
|
||||||
},
|
},
|
||||||
headerShown: false,
|
headerShown: false,
|
||||||
tabBarButton: HapticTab,
|
tabBarButton: HapticTab,
|
||||||
@ -26,13 +33,13 @@ export default function TabLayout() {
|
|||||||
<Tabs.Screen
|
<Tabs.Screen
|
||||||
name="index"
|
name="index"
|
||||||
options={{
|
options={{
|
||||||
title: 'Home',
|
title: 'Dashboard',
|
||||||
tabBarIcon: ({ color, size }) => (
|
tabBarIcon: ({ color, size }) => (
|
||||||
<Ionicons name="home" size={size} color={color} />
|
<Feather name="grid" size={22} color={color} />
|
||||||
),
|
),
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
{/* Hide dashboard - now accessed via beneficiary selection */}
|
{/* Hide old dashboard - now index shows WebView dashboard */}
|
||||||
<Tabs.Screen
|
<Tabs.Screen
|
||||||
name="dashboard"
|
name="dashboard"
|
||||||
options={{
|
options={{
|
||||||
@ -44,7 +51,7 @@ export default function TabLayout() {
|
|||||||
options={{
|
options={{
|
||||||
title: 'Chat',
|
title: 'Chat',
|
||||||
tabBarIcon: ({ color, size }) => (
|
tabBarIcon: ({ color, size }) => (
|
||||||
<Ionicons name="chatbubble-ellipses" size={size} color={color} />
|
<Feather name="message-circle" size={22} color={color} />
|
||||||
),
|
),
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
@ -53,7 +60,7 @@ export default function TabLayout() {
|
|||||||
options={{
|
options={{
|
||||||
title: 'Profile',
|
title: 'Profile',
|
||||||
tabBarIcon: ({ color, size }) => (
|
tabBarIcon: ({ color, size }) => (
|
||||||
<Ionicons name="person" size={size} color={color} />
|
<Feather name="user" size={22} color={color} />
|
||||||
),
|
),
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
@ -64,6 +71,13 @@ export default function TabLayout() {
|
|||||||
href: null,
|
href: null,
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
{/* Beneficiaries - hidden from tab bar but keeps tab bar visible */}
|
||||||
|
<Tabs.Screen
|
||||||
|
name="beneficiaries"
|
||||||
|
options={{
|
||||||
|
href: null,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</Tabs>
|
</Tabs>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,10 +4,13 @@ import { WebView } from 'react-native-webview';
|
|||||||
import { Ionicons } from '@expo/vector-icons';
|
import { Ionicons } from '@expo/vector-icons';
|
||||||
import { SafeAreaView } from 'react-native-safe-area-context';
|
import { SafeAreaView } from 'react-native-safe-area-context';
|
||||||
import { useLocalSearchParams, router } from 'expo-router';
|
import { useLocalSearchParams, router } from 'expo-router';
|
||||||
|
import * as SecureStore from 'expo-secure-store';
|
||||||
import { useBeneficiary } from '@/contexts/BeneficiaryContext';
|
import { useBeneficiary } from '@/contexts/BeneficiaryContext';
|
||||||
import { AppColors, BorderRadius, FontSizes, Spacing } from '@/constants/theme';
|
import { AppColors, BorderRadius, FontSizes, Spacing } from '@/constants/theme';
|
||||||
import { FullScreenError } from '@/components/ui/ErrorMessage';
|
import { FullScreenError } from '@/components/ui/ErrorMessage';
|
||||||
|
|
||||||
|
// Start with login page, then redirect to dashboard after auth
|
||||||
|
const LOGIN_URL = 'https://react.eluxnetworks.net/login';
|
||||||
const DASHBOARD_URL = 'https://react.eluxnetworks.net/dashboard';
|
const DASHBOARD_URL = 'https://react.eluxnetworks.net/dashboard';
|
||||||
|
|
||||||
export default function BeneficiaryDashboardScreen() {
|
export default function BeneficiaryDashboardScreen() {
|
||||||
@ -17,9 +20,56 @@ export default function BeneficiaryDashboardScreen() {
|
|||||||
const [isLoading, setIsLoading] = useState(true);
|
const [isLoading, setIsLoading] = useState(true);
|
||||||
const [error, setError] = useState<string | null>(null);
|
const [error, setError] = useState<string | null>(null);
|
||||||
const [canGoBack, setCanGoBack] = useState(false);
|
const [canGoBack, setCanGoBack] = useState(false);
|
||||||
|
const [authToken, setAuthToken] = useState<string | null>(null);
|
||||||
|
const [userName, setUserName] = useState<string | null>(null);
|
||||||
|
const [userId, setUserId] = useState<string | null>(null);
|
||||||
|
const [isTokenLoaded, setIsTokenLoaded] = useState(false);
|
||||||
|
const [webViewUrl, setWebViewUrl] = useState(DASHBOARD_URL);
|
||||||
|
|
||||||
const beneficiaryName = currentBeneficiary?.name || 'Dashboard';
|
const beneficiaryName = currentBeneficiary?.name || 'Dashboard';
|
||||||
|
|
||||||
|
// Load token, username, and userId from SecureStore
|
||||||
|
useEffect(() => {
|
||||||
|
const loadCredentials = async () => {
|
||||||
|
try {
|
||||||
|
const token = await SecureStore.getItemAsync('accessToken');
|
||||||
|
const user = await SecureStore.getItemAsync('userName');
|
||||||
|
const uid = await SecureStore.getItemAsync('userId');
|
||||||
|
setAuthToken(token);
|
||||||
|
setUserName(user);
|
||||||
|
setUserId(uid);
|
||||||
|
console.log('Loaded credentials for WebView:', { hasToken: !!token, user, uid });
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Failed to load credentials:', err);
|
||||||
|
} finally {
|
||||||
|
setIsTokenLoaded(true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
loadCredentials();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
// JavaScript to inject token into localStorage before page loads
|
||||||
|
// Web app uses auth2 key with JSON object: {username, token, user_id}
|
||||||
|
const injectedJavaScript = authToken
|
||||||
|
? `
|
||||||
|
(function() {
|
||||||
|
try {
|
||||||
|
// Web app expects auth2 as JSON object with these exact fields
|
||||||
|
var authData = {
|
||||||
|
username: '${userName || ''}',
|
||||||
|
token: '${authToken}',
|
||||||
|
user_id: ${userId || 'null'}
|
||||||
|
};
|
||||||
|
localStorage.setItem('auth2', JSON.stringify(authData));
|
||||||
|
console.log('Auth data injected:', authData.username, 'user_id:', authData.user_id);
|
||||||
|
} catch(e) {
|
||||||
|
console.error('Failed to inject token:', e);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
true;
|
||||||
|
`
|
||||||
|
: '';
|
||||||
|
|
||||||
const handleRefresh = () => {
|
const handleRefresh = () => {
|
||||||
setError(null);
|
setError(null);
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
@ -45,6 +95,25 @@ export default function BeneficiaryDashboardScreen() {
|
|||||||
router.back();
|
router.back();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Wait for token to load before showing WebView
|
||||||
|
if (!isTokenLoaded) {
|
||||||
|
return (
|
||||||
|
<SafeAreaView style={styles.container} edges={['top']}>
|
||||||
|
<View style={styles.header}>
|
||||||
|
<TouchableOpacity style={styles.backButton} onPress={handleGoBack}>
|
||||||
|
<Ionicons name="arrow-back" size={24} color={AppColors.textPrimary} />
|
||||||
|
</TouchableOpacity>
|
||||||
|
<Text style={styles.headerTitle}>{beneficiaryName}</Text>
|
||||||
|
<View style={styles.placeholder} />
|
||||||
|
</View>
|
||||||
|
<View style={styles.loadingContainer}>
|
||||||
|
<ActivityIndicator size="large" color={AppColors.primary} />
|
||||||
|
<Text style={styles.loadingText}>Preparing dashboard...</Text>
|
||||||
|
</View>
|
||||||
|
</SafeAreaView>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
return (
|
return (
|
||||||
<SafeAreaView style={styles.container} edges={['top']}>
|
<SafeAreaView style={styles.container} edges={['top']}>
|
||||||
@ -100,7 +169,7 @@ export default function BeneficiaryDashboardScreen() {
|
|||||||
<View style={styles.webViewContainer}>
|
<View style={styles.webViewContainer}>
|
||||||
<WebView
|
<WebView
|
||||||
ref={webViewRef}
|
ref={webViewRef}
|
||||||
source={{ uri: DASHBOARD_URL }}
|
source={{ uri: webViewUrl }}
|
||||||
style={styles.webView}
|
style={styles.webView}
|
||||||
onLoadStart={() => setIsLoading(true)}
|
onLoadStart={() => setIsLoading(true)}
|
||||||
onLoadEnd={() => setIsLoading(false)}
|
onLoadEnd={() => setIsLoading(false)}
|
||||||
@ -112,6 +181,10 @@ export default function BeneficiaryDashboardScreen() {
|
|||||||
startInLoadingState={true}
|
startInLoadingState={true}
|
||||||
scalesPageToFit={true}
|
scalesPageToFit={true}
|
||||||
allowsBackForwardNavigationGestures={true}
|
allowsBackForwardNavigationGestures={true}
|
||||||
|
// Inject token into localStorage BEFORE content loads
|
||||||
|
injectedJavaScriptBeforeContentLoaded={injectedJavaScript}
|
||||||
|
// Also inject after load in case page reads localStorage late
|
||||||
|
injectedJavaScript={injectedJavaScript}
|
||||||
renderLoading={() => (
|
renderLoading={() => (
|
||||||
<View style={styles.loadingContainer}>
|
<View style={styles.loadingContainer}>
|
||||||
<ActivityIndicator size="large" color={AppColors.primary} />
|
<ActivityIndicator size="large" color={AppColors.primary} />
|
||||||
@ -144,7 +217,7 @@ export default function BeneficiaryDashboardScreen() {
|
|||||||
|
|
||||||
<TouchableOpacity
|
<TouchableOpacity
|
||||||
style={styles.quickAction}
|
style={styles.quickAction}
|
||||||
onPress={() => router.push(`/beneficiaries/${id}`)}
|
onPress={() => router.push(`./`)}
|
||||||
>
|
>
|
||||||
<Ionicons name="person" size={24} color={AppColors.primary} />
|
<Ionicons name="person" size={24} color={AppColors.primary} />
|
||||||
<Text style={styles.quickActionText}>Details</Text>
|
<Text style={styles.quickActionText}>Details</Text>
|
||||||
@ -1,143 +1,127 @@
|
|||||||
import React, { useState, useEffect, useCallback } from 'react';
|
import React, { useState, useRef, useEffect } from 'react';
|
||||||
import {
|
import { View, Text, StyleSheet, ActivityIndicator, TouchableOpacity } from 'react-native';
|
||||||
View,
|
import { WebView } from 'react-native-webview';
|
||||||
Text,
|
|
||||||
StyleSheet,
|
|
||||||
FlatList,
|
|
||||||
TouchableOpacity,
|
|
||||||
RefreshControl,
|
|
||||||
} from 'react-native';
|
|
||||||
import { router } from 'expo-router';
|
|
||||||
import { Ionicons } from '@expo/vector-icons';
|
import { Ionicons } from '@expo/vector-icons';
|
||||||
import { SafeAreaView } from 'react-native-safe-area-context';
|
import { SafeAreaView } from 'react-native-safe-area-context';
|
||||||
import { api } from '@/services/api';
|
import * as SecureStore from 'expo-secure-store';
|
||||||
import { useAuth } from '@/contexts/AuthContext';
|
import { useAuth } from '@/contexts/AuthContext';
|
||||||
import { useBeneficiary } from '@/contexts/BeneficiaryContext';
|
import { AppColors, FontSizes, Spacing } from '@/constants/theme';
|
||||||
import { LoadingSpinner } from '@/components/ui/LoadingSpinner';
|
|
||||||
import { FullScreenError } from '@/components/ui/ErrorMessage';
|
|
||||||
import { AppColors, BorderRadius, FontSizes, Spacing } from '@/constants/theme';
|
|
||||||
import type { Beneficiary } from '@/types';
|
|
||||||
|
|
||||||
export default function BeneficiariesListScreen() {
|
const DASHBOARD_URL = 'https://react.eluxnetworks.net/dashboard';
|
||||||
|
|
||||||
|
export default function HomeScreen() {
|
||||||
const { user } = useAuth();
|
const { user } = useAuth();
|
||||||
const { setCurrentBeneficiary } = useBeneficiary();
|
const webViewRef = useRef<WebView>(null);
|
||||||
const [beneficiaries, setBeneficiaries] = useState<Beneficiary[]>([]);
|
|
||||||
const [isLoading, setIsLoading] = useState(true);
|
const [isLoading, setIsLoading] = useState(true);
|
||||||
const [isRefreshing, setIsRefreshing] = useState(false);
|
|
||||||
const [error, setError] = useState<string | null>(null);
|
const [error, setError] = useState<string | null>(null);
|
||||||
|
const [canGoBack, setCanGoBack] = useState(false);
|
||||||
|
const [authToken, setAuthToken] = useState<string | null>(null);
|
||||||
|
const [userName, setUserName] = useState<string | null>(null);
|
||||||
|
const [userId, setUserId] = useState<string | null>(null);
|
||||||
|
const [isTokenLoaded, setIsTokenLoaded] = useState(false);
|
||||||
|
|
||||||
const loadBeneficiaries = useCallback(async (showLoading = true) => {
|
// Load credentials from SecureStore
|
||||||
if (showLoading) setIsLoading(true);
|
useEffect(() => {
|
||||||
setError(null);
|
const loadCredentials = async () => {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const response = await api.getBeneficiaries();
|
const token = await SecureStore.getItemAsync('accessToken');
|
||||||
|
const user = await SecureStore.getItemAsync('userName');
|
||||||
if (response.ok && response.data) {
|
const uid = await SecureStore.getItemAsync('userId');
|
||||||
setBeneficiaries(response.data.beneficiaries);
|
setAuthToken(token);
|
||||||
} else {
|
setUserName(user);
|
||||||
setError(response.error?.message || 'Failed to load beneficiaries');
|
setUserId(uid);
|
||||||
}
|
console.log('Home: Loaded credentials for WebView:', { hasToken: !!token, user, uid });
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setError(err instanceof Error ? err.message : 'An error occurred');
|
console.error('Failed to load credentials:', err);
|
||||||
} finally {
|
} finally {
|
||||||
setIsLoading(false);
|
setIsTokenLoaded(true);
|
||||||
setIsRefreshing(false);
|
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
loadCredentials();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
// JavaScript to inject auth token into localStorage
|
||||||
loadBeneficiaries();
|
// Web app expects auth2 as JSON: {username, token, user_id}
|
||||||
}, [loadBeneficiaries]);
|
const injectedJavaScript = authToken
|
||||||
|
? `
|
||||||
|
(function() {
|
||||||
|
try {
|
||||||
|
var authData = {
|
||||||
|
username: '${userName || ''}',
|
||||||
|
token: '${authToken}',
|
||||||
|
user_id: ${userId || 'null'}
|
||||||
|
};
|
||||||
|
localStorage.setItem('auth2', JSON.stringify(authData));
|
||||||
|
console.log('Auth injected:', authData.username);
|
||||||
|
} catch(e) {
|
||||||
|
console.error('Failed to inject token:', e);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
true;
|
||||||
|
`
|
||||||
|
: '';
|
||||||
|
|
||||||
const handleRefresh = useCallback(() => {
|
const handleRefresh = () => {
|
||||||
setIsRefreshing(true);
|
setError(null);
|
||||||
loadBeneficiaries(false);
|
setIsLoading(true);
|
||||||
}, [loadBeneficiaries]);
|
webViewRef.current?.reload();
|
||||||
|
|
||||||
const handleBeneficiaryPress = (beneficiary: Beneficiary) => {
|
|
||||||
// Set current beneficiary in context before navigating
|
|
||||||
setCurrentBeneficiary(beneficiary);
|
|
||||||
// Navigate directly to their dashboard
|
|
||||||
router.push(`/beneficiaries/${beneficiary.id}/dashboard`);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const renderBeneficiaryCard = ({ item }: { item: Beneficiary }) => (
|
const handleWebViewBack = () => {
|
||||||
<TouchableOpacity
|
if (canGoBack) {
|
||||||
style={styles.beneficiaryCard}
|
webViewRef.current?.goBack();
|
||||||
onPress={() => handleBeneficiaryPress(item)}
|
}
|
||||||
activeOpacity={0.7}
|
};
|
||||||
>
|
|
||||||
<View style={styles.beneficiaryInfo}>
|
|
||||||
<View style={styles.avatarContainer}>
|
|
||||||
<Text style={styles.avatarText}>
|
|
||||||
{item.name.charAt(0).toUpperCase()}
|
|
||||||
</Text>
|
|
||||||
<View
|
|
||||||
style={[
|
|
||||||
styles.statusIndicator,
|
|
||||||
item.status === 'online' ? styles.online : styles.offline,
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
</View>
|
|
||||||
|
|
||||||
<View style={styles.beneficiaryDetails}>
|
const handleNavigationStateChange = (navState: any) => {
|
||||||
<Text style={styles.beneficiaryName}>{item.name}</Text>
|
setCanGoBack(navState.canGoBack);
|
||||||
<Text style={styles.beneficiaryRelationship}>{item.relationship}</Text>
|
};
|
||||||
<Text style={styles.lastActivity}>
|
|
||||||
<Ionicons name="time-outline" size={12} color={AppColors.textMuted} />{' '}
|
|
||||||
{item.last_activity}
|
|
||||||
</Text>
|
|
||||||
</View>
|
|
||||||
</View>
|
|
||||||
|
|
||||||
{item.sensor_data && (
|
const handleError = () => {
|
||||||
<View style={styles.sensorStats}>
|
setError('Failed to load dashboard. Please check your internet connection.');
|
||||||
<View style={styles.statItem}>
|
setIsLoading(false);
|
||||||
<Ionicons
|
};
|
||||||
name={item.sensor_data.motion_detected ? "walk" : "walk-outline"}
|
|
||||||
size={16}
|
|
||||||
color={item.sensor_data.motion_detected ? AppColors.online : AppColors.textMuted}
|
|
||||||
/>
|
|
||||||
<Text style={styles.statValue}>
|
|
||||||
{item.sensor_data.motion_detected ? 'Active' : 'Inactive'}
|
|
||||||
</Text>
|
|
||||||
<Text style={styles.statLabel}>Motion</Text>
|
|
||||||
</View>
|
|
||||||
<View style={styles.statItem}>
|
|
||||||
<Ionicons
|
|
||||||
name={item.sensor_data.door_status === 'open' ? "enter-outline" : "home-outline"}
|
|
||||||
size={16}
|
|
||||||
color={item.sensor_data.door_status === 'open' ? AppColors.warning : AppColors.primary}
|
|
||||||
/>
|
|
||||||
<Text style={styles.statValue}>
|
|
||||||
{item.sensor_data.door_status === 'open' ? 'Open' : 'Closed'}
|
|
||||||
</Text>
|
|
||||||
<Text style={styles.statLabel}>Door</Text>
|
|
||||||
</View>
|
|
||||||
<View style={styles.statItem}>
|
|
||||||
<Ionicons name="thermometer-outline" size={16} color={AppColors.primaryDark} />
|
|
||||||
<Text style={styles.statValue}>{item.sensor_data.temperature}°</Text>
|
|
||||||
<Text style={styles.statLabel}>Temp</Text>
|
|
||||||
</View>
|
|
||||||
</View>
|
|
||||||
)}
|
|
||||||
|
|
||||||
<Ionicons
|
// Wait for token to load
|
||||||
name="chevron-forward"
|
if (!isTokenLoaded) {
|
||||||
size={20}
|
return (
|
||||||
color={AppColors.textMuted}
|
<SafeAreaView style={styles.container} edges={['top']}>
|
||||||
style={styles.chevron}
|
<View style={styles.header}>
|
||||||
/>
|
<View>
|
||||||
</TouchableOpacity>
|
<Text style={styles.greeting}>Hello, {user?.user_name || 'User'}</Text>
|
||||||
|
<Text style={styles.headerTitle}>Dashboard</Text>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
<View style={styles.loadingContainer}>
|
||||||
|
<ActivityIndicator size="large" color={AppColors.primary} />
|
||||||
|
<Text style={styles.loadingText}>Preparing dashboard...</Text>
|
||||||
|
</View>
|
||||||
|
</SafeAreaView>
|
||||||
);
|
);
|
||||||
|
|
||||||
if (isLoading) {
|
|
||||||
return <LoadingSpinner fullScreen message="Loading beneficiaries..." />;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
return <FullScreenError message={error} onRetry={() => loadBeneficiaries()} />;
|
return (
|
||||||
|
<SafeAreaView style={styles.container} edges={['top']}>
|
||||||
|
<View style={styles.header}>
|
||||||
|
<View>
|
||||||
|
<Text style={styles.greeting}>Hello, {user?.user_name || 'User'}</Text>
|
||||||
|
<Text style={styles.headerTitle}>Dashboard</Text>
|
||||||
|
</View>
|
||||||
|
<TouchableOpacity style={styles.refreshButton} onPress={handleRefresh}>
|
||||||
|
<Ionicons name="refresh" size={22} color={AppColors.primary} />
|
||||||
|
</TouchableOpacity>
|
||||||
|
</View>
|
||||||
|
<View style={styles.errorContainer}>
|
||||||
|
<Ionicons name="cloud-offline-outline" size={64} color={AppColors.textMuted} />
|
||||||
|
<Text style={styles.errorTitle}>Connection Error</Text>
|
||||||
|
<Text style={styles.errorText}>{error}</Text>
|
||||||
|
<TouchableOpacity style={styles.retryButton} onPress={handleRefresh}>
|
||||||
|
<Text style={styles.retryButtonText}>Try Again</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
</View>
|
||||||
|
</SafeAreaView>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -145,40 +129,53 @@ export default function BeneficiariesListScreen() {
|
|||||||
{/* Header */}
|
{/* Header */}
|
||||||
<View style={styles.header}>
|
<View style={styles.header}>
|
||||||
<View>
|
<View>
|
||||||
<Text style={styles.greeting}>
|
<Text style={styles.greeting}>Hello, {user?.user_name || 'User'}</Text>
|
||||||
Hello, {user?.user_name || 'User'}
|
<Text style={styles.headerTitle}>Dashboard</Text>
|
||||||
</Text>
|
|
||||||
<Text style={styles.headerTitle}>Beneficiaries</Text>
|
|
||||||
</View>
|
</View>
|
||||||
<TouchableOpacity style={styles.addButton}>
|
<View style={styles.headerActions}>
|
||||||
<Ionicons name="add" size={24} color={AppColors.white} />
|
{canGoBack && (
|
||||||
|
<TouchableOpacity style={styles.actionButton} onPress={handleWebViewBack}>
|
||||||
|
<Ionicons name="chevron-back" size={22} color={AppColors.primary} />
|
||||||
|
</TouchableOpacity>
|
||||||
|
)}
|
||||||
|
<TouchableOpacity style={styles.actionButton} onPress={handleRefresh}>
|
||||||
|
<Ionicons name="refresh" size={22} color={AppColors.primary} />
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
{/* Beneficiary List */}
|
|
||||||
<FlatList
|
|
||||||
data={beneficiaries}
|
|
||||||
keyExtractor={(item) => item.id.toString()}
|
|
||||||
renderItem={renderBeneficiaryCard}
|
|
||||||
contentContainerStyle={styles.listContent}
|
|
||||||
showsVerticalScrollIndicator={false}
|
|
||||||
refreshControl={
|
|
||||||
<RefreshControl
|
|
||||||
refreshing={isRefreshing}
|
|
||||||
onRefresh={handleRefresh}
|
|
||||||
tintColor={AppColors.primary}
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
ListEmptyComponent={
|
|
||||||
<View style={styles.emptyContainer}>
|
|
||||||
<Ionicons name="people-outline" size={64} color={AppColors.textMuted} />
|
|
||||||
<Text style={styles.emptyTitle}>No beneficiaries yet</Text>
|
|
||||||
<Text style={styles.emptyText}>
|
|
||||||
Add your first beneficiary to start monitoring
|
|
||||||
</Text>
|
|
||||||
</View>
|
</View>
|
||||||
}
|
|
||||||
|
{/* WebView Dashboard */}
|
||||||
|
<View style={styles.webViewContainer}>
|
||||||
|
<WebView
|
||||||
|
ref={webViewRef}
|
||||||
|
source={{ uri: DASHBOARD_URL }}
|
||||||
|
style={styles.webView}
|
||||||
|
onLoadStart={() => setIsLoading(true)}
|
||||||
|
onLoadEnd={() => setIsLoading(false)}
|
||||||
|
onError={handleError}
|
||||||
|
onHttpError={handleError}
|
||||||
|
onNavigationStateChange={handleNavigationStateChange}
|
||||||
|
javaScriptEnabled={true}
|
||||||
|
domStorageEnabled={true}
|
||||||
|
startInLoadingState={true}
|
||||||
|
scalesPageToFit={true}
|
||||||
|
allowsBackForwardNavigationGestures={true}
|
||||||
|
injectedJavaScriptBeforeContentLoaded={injectedJavaScript}
|
||||||
|
injectedJavaScript={injectedJavaScript}
|
||||||
|
renderLoading={() => (
|
||||||
|
<View style={styles.loadingContainer}>
|
||||||
|
<ActivityIndicator size="large" color={AppColors.primary} />
|
||||||
|
<Text style={styles.loadingText}>Loading dashboard...</Text>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
{isLoading && (
|
||||||
|
<View style={styles.loadingOverlay}>
|
||||||
|
<ActivityIndicator size="large" color={AppColors.primary} />
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
</SafeAreaView>
|
</SafeAreaView>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -186,7 +183,7 @@ export default function BeneficiariesListScreen() {
|
|||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
container: {
|
container: {
|
||||||
flex: 1,
|
flex: 1,
|
||||||
backgroundColor: AppColors.surface,
|
backgroundColor: AppColors.background,
|
||||||
},
|
},
|
||||||
header: {
|
header: {
|
||||||
flexDirection: 'row',
|
flexDirection: 'row',
|
||||||
@ -207,122 +204,76 @@ const styles = StyleSheet.create({
|
|||||||
fontWeight: '700',
|
fontWeight: '700',
|
||||||
color: AppColors.textPrimary,
|
color: AppColors.textPrimary,
|
||||||
},
|
},
|
||||||
addButton: {
|
headerActions: {
|
||||||
width: 44,
|
flexDirection: 'row',
|
||||||
height: 44,
|
|
||||||
borderRadius: BorderRadius.full,
|
|
||||||
backgroundColor: AppColors.primary,
|
|
||||||
justifyContent: 'center',
|
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
},
|
},
|
||||||
listContent: {
|
actionButton: {
|
||||||
padding: Spacing.md,
|
padding: Spacing.xs,
|
||||||
|
marginLeft: Spacing.xs,
|
||||||
},
|
},
|
||||||
beneficiaryCard: {
|
refreshButton: {
|
||||||
|
padding: Spacing.xs,
|
||||||
|
},
|
||||||
|
webViewContainer: {
|
||||||
|
flex: 1,
|
||||||
|
},
|
||||||
|
webView: {
|
||||||
|
flex: 1,
|
||||||
|
},
|
||||||
|
loadingContainer: {
|
||||||
|
position: 'absolute',
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
bottom: 0,
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center',
|
||||||
backgroundColor: AppColors.background,
|
backgroundColor: AppColors.background,
|
||||||
borderRadius: BorderRadius.lg,
|
|
||||||
padding: Spacing.md,
|
|
||||||
marginBottom: Spacing.md,
|
|
||||||
shadowColor: '#000',
|
|
||||||
shadowOffset: { width: 0, height: 2 },
|
|
||||||
shadowOpacity: 0.05,
|
|
||||||
shadowRadius: 4,
|
|
||||||
elevation: 2,
|
|
||||||
},
|
},
|
||||||
beneficiaryInfo: {
|
loadingOverlay: {
|
||||||
flexDirection: 'row',
|
position: 'absolute',
|
||||||
alignItems: 'center',
|
top: 0,
|
||||||
marginBottom: Spacing.md,
|
left: 0,
|
||||||
},
|
right: 0,
|
||||||
avatarContainer: {
|
bottom: 0,
|
||||||
width: 56,
|
|
||||||
height: 56,
|
|
||||||
borderRadius: BorderRadius.full,
|
|
||||||
backgroundColor: AppColors.primaryLight,
|
|
||||||
justifyContent: 'center',
|
justifyContent: 'center',
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
marginRight: Spacing.md,
|
backgroundColor: 'rgba(255,255,255,0.8)',
|
||||||
},
|
},
|
||||||
avatarText: {
|
loadingText: {
|
||||||
fontSize: FontSizes.xl,
|
marginTop: Spacing.md,
|
||||||
fontWeight: '600',
|
|
||||||
color: AppColors.white,
|
|
||||||
},
|
|
||||||
statusIndicator: {
|
|
||||||
position: 'absolute',
|
|
||||||
bottom: 2,
|
|
||||||
right: 2,
|
|
||||||
width: 14,
|
|
||||||
height: 14,
|
|
||||||
borderRadius: BorderRadius.full,
|
|
||||||
borderWidth: 2,
|
|
||||||
borderColor: AppColors.background,
|
|
||||||
},
|
|
||||||
online: {
|
|
||||||
backgroundColor: AppColors.online,
|
|
||||||
},
|
|
||||||
offline: {
|
|
||||||
backgroundColor: AppColors.offline,
|
|
||||||
},
|
|
||||||
beneficiaryDetails: {
|
|
||||||
flex: 1,
|
|
||||||
},
|
|
||||||
beneficiaryName: {
|
|
||||||
fontSize: FontSizes.lg,
|
|
||||||
fontWeight: '600',
|
|
||||||
color: AppColors.textPrimary,
|
|
||||||
},
|
|
||||||
beneficiaryRelationship: {
|
|
||||||
fontSize: FontSizes.sm,
|
|
||||||
color: AppColors.textSecondary,
|
|
||||||
marginTop: 2,
|
|
||||||
},
|
|
||||||
lastActivity: {
|
|
||||||
fontSize: FontSizes.xs,
|
|
||||||
color: AppColors.textMuted,
|
|
||||||
marginTop: 4,
|
|
||||||
},
|
|
||||||
sensorStats: {
|
|
||||||
flexDirection: 'row',
|
|
||||||
justifyContent: 'space-around',
|
|
||||||
paddingTop: Spacing.md,
|
|
||||||
borderTopWidth: 1,
|
|
||||||
borderTopColor: AppColors.border,
|
|
||||||
},
|
|
||||||
statItem: {
|
|
||||||
alignItems: 'center',
|
|
||||||
},
|
|
||||||
statValue: {
|
|
||||||
fontSize: FontSizes.base,
|
fontSize: FontSizes.base,
|
||||||
fontWeight: '600',
|
color: AppColors.textSecondary,
|
||||||
color: AppColors.textPrimary,
|
|
||||||
marginTop: Spacing.xs,
|
|
||||||
},
|
},
|
||||||
statLabel: {
|
errorContainer: {
|
||||||
fontSize: FontSizes.xs,
|
|
||||||
color: AppColors.textMuted,
|
|
||||||
},
|
|
||||||
chevron: {
|
|
||||||
position: 'absolute',
|
|
||||||
top: Spacing.md,
|
|
||||||
right: Spacing.md,
|
|
||||||
},
|
|
||||||
emptyContainer: {
|
|
||||||
flex: 1,
|
flex: 1,
|
||||||
justifyContent: 'center',
|
justifyContent: 'center',
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
paddingTop: Spacing.xxl * 2,
|
padding: Spacing.xl,
|
||||||
},
|
},
|
||||||
emptyTitle: {
|
errorTitle: {
|
||||||
fontSize: FontSizes.lg,
|
fontSize: FontSizes.lg,
|
||||||
fontWeight: '600',
|
fontWeight: '600',
|
||||||
color: AppColors.textPrimary,
|
color: AppColors.textPrimary,
|
||||||
marginTop: Spacing.md,
|
marginTop: Spacing.md,
|
||||||
},
|
},
|
||||||
emptyText: {
|
errorText: {
|
||||||
fontSize: FontSizes.base,
|
fontSize: FontSizes.base,
|
||||||
color: AppColors.textSecondary,
|
color: AppColors.textSecondary,
|
||||||
textAlign: 'center',
|
textAlign: 'center',
|
||||||
marginTop: Spacing.xs,
|
marginTop: Spacing.xs,
|
||||||
},
|
},
|
||||||
|
retryButton: {
|
||||||
|
marginTop: Spacing.lg,
|
||||||
|
paddingHorizontal: Spacing.xl,
|
||||||
|
paddingVertical: Spacing.md,
|
||||||
|
backgroundColor: AppColors.primary,
|
||||||
|
borderRadius: 8,
|
||||||
|
},
|
||||||
|
retryButtonText: {
|
||||||
|
color: AppColors.white,
|
||||||
|
fontSize: FontSizes.base,
|
||||||
|
fontWeight: '600',
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@ -44,7 +44,6 @@ function RootLayoutNav() {
|
|||||||
<Stack screenOptions={{ headerShown: false }}>
|
<Stack screenOptions={{ headerShown: false }}>
|
||||||
<Stack.Screen name="(auth)" />
|
<Stack.Screen name="(auth)" />
|
||||||
<Stack.Screen name="(tabs)" />
|
<Stack.Screen name="(tabs)" />
|
||||||
<Stack.Screen name="beneficiaries" />
|
|
||||||
<Stack.Screen name="modal" options={{ presentation: 'modal', title: 'Modal' }} />
|
<Stack.Screen name="modal" options={{ presentation: 'modal', title: 'Modal' }} />
|
||||||
</Stack>
|
</Stack>
|
||||||
<StatusBar style="auto" />
|
<StatusBar style="auto" />
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 135 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 114 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 384 KiB After Width: | Height: | Size: 131 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 35 KiB |
26
eas.json
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"cli": {
|
||||||
|
"version": ">= 5.0.0",
|
||||||
|
"appVersionSource": "remote"
|
||||||
|
},
|
||||||
|
"build": {
|
||||||
|
"development": {
|
||||||
|
"developmentClient": true,
|
||||||
|
"distribution": "internal"
|
||||||
|
},
|
||||||
|
"preview": {
|
||||||
|
"distribution": "internal"
|
||||||
|
},
|
||||||
|
"production": {
|
||||||
|
"autoIncrement": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"submit": {
|
||||||
|
"production": {
|
||||||
|
"ios": {
|
||||||
|
"appleId": "serter2069@gmail.com",
|
||||||
|
"ascAppId": "WILL_BE_SET_AFTER_FIRST_BUILD"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
549
package-lock.json
generated
@ -41,6 +41,7 @@
|
|||||||
"eslint": "^9.25.0",
|
"eslint": "^9.25.0",
|
||||||
"eslint-config-expo": "~10.0.0",
|
"eslint-config-expo": "~10.0.0",
|
||||||
"playwright": "^1.57.0",
|
"playwright": "^1.57.0",
|
||||||
|
"sharp": "^0.34.5",
|
||||||
"typescript": "~5.9.2"
|
"typescript": "~5.9.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -2275,6 +2276,496 @@
|
|||||||
"url": "https://github.com/sponsors/nzakas"
|
"url": "https://github.com/sponsors/nzakas"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@img/colour": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-darwin-arm64": {
|
||||||
|
"version": "0.34.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
|
||||||
|
"integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"darwin"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-libvips-darwin-arm64": "1.2.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-darwin-x64": {
|
||||||
|
"version": "0.34.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
|
||||||
|
"integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"darwin"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-libvips-darwin-x64": "1.2.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-libvips-darwin-arm64": {
|
||||||
|
"version": "1.2.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
|
||||||
|
"integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"darwin"
|
||||||
|
],
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-libvips-darwin-x64": {
|
||||||
|
"version": "1.2.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
|
||||||
|
"integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"darwin"
|
||||||
|
],
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-libvips-linux-arm": {
|
||||||
|
"version": "1.2.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
|
||||||
|
"integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
|
||||||
|
"cpu": [
|
||||||
|
"arm"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-libvips-linux-arm64": {
|
||||||
|
"version": "1.2.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
|
||||||
|
"integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-libvips-linux-ppc64": {
|
||||||
|
"version": "1.2.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
|
||||||
|
"integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
|
||||||
|
"cpu": [
|
||||||
|
"ppc64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-libvips-linux-riscv64": {
|
||||||
|
"version": "1.2.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
|
||||||
|
"integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
|
||||||
|
"cpu": [
|
||||||
|
"riscv64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-libvips-linux-s390x": {
|
||||||
|
"version": "1.2.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
|
||||||
|
"integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
|
||||||
|
"cpu": [
|
||||||
|
"s390x"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-libvips-linux-x64": {
|
||||||
|
"version": "1.2.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
|
||||||
|
"integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-libvips-linuxmusl-arm64": {
|
||||||
|
"version": "1.2.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
|
||||||
|
"integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-libvips-linuxmusl-x64": {
|
||||||
|
"version": "1.2.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
|
||||||
|
"integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-linux-arm": {
|
||||||
|
"version": "0.34.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
|
||||||
|
"integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
|
||||||
|
"cpu": [
|
||||||
|
"arm"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-libvips-linux-arm": "1.2.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-linux-arm64": {
|
||||||
|
"version": "0.34.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
|
||||||
|
"integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-libvips-linux-arm64": "1.2.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-linux-ppc64": {
|
||||||
|
"version": "0.34.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
|
||||||
|
"integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
|
||||||
|
"cpu": [
|
||||||
|
"ppc64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-libvips-linux-ppc64": "1.2.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-linux-riscv64": {
|
||||||
|
"version": "0.34.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
|
||||||
|
"integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
|
||||||
|
"cpu": [
|
||||||
|
"riscv64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-libvips-linux-riscv64": "1.2.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-linux-s390x": {
|
||||||
|
"version": "0.34.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
|
||||||
|
"integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
|
||||||
|
"cpu": [
|
||||||
|
"s390x"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-libvips-linux-s390x": "1.2.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-linux-x64": {
|
||||||
|
"version": "0.34.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
|
||||||
|
"integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-libvips-linux-x64": "1.2.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-linuxmusl-arm64": {
|
||||||
|
"version": "0.34.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
|
||||||
|
"integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-linuxmusl-x64": {
|
||||||
|
"version": "0.34.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
|
||||||
|
"integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-libvips-linuxmusl-x64": "1.2.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-wasm32": {
|
||||||
|
"version": "0.34.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
|
||||||
|
"integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
|
||||||
|
"cpu": [
|
||||||
|
"wasm32"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
|
||||||
|
"optional": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@emnapi/runtime": "^1.7.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-win32-arm64": {
|
||||||
|
"version": "0.34.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
|
||||||
|
"integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0 AND LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"win32"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-win32-ia32": {
|
||||||
|
"version": "0.34.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
|
||||||
|
"integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
|
||||||
|
"cpu": [
|
||||||
|
"ia32"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0 AND LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"win32"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-win32-x64": {
|
||||||
|
"version": "0.34.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
|
||||||
|
"integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0 AND LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"win32"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@isaacs/balanced-match": {
|
"node_modules/@isaacs/balanced-match": {
|
||||||
"version": "4.0.1",
|
"version": "4.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
|
||||||
@ -11126,6 +11617,64 @@
|
|||||||
"integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==",
|
"integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/sharp": {
|
||||||
|
"version": "0.34.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
|
||||||
|
"integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
|
||||||
|
"dev": true,
|
||||||
|
"hasInstallScript": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@img/colour": "^1.0.0",
|
||||||
|
"detect-libc": "^2.1.2",
|
||||||
|
"semver": "^7.7.3"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-darwin-arm64": "0.34.5",
|
||||||
|
"@img/sharp-darwin-x64": "0.34.5",
|
||||||
|
"@img/sharp-libvips-darwin-arm64": "1.2.4",
|
||||||
|
"@img/sharp-libvips-darwin-x64": "1.2.4",
|
||||||
|
"@img/sharp-libvips-linux-arm": "1.2.4",
|
||||||
|
"@img/sharp-libvips-linux-arm64": "1.2.4",
|
||||||
|
"@img/sharp-libvips-linux-ppc64": "1.2.4",
|
||||||
|
"@img/sharp-libvips-linux-riscv64": "1.2.4",
|
||||||
|
"@img/sharp-libvips-linux-s390x": "1.2.4",
|
||||||
|
"@img/sharp-libvips-linux-x64": "1.2.4",
|
||||||
|
"@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
|
||||||
|
"@img/sharp-libvips-linuxmusl-x64": "1.2.4",
|
||||||
|
"@img/sharp-linux-arm": "0.34.5",
|
||||||
|
"@img/sharp-linux-arm64": "0.34.5",
|
||||||
|
"@img/sharp-linux-ppc64": "0.34.5",
|
||||||
|
"@img/sharp-linux-riscv64": "0.34.5",
|
||||||
|
"@img/sharp-linux-s390x": "0.34.5",
|
||||||
|
"@img/sharp-linux-x64": "0.34.5",
|
||||||
|
"@img/sharp-linuxmusl-arm64": "0.34.5",
|
||||||
|
"@img/sharp-linuxmusl-x64": "0.34.5",
|
||||||
|
"@img/sharp-wasm32": "0.34.5",
|
||||||
|
"@img/sharp-win32-arm64": "0.34.5",
|
||||||
|
"@img/sharp-win32-ia32": "0.34.5",
|
||||||
|
"@img/sharp-win32-x64": "0.34.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/sharp/node_modules/semver": {
|
||||||
|
"version": "7.7.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
|
||||||
|
"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "ISC",
|
||||||
|
"bin": {
|
||||||
|
"semver": "bin/semver.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/shebang-command": {
|
"node_modules/shebang-command": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
|
||||||
|
|||||||
@ -44,6 +44,7 @@
|
|||||||
"eslint": "^9.25.0",
|
"eslint": "^9.25.0",
|
||||||
"eslint-config-expo": "~10.0.0",
|
"eslint-config-expo": "~10.0.0",
|
||||||
"playwright": "^1.57.0",
|
"playwright": "^1.57.0",
|
||||||
|
"sharp": "^0.34.5",
|
||||||
"typescript": "~5.9.2"
|
"typescript": "~5.9.2"
|
||||||
},
|
},
|
||||||
"private": true
|
"private": true
|
||||||
|
|||||||
@ -1,28 +1,68 @@
|
|||||||
{
|
{
|
||||||
"_meta": {
|
"_meta": {
|
||||||
"name": "Description",
|
"name": "Main",
|
||||||
"updatedAt": "2025-12-12T21:45:00.000Z"
|
"updatedAt": "2025-12-12T21:41:10.294Z"
|
||||||
},
|
},
|
||||||
"elements": [
|
"elements": [
|
||||||
{
|
{
|
||||||
"id": "project_overview",
|
"id": "root",
|
||||||
"type": "card",
|
"type": "card",
|
||||||
"title": "WellNuo — Project Overview",
|
"title": "WellNuo",
|
||||||
"borderColor": "purple",
|
|
||||||
"tags": [
|
|
||||||
"overview"
|
|
||||||
],
|
|
||||||
"description": "Elderly Care Monitoring System\n\nМобильное приложение для удалённого мониторинга благополучия пожилых родственников через бесконтактные умные сенсоры.\n\n— СУТЬ —\nСемья видит активность пожилого человека без камер, микрофонов и носимых устройств. Сенсоры (движения, двери/окна, окружающей среды) передают данные в облако → приложение показывает статус в реальном времени и отправляет push-уведомления при тревоге.\n\n— АУДИТОРИЯ —\nВзрослые дети и внуки пожилых людей, сами пожилые люди.\n\n— КЛЮЧЕВЫЕ ФУНКЦИИ —\n• Дашборд: текущий статус, последняя активность, здоровье сенсоров\n• Алерты: необычная неактивность, нет движения, сенсор офлайн\n• Отчёты: день/неделя/месяц, паттерны активности, качество сна\n• Поддержка нескольких домов\n\n— ТЕХНОЛОГИИ —\nReact Native + Expo | WellNuo API | Firebase/APNs | WebSocket\n\n— ПРИНЦИПЫ —\nPrivacy-first (никаких камер/микрофонов), спокойный UI, минимальная когнитивная нагрузка, понятные индикаторы статуса.",
|
"description": "Elderly Care Monitoring System\n\nМобильное приложение для удалённого мониторинга благополучия пожилых родственников через бесконтактные умные сенсоры.\n\n— СУТЬ —\nСемья видит активность пожилого человека без камер, микрофонов и носимых устройств. Сенсоры (движения, двери/окна, окружающей среды) передают данные в облако → приложение показывает статус в реальном времени и отправляет push-уведомления при тревоге.\n\n— АУДИТОРИЯ —\nВзрослые дети и внуки пожилых людей, сами пожилые люди.\n\n— КЛЮЧЕВЫЕ ФУНКЦИИ —\n• Дашборд: текущий статус, последняя активность, здоровье сенсоров\n• Алерты: необычная неактивность, нет движения, сенсор офлайн\n• Отчёты: день/неделя/месяц, паттерны активности, качество сна\n• Поддержка нескольких домов\n\n— ТЕХНОЛОГИИ —\nReact Native + Expo | WellNuo API | Firebase/APNs | WebSocket\n\n— ПРИНЦИПЫ —\nPrivacy-first (никаких камер/микрофонов), спокойный UI, минимальная когнитивная нагрузка, понятные индикаторы статуса.",
|
||||||
"x": 400,
|
"x": 125,
|
||||||
"y": 150
|
"y": 296
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "scheme-env",
|
||||||
|
"type": "card",
|
||||||
|
"title": "ENV and existing API",
|
||||||
|
"description": "/Users/sergei/Desktop/WellNuo/wellnuoSheme/01_ENV_Credentials and existing API.json",
|
||||||
|
"x": 520,
|
||||||
|
"y": 77
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "scheme-questions",
|
||||||
|
"type": "card",
|
||||||
|
"title": "Questions",
|
||||||
|
"description": "/Users/sergei/Desktop/WellNuo/wellnuoSheme/03_DiscussionQuestions.json",
|
||||||
|
"x": 515.8040161132812,
|
||||||
|
"y": 378.204833984375
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "scheme-appstore",
|
||||||
|
"type": "card",
|
||||||
|
"title": "App Store Publication - WellNuo",
|
||||||
|
"description": "/Users/sergei/Desktop/WellNuo/wellnuoSheme/04_AppStorePublication.json",
|
||||||
|
"x": 508.95477294921875,
|
||||||
|
"y": 478.3477478027344,
|
||||||
|
"tags": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "scheme-sysanal",
|
||||||
|
"type": "card",
|
||||||
|
"title": "SysAnal",
|
||||||
|
"description": "/Users/sergei/Desktop/WellNuo/wellnuoSheme/SysAnal.json",
|
||||||
|
"x": 554.7333984375,
|
||||||
|
"y": 169.93504333496094
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"connections": [],
|
"connections": [
|
||||||
"tagsDictionary": [
|
|
||||||
{
|
{
|
||||||
"id": "tag-overview",
|
"from": "root",
|
||||||
"name": "overview",
|
"to": "scheme-env"
|
||||||
"color": "purple"
|
},
|
||||||
|
{
|
||||||
|
"from": "root",
|
||||||
|
"to": "scheme-questions"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "root",
|
||||||
|
"to": "scheme-appstore"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "root",
|
||||||
|
"to": "scheme-sysanal"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"tagsDictionary": []
|
||||||
}
|
}
|
||||||
@ -0,0 +1,590 @@
|
|||||||
|
{
|
||||||
|
"_meta": {
|
||||||
|
"name": "App Store Publication",
|
||||||
|
"updatedAt": "2025-12-12T21:41:18.112Z"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"id": "header",
|
||||||
|
"type": "card",
|
||||||
|
"title": "WellNuo - App Store Publication",
|
||||||
|
"borderColor": "purple",
|
||||||
|
"tags": [
|
||||||
|
"overview"
|
||||||
|
],
|
||||||
|
"description": "**Цель:** Опубликовать WellNuo в App Store\n\n**Схема разделена на:**\n\n1. **ПОДГОТОВКА** - что создать до публикации\n2. **ПУБЛИКАЦИЯ** - процесс в App Store Connect\n3. **КОПИРОВАТЬ** - готовые тексты\n\n**Контакт:**\nbernhard@wellnuo.com\n+1-408-647-7068",
|
||||||
|
"x": -265.20686388015747,
|
||||||
|
"y": 587.0042724609375
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_header",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📁 ПОДГОТОВКА",
|
||||||
|
"borderColor": "orange",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"overview"
|
||||||
|
],
|
||||||
|
"description": "**Что нужно сделать ДО публикации:**\n\n1. Создать страницы на сайте\n2. Подготовить Demo аккаунт\n3. Сделать скриншоты\n4. Собрать build\n\n**Сайт:** wellnuo.com",
|
||||||
|
"x": 140,
|
||||||
|
"y": 200
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_privacy_page",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📄 Privacy Policy Page",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"website"
|
||||||
|
],
|
||||||
|
"description": "**URL:** https://wellnuo.com/privacy\n\n**Статус:** ⏳ Нужно создать\n\n**Что должно быть:**\n- Какие данные собираем\n- Как используем\n- AI Disclosure (OpenAI)\n- Права пользователя\n- Контакт: privacy@wellnuo.com\n\n**Важно:** URL должен работать до submit!",
|
||||||
|
"x": 520,
|
||||||
|
"y": 120
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_terms_page",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📄 Terms of Service Page",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"website"
|
||||||
|
],
|
||||||
|
"description": "**URL:** https://wellnuo.com/terms\n\n**Статус:** ⏳ Нужно создать\n\n**Что должно быть:**\n- Условия использования\n- Подписки и оплата\n- Ограничение ответственности\n- НЕ медицинское устройство!\n- Ссылка на Apple EULA\n\n**Контакт:** legal@wellnuo.com",
|
||||||
|
"x": 520,
|
||||||
|
"y": 280
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_support_page",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📄 Support Page",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"website"
|
||||||
|
],
|
||||||
|
"description": "**URL:** https://wellnuo.com/support\n\n**Статус:** ⏳ Нужно создать\n\n**Что должно быть:**\n- Email: support@wellnuo.com\n- Phone: +1-408-647-7068\n- FAQ (5-7 вопросов)\n- Troubleshooting\n- Response time: 24-48ч",
|
||||||
|
"x": 520,
|
||||||
|
"y": 440
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_demo_account",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🔑 Demo Account",
|
||||||
|
"borderColor": "green",
|
||||||
|
"tags": [
|
||||||
|
"prep"
|
||||||
|
],
|
||||||
|
"description": "**Для Apple Review:**\n\nEmail: demo@wellnuo.com\nPassword: WellNuoDemo2025!\n\n**Статус:** ⏳ Нужно создать\n\n**Требования:**\n- 30 дней симулированных данных\n- Premium подписка активна\n- Все функции работают\n- Без реального оборудования",
|
||||||
|
"x": 900,
|
||||||
|
"y": 120
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_screenshots",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📱 Screenshots",
|
||||||
|
"borderColor": "pink",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"design"
|
||||||
|
],
|
||||||
|
"description": "**Нужно сделать для:**\n\n**iPhone 6.7\" (обязательно):**\n1290×2796 px - 3-10 штук\n\n**iPhone 6.5\":**\n1284×2778 px\n\n**iPhone 5.5\" (старые):**\n1242×2208 px\n\n**Экраны:**\n1. Dashboard\n2. Alerts\n3. Reports\n4. Settings\n5. Family",
|
||||||
|
"x": 900,
|
||||||
|
"y": 280
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_app_icon",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🎨 App Icon",
|
||||||
|
"borderColor": "pink",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"design"
|
||||||
|
],
|
||||||
|
"description": "**Размер:** 1024×1024 PNG\n\n**Требования:**\n- Без прозрачности (no alpha)\n- Без закругленных углов\n- Четко на всех размерах\n\n**Статус:** ⏳ Нужно создать\n\n**Стиль:**\nСердце/забота, градиент синий",
|
||||||
|
"x": 900,
|
||||||
|
"y": 440
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_build",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🔨 Build & TestFlight",
|
||||||
|
"borderColor": "teal",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"tech"
|
||||||
|
],
|
||||||
|
"description": "**Команды:**\n```\neas build --platform ios\neas submit --platform ios\n```\n\n**Требования:**\n- iOS 17.0+ minimum\n- Xcode 15.2+\n- Без crashes 24ч\n\n**TestFlight:**\n- Internal: до 100 тестеров\n- External: требует Beta Review",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 200
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_checklist",
|
||||||
|
"type": "card",
|
||||||
|
"title": "✅ Checklist Подготовки",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"checklist"
|
||||||
|
],
|
||||||
|
"description": "**Перед публикацией:**\n\n□ wellnuo.com/privacy работает\n□ wellnuo.com/terms работает\n□ wellnuo.com/support работает\n□ Demo account создан и тестирован\n□ Screenshots готовы (все размеры)\n□ App Icon 1024x1024 готова\n□ Build загружен в TestFlight\n□ Нет crashes за 24ч",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 400
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_header",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🚀 ПУБЛИКАЦИЯ",
|
||||||
|
"borderColor": "blue",
|
||||||
|
"tags": [
|
||||||
|
"pub",
|
||||||
|
"overview"
|
||||||
|
],
|
||||||
|
"description": "**App Store Connect**\n\nПроцесс публикации после подготовки:\n\n1. Apple Developer Account\n2. Создание App\n3. Заполнение информации\n4. Submit на Review\n\n**URL:** appstoreconnect.apple.com",
|
||||||
|
"x": 140,
|
||||||
|
"y": 650
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_developer_account",
|
||||||
|
"type": "card",
|
||||||
|
"title": "👤 Apple Developer Account",
|
||||||
|
"borderColor": "purple",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**URL:** developer.apple.com/enroll\n**Стоимость:** $99/год\n\n**Тип:** Organization\n\n**Требуется:**\n- D-U-N-S Number\n- Юридическое название\n- Website компании\n- Телефон для верификации\n\n**Время:** 1-7 дней",
|
||||||
|
"x": 520,
|
||||||
|
"y": 600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_create_app",
|
||||||
|
"type": "card",
|
||||||
|
"title": "➕ Создание App",
|
||||||
|
"borderColor": "blue",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**В App Store Connect:**\n\nMy Apps → + → New App\n\n**Заполнить:**\n- Platform: iOS\n- Name: WellNuo - Senior Care Monitor\n- Primary Language: English\n- Bundle ID: com.wellnuo.seniorcare\n- SKU: WELLNUO-SENIOR-001",
|
||||||
|
"x": 520,
|
||||||
|
"y": 760
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_app_info",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📝 App Information",
|
||||||
|
"borderColor": "blue",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Секция App Information:**\n\n**Category:**\nPrimary: Health & Fitness\nSecondary: Lifestyle\n\n**Content Rights:**\nDoes not contain third-party content\n\n**Age Rating:**\nЗаполнить вопросник → 4+",
|
||||||
|
"x": 900,
|
||||||
|
"y": 600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_pricing",
|
||||||
|
"type": "card",
|
||||||
|
"title": "💰 Pricing & Availability",
|
||||||
|
"borderColor": "orange",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Base Price:** Free\n\n**Availability:**\nAll territories (или выбрать)\n\n**In-App Purchases:**\n- Monthly: $4.99\n- Yearly: $49.99\n- Lifetime: $149.99\n\n**Free Trial:** 7 days",
|
||||||
|
"x": 900,
|
||||||
|
"y": 760
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_version_info",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Version Information",
|
||||||
|
"borderColor": "blue",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Секция iOS App → Version:**\n\n1. Screenshots (загрузить)\n2. Promotional Text\n3. Description\n4. Keywords\n5. Support URL\n6. Marketing URL\n7. What's New\n\n**Build:** Выбрать из TestFlight",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_app_review",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🔍 App Review Information",
|
||||||
|
"borderColor": "green",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Sign-In Information:**\nEmail: demo@wellnuo.com\nPassword: WellNuoDemo2025!\n\n**Contact Information:**\nFirst: Bernhard\nLast: Knigge\nPhone: +1-408-647-7068\nEmail: bernhard@wellnuo.com\n\n**Notes:** Добавить инструкции",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 760
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_app_privacy",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🔒 App Privacy",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"pub",
|
||||||
|
"legal"
|
||||||
|
],
|
||||||
|
"description": "**Privacy Policy URL:**\nhttps://wellnuo.com/privacy\n\n**Data Collection:**\n\n✓ Contact Info (Email)\n✓ Health & Fitness\n✓ Identifiers (User ID)\n✓ Usage Data\n✓ Diagnostics\n\n**Tracking:** No",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_submit",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📤 Submit for Review",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Финальные шаги:**\n\n1. Проверить все поля заполнены\n2. Проверить URLs работают\n3. Выбрать Build\n4. Submit for Review\n\n**Review Time:** 24-48 часов\n\n**Release:** Automatic / Manual",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 760
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_header",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 КОПИРОВАТЬ",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy",
|
||||||
|
"overview"
|
||||||
|
],
|
||||||
|
"description": "**Готовые тексты для вставки**\n\nВсе поля ниже - просто копируй и вставляй в App Store Connect.\n\n**Цвет:** Зелёный (lime) = copy-paste",
|
||||||
|
"x": 140,
|
||||||
|
"y": 950
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_basic",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Basic Info",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy"
|
||||||
|
],
|
||||||
|
"description": "**App Name:**\nWellNuo - Senior Care Monitor\n\n**Subtitle:**\nElderly Wellness Tracking\n\n**Bundle ID:**\ncom.wellnuo.seniorcare\n\n**SKU:**\nWELLNUO-SENIOR-001\n\n**Copyright:**\n© 2025 WellNuo Inc.",
|
||||||
|
"x": 520,
|
||||||
|
"y": 920
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_keywords",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Keywords (97 chars)",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ:**\n\nsenior care,elderly monitor,family safety,wellness tracker,aging parents,remote care,health alerts",
|
||||||
|
"x": 520,
|
||||||
|
"y": 1080
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_promo",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Promotional Text",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ (170 chars max):**\n\nCare for your aging parents with peace of mind. WellNuo monitors wellness patterns without cameras - privacy first approach to elderly care.",
|
||||||
|
"x": 900,
|
||||||
|
"y": 920
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_description",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Description",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ:**\n\nCare for your loved ones while preserving their independence. WellNuo is a smart wellness monitoring system designed for elderly family members.\n\nWORRIED ABOUT AGING PARENTS LIVING ALONE?\nWellNuo gives you peace of mind with activity pattern monitoring and instant alerts when something seems unusual.\n\n◆ PRIVACY-FIRST APPROACH\nNo cameras. No microphones. No intrusion.\n\n◆ INSTANT ALERTS\nGet notified immediately when unusual inactivity is detected.\n\n◆ DAILY WELLNESS REPORTS\nTrack trends with easy-to-read reports.\n\n◆ FAMILY SHARING\nConnect the whole family.\n\n◆ AI-POWERED INSIGHTS (Premium)\nSmart analysis detects subtle changes.\n\nFREE FEATURES:\n• Basic activity monitoring\n• Emergency alerts\n• 1 family member\n• 7-day history\n\nPREMIUM:\n• Unlimited history\n• AI analysis\n• Unlimited family\n• Priority support\n\nNOT a medical device.\n\nsupport@wellnuo.com\nwellnuo.com",
|
||||||
|
"x": 900,
|
||||||
|
"y": 1080
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_whats_new",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 What's New",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ:**\n\nWelcome to WellNuo!\n\n• Real-time activity monitoring\n• Instant alert notifications\n• Daily and weekly wellness reports\n• Family sharing and coordination\n• Privacy-focused design\n• Sign in with Apple support\n\nStart caring smarter today.",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 920
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_urls",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 URLs",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy"
|
||||||
|
],
|
||||||
|
"description": "**Privacy Policy URL:**\nhttps://wellnuo.com/privacy\n\n**Support URL:**\nhttps://wellnuo.com/support\n\n**Marketing URL:**\nhttps://wellnuo.com",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 1080
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_review_notes",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Review Notes",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ:**\n\nThis app monitors elderly wellness through activity pattern analysis.\n\nDEMO ACCOUNT:\nThe demo account has 30 days of simulated sensor data. No physical hardware required for testing.\n\nFEATURES TO TEST:\n1. Dashboard - activity overview\n2. Alerts - notifications\n3. Reports - daily/weekly stats\n4. Settings - privacy controls\n5. Family - add members\n\nAI features use OpenAI API (disclosed in privacy policy).\n\nContact: support@wellnuo.com",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 920
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_age_rating",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Age Rating Answers",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy"
|
||||||
|
],
|
||||||
|
"description": "**ВСЕ ОТВЕТЫ:**\n\nViolence: None\nSexual Content: None\nProfanity: None\nDrugs: None\nGambling: None\nHorror: None\nMedical Info: **Infrequent/Mild**\nWeb Access: No\nContests: No\n\n**Результат: 4+**",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 1080
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_export",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Export Compliance",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy"
|
||||||
|
],
|
||||||
|
"description": "**Q: Uses encryption?**\nA: Yes\n\n**Q: Qualifies for exemption?**\nA: Yes - Standard HTTPS/TLS only. Qualifies under Note 4 to Category 5, Part 2 of EAR.\n\nNo custom encryption algorithms.",
|
||||||
|
"x": 2040,
|
||||||
|
"y": 920
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_iap",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 In-App Purchases",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy"
|
||||||
|
],
|
||||||
|
"description": "**Monthly:**\nID: com.wellnuo.premium.monthly\nPrice: $4.99/month\nName: WellNuo Premium\nDesc: Unlock unlimited history, AI insights, and family connections.\n\n**Yearly:**\nID: com.wellnuo.premium.yearly\nPrice: $49.99/year\nName: WellNuo Premium (Annual)\nDesc: Save 17% with annual subscription.\n\n**Lifetime:**\nID: com.wellnuo.lifetime\nPrice: $149.99\nName: WellNuo Lifetime\nDesc: One-time purchase for lifetime access.\n\n**Trial:** 7 days",
|
||||||
|
"x": 2040,
|
||||||
|
"y": 1080
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_info_plist",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Info.plist Keys",
|
||||||
|
"borderColor": "cyan",
|
||||||
|
"tags": [
|
||||||
|
"copy",
|
||||||
|
"tech"
|
||||||
|
],
|
||||||
|
"description": "**NSLocationWhenInUseUsageDescription:**\nWellNuo uses your location to detect when you arrive home or leave, helping monitor daily activity patterns.\n\n**NSCameraUsageDescription:**\nWellNuo uses the camera to scan QR codes when setting up devices.\n\n**NSHealthShareUsageDescription:**\nWellNuo reads health data to provide wellness monitoring.\n\n**NSUserNotificationsUsageDescription:**\nWellNuo sends notifications about wellness updates.",
|
||||||
|
"x": 2420,
|
||||||
|
"y": 920
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_privacy_content",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Privacy Policy Content",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"copy",
|
||||||
|
"legal"
|
||||||
|
],
|
||||||
|
"description": "**Ключевые разделы:**\n\n1. **Data Collected:** Email, activity data, device info\n\n2. **How Used:** Monitoring, alerts, reports\n\n3. **AI Disclosure:** OpenAI GPT API for insights. Anonymized data only. User consent required.\n\n4. **Sharing:** NO selling data. Only: authorized family, legal, service providers.\n\n5. **Security:** AES-256 encryption\n\n6. **Rights:** Access, correct, delete data\n\n7. **Children:** Not for under 13\n\n**Contact:** privacy@wellnuo.com",
|
||||||
|
"x": 2420,
|
||||||
|
"y": 1080
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"connections": [
|
||||||
|
{
|
||||||
|
"from": "header",
|
||||||
|
"to": "prep_header",
|
||||||
|
"label": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "header",
|
||||||
|
"to": "pub_header",
|
||||||
|
"label": "2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "header",
|
||||||
|
"to": "copy_header",
|
||||||
|
"label": "3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_header",
|
||||||
|
"to": "prep_privacy_page"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_header",
|
||||||
|
"to": "prep_demo_account"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_privacy_page",
|
||||||
|
"to": "prep_terms_page"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_terms_page",
|
||||||
|
"to": "prep_support_page"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_demo_account",
|
||||||
|
"to": "prep_screenshots"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_screenshots",
|
||||||
|
"to": "prep_app_icon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_app_icon",
|
||||||
|
"to": "prep_build"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_build",
|
||||||
|
"to": "prep_checklist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_header",
|
||||||
|
"to": "pub_developer_account"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_developer_account",
|
||||||
|
"to": "pub_create_app"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_create_app",
|
||||||
|
"to": "pub_app_info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_app_info",
|
||||||
|
"to": "pub_pricing"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_app_info",
|
||||||
|
"to": "pub_version_info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_version_info",
|
||||||
|
"to": "pub_app_review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_app_review",
|
||||||
|
"to": "pub_app_privacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_app_privacy",
|
||||||
|
"to": "pub_submit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_header",
|
||||||
|
"to": "copy_basic"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_basic",
|
||||||
|
"to": "copy_keywords"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_basic",
|
||||||
|
"to": "copy_promo"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_promo",
|
||||||
|
"to": "copy_description"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_keywords",
|
||||||
|
"to": "copy_description"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_description",
|
||||||
|
"to": "copy_whats_new"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_whats_new",
|
||||||
|
"to": "copy_urls"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_urls",
|
||||||
|
"to": "copy_review_notes"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_review_notes",
|
||||||
|
"to": "copy_age_rating"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_age_rating",
|
||||||
|
"to": "copy_export"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_export",
|
||||||
|
"to": "copy_iap"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_iap",
|
||||||
|
"to": "copy_info_plist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_info_plist",
|
||||||
|
"to": "copy_privacy_content"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_checklist",
|
||||||
|
"to": "pub_header",
|
||||||
|
"label": "После подготовки"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tagsDictionary": [
|
||||||
|
{
|
||||||
|
"id": "tag-overview",
|
||||||
|
"name": "overview",
|
||||||
|
"color": "purple"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-prep",
|
||||||
|
"name": "prep",
|
||||||
|
"color": "orange"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-pub",
|
||||||
|
"name": "pub",
|
||||||
|
"color": "blue"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-copy",
|
||||||
|
"name": "copy",
|
||||||
|
"color": "lime"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-website",
|
||||||
|
"name": "website",
|
||||||
|
"color": "red"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-design",
|
||||||
|
"name": "design",
|
||||||
|
"color": "pink"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-tech",
|
||||||
|
"name": "tech",
|
||||||
|
"color": "teal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-legal",
|
||||||
|
"name": "legal",
|
||||||
|
"color": "red"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-checklist",
|
||||||
|
"name": "checklist",
|
||||||
|
"color": "green"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,590 @@
|
|||||||
|
{
|
||||||
|
"_meta": {
|
||||||
|
"name": "App Store Publication",
|
||||||
|
"updatedAt": "2025-12-12T21:41:22.246Z"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"id": "header",
|
||||||
|
"type": "card",
|
||||||
|
"title": "WellNuo - App Store Publication",
|
||||||
|
"borderColor": "purple",
|
||||||
|
"tags": [
|
||||||
|
"overview"
|
||||||
|
],
|
||||||
|
"description": "**Цель:** Опубликовать WellNuo в App Store\n\n**Схема разделена на:**\n\n1. **ПОДГОТОВКА** - что создать до публикации\n2. **ПУБЛИКАЦИЯ** - процесс в App Store Connect\n3. **КОПИРОВАТЬ** - готовые тексты\n\n**Контакт:**\nbernhard@wellnuo.com\n+1-408-647-7068",
|
||||||
|
"x": -265.20686388015747,
|
||||||
|
"y": 587.0042724609375
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_header",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📁 ПОДГОТОВКА",
|
||||||
|
"borderColor": "orange",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"overview"
|
||||||
|
],
|
||||||
|
"description": "**Что нужно сделать ДО публикации:**\n\n1. Создать страницы на сайте\n2. Подготовить Demo аккаунт\n3. Сделать скриншоты\n4. Собрать build\n\n**Сайт:** wellnuo.com",
|
||||||
|
"x": 140,
|
||||||
|
"y": 200
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_privacy_page",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📄 Privacy Policy Page",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"website"
|
||||||
|
],
|
||||||
|
"description": "**URL:** https://wellnuo.com/privacy\n\n**Статус:** ⏳ Нужно создать\n\n**Что должно быть:**\n- Какие данные собираем\n- Как используем\n- AI Disclosure (OpenAI)\n- Права пользователя\n- Контакт: privacy@wellnuo.com\n\n**Важно:** URL должен работать до submit!",
|
||||||
|
"x": 538.4039916992188,
|
||||||
|
"y": 198.2169532775879
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_terms_page",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📄 Terms of Service Page",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"website"
|
||||||
|
],
|
||||||
|
"description": "**URL:** https://wellnuo.com/terms\n\n**Статус:** ⏳ Нужно создать\n\n**Что должно быть:**\n- Условия использования\n- Подписки и оплата\n- Ограничение ответственности\n- НЕ медицинское устройство!\n- Ссылка на Apple EULA\n\n**Контакт:** legal@wellnuo.com",
|
||||||
|
"x": 520,
|
||||||
|
"y": 280
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_support_page",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📄 Support Page",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"website"
|
||||||
|
],
|
||||||
|
"description": "**URL:** https://wellnuo.com/support\n\n**Статус:** ⏳ Нужно создать\n\n**Что должно быть:**\n- Email: support@wellnuo.com\n- Phone: +1-408-647-7068\n- FAQ (5-7 вопросов)\n- Troubleshooting\n- Response time: 24-48ч",
|
||||||
|
"x": 520,
|
||||||
|
"y": 440
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_demo_account",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🔑 Demo Account",
|
||||||
|
"borderColor": "green",
|
||||||
|
"tags": [
|
||||||
|
"prep"
|
||||||
|
],
|
||||||
|
"description": "**Для Apple Review:**\n\nEmail: demo@wellnuo.com\nPassword: WellNuoDemo2025!\n\n**Статус:** ⏳ Нужно создать\n\n**Требования:**\n- 30 дней симулированных данных\n- Premium подписка активна\n- Все функции работают\n- Без реального оборудования",
|
||||||
|
"x": 900,
|
||||||
|
"y": 120
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_screenshots",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📱 Screenshots",
|
||||||
|
"borderColor": "pink",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"design"
|
||||||
|
],
|
||||||
|
"description": "**Нужно сделать для:**\n\n**iPhone 6.7\" (обязательно):**\n1290×2796 px - 3-10 штук\n\n**iPhone 6.5\":**\n1284×2778 px\n\n**iPhone 5.5\" (старые):**\n1242×2208 px\n\n**Экраны:**\n1. Dashboard\n2. Alerts\n3. Reports\n4. Settings\n5. Family",
|
||||||
|
"x": 900,
|
||||||
|
"y": 280
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_app_icon",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🎨 App Icon",
|
||||||
|
"borderColor": "pink",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"design"
|
||||||
|
],
|
||||||
|
"description": "**Размер:** 1024×1024 PNG\n\n**Требования:**\n- Без прозрачности (no alpha)\n- Без закругленных углов\n- Четко на всех размерах\n\n**Статус:** ⏳ Нужно создать\n\n**Стиль:**\nСердце/забота, градиент синий",
|
||||||
|
"x": 900,
|
||||||
|
"y": 440
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_build",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🔨 Build & TestFlight",
|
||||||
|
"borderColor": "teal",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"tech"
|
||||||
|
],
|
||||||
|
"description": "**Команды:**\n```\neas build --platform ios\neas submit --platform ios\n```\n\n**Требования:**\n- iOS 17.0+ minimum\n- Xcode 15.2+\n- Без crashes 24ч\n\n**TestFlight:**\n- Internal: до 100 тестеров\n- External: требует Beta Review",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 200
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_checklist",
|
||||||
|
"type": "card",
|
||||||
|
"title": "✅ Checklist Подготовки",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"checklist"
|
||||||
|
],
|
||||||
|
"description": "**Перед публикацией:**\n\n□ wellnuo.com/privacy работает\n□ wellnuo.com/terms работает\n□ wellnuo.com/support работает\n□ Demo account создан и тестирован\n□ Screenshots готовы (все размеры)\n□ App Icon 1024x1024 готова\n□ Build загружен в TestFlight\n□ Нет crashes за 24ч",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 400
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_header",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🚀 ПУБЛИКАЦИЯ",
|
||||||
|
"borderColor": "blue",
|
||||||
|
"tags": [
|
||||||
|
"pub",
|
||||||
|
"overview"
|
||||||
|
],
|
||||||
|
"description": "**App Store Connect**\n\nПроцесс публикации после подготовки:\n\n1. Apple Developer Account\n2. Создание App\n3. Заполнение информации\n4. Submit на Review\n\n**URL:** appstoreconnect.apple.com",
|
||||||
|
"x": 140,
|
||||||
|
"y": 650
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_developer_account",
|
||||||
|
"type": "card",
|
||||||
|
"title": "👤 Apple Developer Account",
|
||||||
|
"borderColor": "purple",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**URL:** developer.apple.com/enroll\n**Стоимость:** $99/год\n\n**Тип:** Organization\n\n**Требуется:**\n- D-U-N-S Number\n- Юридическое название\n- Website компании\n- Телефон для верификации\n\n**Время:** 1-7 дней",
|
||||||
|
"x": 520,
|
||||||
|
"y": 600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_create_app",
|
||||||
|
"type": "card",
|
||||||
|
"title": "➕ Создание App",
|
||||||
|
"borderColor": "blue",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**В App Store Connect:**\n\nMy Apps → + → New App\n\n**Заполнить:**\n- Platform: iOS\n- Name: WellNuo - Senior Care Monitor\n- Primary Language: English\n- Bundle ID: com.wellnuo.seniorcare\n- SKU: WELLNUO-SENIOR-001",
|
||||||
|
"x": 520,
|
||||||
|
"y": 760
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_app_info",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📝 App Information",
|
||||||
|
"borderColor": "blue",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Секция App Information:**\n\n**Category:**\nPrimary: Health & Fitness\nSecondary: Lifestyle\n\n**Content Rights:**\nDoes not contain third-party content\n\n**Age Rating:**\nЗаполнить вопросник → 4+",
|
||||||
|
"x": 900,
|
||||||
|
"y": 600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_pricing",
|
||||||
|
"type": "card",
|
||||||
|
"title": "💰 Pricing & Availability",
|
||||||
|
"borderColor": "orange",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Base Price:** Free\n\n**Availability:**\nAll territories (или выбрать)\n\n**In-App Purchases:**\n- Monthly: $4.99\n- Yearly: $49.99\n- Lifetime: $149.99\n\n**Free Trial:** 7 days",
|
||||||
|
"x": 900,
|
||||||
|
"y": 760
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_version_info",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Version Information",
|
||||||
|
"borderColor": "blue",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Секция iOS App → Version:**\n\n1. Screenshots (загрузить)\n2. Promotional Text\n3. Description\n4. Keywords\n5. Support URL\n6. Marketing URL\n7. What's New\n\n**Build:** Выбрать из TestFlight",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_app_review",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🔍 App Review Information",
|
||||||
|
"borderColor": "green",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Sign-In Information:**\nEmail: demo@wellnuo.com\nPassword: WellNuoDemo2025!\n\n**Contact Information:**\nFirst: Bernhard\nLast: Knigge\nPhone: +1-408-647-7068\nEmail: bernhard@wellnuo.com\n\n**Notes:** Добавить инструкции",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 760
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_app_privacy",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🔒 App Privacy",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"pub",
|
||||||
|
"legal"
|
||||||
|
],
|
||||||
|
"description": "**Privacy Policy URL:**\nhttps://wellnuo.com/privacy\n\n**Data Collection:**\n\n✓ Contact Info (Email)\n✓ Health & Fitness\n✓ Identifiers (User ID)\n✓ Usage Data\n✓ Diagnostics\n\n**Tracking:** No",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_submit",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📤 Submit for Review",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Финальные шаги:**\n\n1. Проверить все поля заполнены\n2. Проверить URLs работают\n3. Выбрать Build\n4. Submit for Review\n\n**Review Time:** 24-48 часов\n\n**Release:** Automatic / Manual",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 760
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_header",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 КОПИРОВАТЬ",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy",
|
||||||
|
"overview"
|
||||||
|
],
|
||||||
|
"description": "**Готовые тексты для вставки**\n\nВсе поля ниже - просто копируй и вставляй в App Store Connect.\n\n**Цвет:** Зелёный (lime) = copy-paste",
|
||||||
|
"x": 140,
|
||||||
|
"y": 950
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_basic",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Basic Info",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy"
|
||||||
|
],
|
||||||
|
"description": "**App Name:**\nWellNuo - Senior Care Monitor\n\n**Subtitle:**\nElderly Wellness Tracking\n\n**Bundle ID:**\ncom.wellnuo.seniorcare\n\n**SKU:**\nWELLNUO-SENIOR-001\n\n**Copyright:**\n© 2025 WellNuo Inc.",
|
||||||
|
"x": 520,
|
||||||
|
"y": 920
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_keywords",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Keywords (97 chars)",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ:**\n\nsenior care,elderly monitor,family safety,wellness tracker,aging parents,remote care,health alerts",
|
||||||
|
"x": 520,
|
||||||
|
"y": 1080
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_promo",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Promotional Text",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ (170 chars max):**\n\nCare for your aging parents with peace of mind. WellNuo monitors wellness patterns without cameras - privacy first approach to elderly care.",
|
||||||
|
"x": 900,
|
||||||
|
"y": 920
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_description",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Description",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ:**\n\nCare for your loved ones while preserving their independence. WellNuo is a smart wellness monitoring system designed for elderly family members.\n\nWORRIED ABOUT AGING PARENTS LIVING ALONE?\nWellNuo gives you peace of mind with activity pattern monitoring and instant alerts when something seems unusual.\n\n◆ PRIVACY-FIRST APPROACH\nNo cameras. No microphones. No intrusion.\n\n◆ INSTANT ALERTS\nGet notified immediately when unusual inactivity is detected.\n\n◆ DAILY WELLNESS REPORTS\nTrack trends with easy-to-read reports.\n\n◆ FAMILY SHARING\nConnect the whole family.\n\n◆ AI-POWERED INSIGHTS (Premium)\nSmart analysis detects subtle changes.\n\nFREE FEATURES:\n• Basic activity monitoring\n• Emergency alerts\n• 1 family member\n• 7-day history\n\nPREMIUM:\n• Unlimited history\n• AI analysis\n• Unlimited family\n• Priority support\n\nNOT a medical device.\n\nsupport@wellnuo.com\nwellnuo.com",
|
||||||
|
"x": 900,
|
||||||
|
"y": 1080
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_whats_new",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 What's New",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ:**\n\nWelcome to WellNuo!\n\n• Real-time activity monitoring\n• Instant alert notifications\n• Daily and weekly wellness reports\n• Family sharing and coordination\n• Privacy-focused design\n• Sign in with Apple support\n\nStart caring smarter today.",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 920
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_urls",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 URLs",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy"
|
||||||
|
],
|
||||||
|
"description": "**Privacy Policy URL:**\nhttps://wellnuo.com/privacy\n\n**Support URL:**\nhttps://wellnuo.com/support\n\n**Marketing URL:**\nhttps://wellnuo.com",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 1080
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_review_notes",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Review Notes",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ:**\n\nThis app monitors elderly wellness through activity pattern analysis.\n\nDEMO ACCOUNT:\nThe demo account has 30 days of simulated sensor data. No physical hardware required for testing.\n\nFEATURES TO TEST:\n1. Dashboard - activity overview\n2. Alerts - notifications\n3. Reports - daily/weekly stats\n4. Settings - privacy controls\n5. Family - add members\n\nAI features use OpenAI API (disclosed in privacy policy).\n\nContact: support@wellnuo.com",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 920
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_age_rating",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Age Rating Answers",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy"
|
||||||
|
],
|
||||||
|
"description": "**ВСЕ ОТВЕТЫ:**\n\nViolence: None\nSexual Content: None\nProfanity: None\nDrugs: None\nGambling: None\nHorror: None\nMedical Info: **Infrequent/Mild**\nWeb Access: No\nContests: No\n\n**Результат: 4+**",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 1080
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_export",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Export Compliance",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy"
|
||||||
|
],
|
||||||
|
"description": "**Q: Uses encryption?**\nA: Yes\n\n**Q: Qualifies for exemption?**\nA: Yes - Standard HTTPS/TLS only. Qualifies under Note 4 to Category 5, Part 2 of EAR.\n\nNo custom encryption algorithms.",
|
||||||
|
"x": 2040,
|
||||||
|
"y": 920
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_iap",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 In-App Purchases",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"copy"
|
||||||
|
],
|
||||||
|
"description": "**Monthly:**\nID: com.wellnuo.premium.monthly\nPrice: $4.99/month\nName: WellNuo Premium\nDesc: Unlock unlimited history, AI insights, and family connections.\n\n**Yearly:**\nID: com.wellnuo.premium.yearly\nPrice: $49.99/year\nName: WellNuo Premium (Annual)\nDesc: Save 17% with annual subscription.\n\n**Lifetime:**\nID: com.wellnuo.lifetime\nPrice: $149.99\nName: WellNuo Lifetime\nDesc: One-time purchase for lifetime access.\n\n**Trial:** 7 days",
|
||||||
|
"x": 2040,
|
||||||
|
"y": 1080
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_info_plist",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Info.plist Keys",
|
||||||
|
"borderColor": "cyan",
|
||||||
|
"tags": [
|
||||||
|
"copy",
|
||||||
|
"tech"
|
||||||
|
],
|
||||||
|
"description": "**NSLocationWhenInUseUsageDescription:**\nWellNuo uses your location to detect when you arrive home or leave, helping monitor daily activity patterns.\n\n**NSCameraUsageDescription:**\nWellNuo uses the camera to scan QR codes when setting up devices.\n\n**NSHealthShareUsageDescription:**\nWellNuo reads health data to provide wellness monitoring.\n\n**NSUserNotificationsUsageDescription:**\nWellNuo sends notifications about wellness updates.",
|
||||||
|
"x": 2420,
|
||||||
|
"y": 920
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "copy_privacy_content",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Privacy Policy Content",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"copy",
|
||||||
|
"legal"
|
||||||
|
],
|
||||||
|
"description": "**Ключевые разделы:**\n\n1. **Data Collected:** Email, activity data, device info\n\n2. **How Used:** Monitoring, alerts, reports\n\n3. **AI Disclosure:** OpenAI GPT API for insights. Anonymized data only. User consent required.\n\n4. **Sharing:** NO selling data. Only: authorized family, legal, service providers.\n\n5. **Security:** AES-256 encryption\n\n6. **Rights:** Access, correct, delete data\n\n7. **Children:** Not for under 13\n\n**Contact:** privacy@wellnuo.com",
|
||||||
|
"x": 2420,
|
||||||
|
"y": 1080
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"connections": [
|
||||||
|
{
|
||||||
|
"from": "header",
|
||||||
|
"to": "prep_header",
|
||||||
|
"label": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "header",
|
||||||
|
"to": "pub_header",
|
||||||
|
"label": "2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "header",
|
||||||
|
"to": "copy_header",
|
||||||
|
"label": "3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_header",
|
||||||
|
"to": "prep_privacy_page"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_header",
|
||||||
|
"to": "prep_demo_account"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_privacy_page",
|
||||||
|
"to": "prep_terms_page"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_terms_page",
|
||||||
|
"to": "prep_support_page"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_demo_account",
|
||||||
|
"to": "prep_screenshots"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_screenshots",
|
||||||
|
"to": "prep_app_icon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_app_icon",
|
||||||
|
"to": "prep_build"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_build",
|
||||||
|
"to": "prep_checklist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_header",
|
||||||
|
"to": "pub_developer_account"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_developer_account",
|
||||||
|
"to": "pub_create_app"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_create_app",
|
||||||
|
"to": "pub_app_info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_app_info",
|
||||||
|
"to": "pub_pricing"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_app_info",
|
||||||
|
"to": "pub_version_info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_version_info",
|
||||||
|
"to": "pub_app_review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_app_review",
|
||||||
|
"to": "pub_app_privacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_app_privacy",
|
||||||
|
"to": "pub_submit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_header",
|
||||||
|
"to": "copy_basic"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_basic",
|
||||||
|
"to": "copy_keywords"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_basic",
|
||||||
|
"to": "copy_promo"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_promo",
|
||||||
|
"to": "copy_description"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_keywords",
|
||||||
|
"to": "copy_description"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_description",
|
||||||
|
"to": "copy_whats_new"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_whats_new",
|
||||||
|
"to": "copy_urls"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_urls",
|
||||||
|
"to": "copy_review_notes"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_review_notes",
|
||||||
|
"to": "copy_age_rating"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_age_rating",
|
||||||
|
"to": "copy_export"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_export",
|
||||||
|
"to": "copy_iap"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_iap",
|
||||||
|
"to": "copy_info_plist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "copy_info_plist",
|
||||||
|
"to": "copy_privacy_content"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_checklist",
|
||||||
|
"to": "pub_header",
|
||||||
|
"label": "После подготовки"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tagsDictionary": [
|
||||||
|
{
|
||||||
|
"id": "tag-overview",
|
||||||
|
"name": "overview",
|
||||||
|
"color": "purple"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-prep",
|
||||||
|
"name": "prep",
|
||||||
|
"color": "orange"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-pub",
|
||||||
|
"name": "pub",
|
||||||
|
"color": "blue"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-copy",
|
||||||
|
"name": "copy",
|
||||||
|
"color": "lime"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-website",
|
||||||
|
"name": "website",
|
||||||
|
"color": "red"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-design",
|
||||||
|
"name": "design",
|
||||||
|
"color": "pink"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-tech",
|
||||||
|
"name": "tech",
|
||||||
|
"color": "teal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-legal",
|
||||||
|
"name": "legal",
|
||||||
|
"color": "red"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-checklist",
|
||||||
|
"name": "checklist",
|
||||||
|
"color": "green"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,575 @@
|
|||||||
|
{
|
||||||
|
"_meta": {
|
||||||
|
"name": "App Store Publication",
|
||||||
|
"updatedAt": "2025-12-12T21:45:19.180Z"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"id": "header",
|
||||||
|
"type": "card",
|
||||||
|
"title": "WellNuo - App Store Publication",
|
||||||
|
"borderColor": "purple",
|
||||||
|
"tags": [
|
||||||
|
"overview"
|
||||||
|
],
|
||||||
|
"description": "**Цель:** Опубликовать WellNuo в App Store\n\n**Две фазы:**\n1. **ПОДГОТОВКА** - создать страницы, тексты, материалы\n2. **ПУБЛИКАЦИЯ** - загрузить в App Store Connect\n\n**Контакт:**\nbernhard@wellnuo.com\n+1-408-647-7068",
|
||||||
|
"x": 140,
|
||||||
|
"y": 50
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_header",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📁 ПОДГОТОВКА",
|
||||||
|
"borderColor": "orange",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"overview"
|
||||||
|
],
|
||||||
|
"description": "**Всё что нужно сделать ДО публикации**\n\n**Разделы:**\n• Страницы сайта (3 URL)\n• App Store тексты\n• Дизайн материалы\n• Технические настройки\n• Demo account\n\n**Сайт:** wellnuo.com",
|
||||||
|
"x": 920.0125122070312,
|
||||||
|
"y": -127.84777069091797
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_privacy",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📄 Privacy Policy",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"website"
|
||||||
|
],
|
||||||
|
"description": "**URL:** https://wellnuo.com/privacy\n\n**Разделы для страницы:**\n\n1. **Data Collected:** Email, activity data, device info\n\n2. **How Used:** Monitoring, alerts, reports\n\n3. **AI Disclosure:** OpenAI GPT API. Anonymized data only. User consent required.\n\n4. **Sharing:** NO selling. Only: family, legal, providers.\n\n5. **Security:** AES-256 encryption\n\n6. **Rights:** Access, correct, delete\n\n7. **Children:** Not for under 13\n\n**Contact:** privacy@wellnuo.com",
|
||||||
|
"x": 520,
|
||||||
|
"y": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_terms",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📄 Terms of Service",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"website"
|
||||||
|
],
|
||||||
|
"description": "**URL:** https://wellnuo.com/terms\n\n**Ключевые пункты:**\n\n1. **NOT a medical device** - не замена врачу и 911\n\n2. **Subscriptions** - через Apple, auto-renew\n\n3. **Liability** - не отвечаем за сбои сенсоров\n\n4. **Apple EULA** - ссылка на стандартное\n\n5. **Governing Law** - California, USA\n\n**Contact:** legal@wellnuo.com",
|
||||||
|
"x": 520,
|
||||||
|
"y": 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_support",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📄 Support Page",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"website"
|
||||||
|
],
|
||||||
|
"description": "**URL:** https://wellnuo.com/support\n\n**Контакты:**\nEmail: support@wellnuo.com\nPhone: +1-408-647-7068\nHours: Mon-Fri, 9AM-6PM PST\nResponse: 24-48 hours\n\n**FAQ темы:**\n- Как работает WellNuo?\n- Безопасность данных\n- Отмена подписки\n- Добавление семьи\n- Удаление аккаунта\n\n**Troubleshooting:**\n- Crashes → перезапуск\n- Нет алертов → настройки\n- Сенсоры → Bluetooth",
|
||||||
|
"x": 520,
|
||||||
|
"y": 550
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_app_name",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 App Name & Info",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**App Name (30 chars):**\nWellNuo - Senior Care Monitor\n\n**Subtitle (30 chars):**\nElderly Wellness Tracking\n\n**Bundle ID:**\ncom.wellnuo.seniorcare\n\n**SKU:**\nWELLNUO-SENIOR-001\n\n**Primary Category:**\nHealth & Fitness\n\n**Secondary:**\nLifestyle\n\n**Copyright:**\n© 2025 WellNuo Inc.",
|
||||||
|
"x": 900,
|
||||||
|
"y": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_keywords",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Keywords (97/100)",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ:**\n\nsenior care,elderly monitor,family safety,wellness tracker,aging parents,remote care,health alerts\n\n**Правила:**\n- Без пробелов после запятых\n- Без слов из названия\n- Без множественного числа",
|
||||||
|
"x": 900,
|
||||||
|
"y": 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_description",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Description",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ:**\n\nCare for your loved ones while preserving their independence. WellNuo is a smart wellness monitoring system designed for elderly family members.\n\nWORRIED ABOUT AGING PARENTS LIVING ALONE?\nWellNuo gives you peace of mind with activity pattern monitoring and instant alerts when something seems unusual.\n\n◆ PRIVACY-FIRST APPROACH\nNo cameras. No microphones. No intrusion.\n\n◆ INSTANT ALERTS\nGet notified immediately when unusual inactivity is detected.\n\n◆ DAILY WELLNESS REPORTS\nTrack trends with easy-to-read reports.\n\n◆ FAMILY SHARING\nConnect the whole family.\n\n◆ AI-POWERED INSIGHTS (Premium)\nSmart analysis detects subtle changes.\n\nFREE:\n• Basic monitoring\n• Emergency alerts\n• 1 family member\n• 7-day history\n\nPREMIUM:\n• Unlimited history\n• AI analysis\n• Unlimited family\n• Priority support\n\nNOT a medical device.\n\nsupport@wellnuo.com\nwellnuo.com",
|
||||||
|
"x": 900,
|
||||||
|
"y": 550
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_promo",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Promotional Text",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ (170 chars max):**\n\nCare for your aging parents with peace of mind. WellNuo monitors wellness patterns without cameras - privacy first approach to elderly care.\n\n*Можно менять без ревью!*",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_whats_new",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 What's New (v1.0)",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ:**\n\nWelcome to WellNuo!\n\n• Real-time activity monitoring\n• Instant alert notifications\n• Daily and weekly wellness reports\n• Family sharing and coordination\n• Privacy-focused design\n• Sign in with Apple support\n\nStart caring smarter today.",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_review_notes",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Review Notes",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ:**\n\nThis app monitors elderly wellness through activity pattern analysis.\n\nDEMO ACCOUNT:\nThe demo account has 30 days of simulated sensor data. No physical hardware required for testing.\n\nFEATURES TO TEST:\n1. Dashboard - activity overview\n2. Alerts - notifications\n3. Reports - daily/weekly stats\n4. Settings - privacy controls\n5. Family - add members\n\nAI features use OpenAI API (disclosed in privacy policy).\n\nContact: support@wellnuo.com",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 550
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_demo",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🔑 Demo Account",
|
||||||
|
"borderColor": "green",
|
||||||
|
"tags": [
|
||||||
|
"prep"
|
||||||
|
],
|
||||||
|
"description": "**Для Apple Review:**\n\n**Email:** demo@wellnuo.com\n**Password:** WellNuoDemo2025!\n\n**Требования:**\n- 30 дней симулированных данных\n- Premium подписка активна\n- Все функции работают\n- Без реального оборудования\n\n**Contact:**\nFirst: Bernhard\nLast: Knigge\nPhone: +1-408-647-7068\nEmail: bernhard@wellnuo.com",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_screenshots",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📱 Screenshots",
|
||||||
|
"borderColor": "pink",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"design"
|
||||||
|
],
|
||||||
|
"description": "**Размеры:**\n\n**iPhone 6.7\" (обязательно):**\n1290×2796 px\n\n**iPhone 6.5\":**\n1284×2778 px\n\n**iPhone 5.5\" (старые):**\n1242×2208 px\n\n**Экраны (3-10 штук):**\n1. Dashboard\n2. Alerts\n3. Reports\n4. Settings\n5. Family",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_icon",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🎨 App Icon",
|
||||||
|
"borderColor": "pink",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"design"
|
||||||
|
],
|
||||||
|
"description": "**Размер:** 1024×1024 PNG\n\n**Требования:**\n- Без прозрачности (no alpha)\n- Без закругленных углов\n- Четко на всех размерах\n\n**Стиль:**\nСердце/забота, градиент синий",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 550
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_iap",
|
||||||
|
"type": "card",
|
||||||
|
"title": "💰 In-App Purchases",
|
||||||
|
"borderColor": "orange",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**Monthly:**\nID: com.wellnuo.premium.monthly\nPrice: $4.99/month\nName: WellNuo Premium\nDesc: Unlock unlimited history, AI insights, and family connections.\n\n**Yearly:**\nID: com.wellnuo.premium.yearly\nPrice: $49.99/year\nName: WellNuo Premium (Annual)\nDesc: Save 17% with annual subscription.\n\n**Lifetime:**\nID: com.wellnuo.lifetime\nPrice: $149.99\nName: WellNuo Lifetime\nDesc: One-time purchase for lifetime access.\n\n**Trial:** 7 days",
|
||||||
|
"x": 2040,
|
||||||
|
"y": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_age_rating",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Age Rating (4+)",
|
||||||
|
"borderColor": "teal",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**Ответы на вопросник:**\n\nViolence: **None**\nSexual Content: **None**\nProfanity: **None**\nDrugs: **None**\nGambling: **None**\nHorror: **None**\nMedical Info: **Infrequent/Mild**\nWeb Access: **No**\nContests: **No**\n\n**Результат: 4+**",
|
||||||
|
"x": 2040,
|
||||||
|
"y": 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_export",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Export Compliance",
|
||||||
|
"borderColor": "teal",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**Q: Uses encryption?**\nA: Yes\n\n**Q: Qualifies for exemption?**\nA: Yes - Standard HTTPS/TLS only.\n\nQualifies under Note 4 to Category 5, Part 2 of EAR.\n\nNo custom encryption algorithms.",
|
||||||
|
"x": 2040,
|
||||||
|
"y": 550
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_info_plist",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Info.plist Keys",
|
||||||
|
"borderColor": "cyan",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"tech"
|
||||||
|
],
|
||||||
|
"description": "**NSLocationWhenInUseUsageDescription:**\nWellNuo uses your location to detect when you arrive home or leave, helping monitor daily activity patterns.\n\n**NSCameraUsageDescription:**\nWellNuo uses the camera to scan QR codes when setting up devices.\n\n**NSHealthShareUsageDescription:**\nWellNuo reads health data to provide wellness monitoring.\n\n**NSUserNotificationsUsageDescription:**\nWellNuo sends notifications about wellness updates.",
|
||||||
|
"x": 2420,
|
||||||
|
"y": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_privacy_labels",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 App Privacy Labels",
|
||||||
|
"borderColor": "cyan",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**Data Collected:**\n\n✓ Contact Info (Email)\n - Linked: Yes\n - Purpose: App Functionality\n\n✓ Health & Fitness\n - Linked: Yes\n - Purpose: App Functionality\n\n✓ Identifiers (User ID)\n - Linked: Yes\n - Purpose: App Functionality\n\n✓ Usage Data\n - Linked: No\n - Purpose: Analytics\n\n✓ Diagnostics\n - Linked: No\n - Purpose: App Functionality\n\n**Tracking:** No",
|
||||||
|
"x": 2420,
|
||||||
|
"y": 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_build",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🔨 Build & TestFlight",
|
||||||
|
"borderColor": "teal",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"tech"
|
||||||
|
],
|
||||||
|
"description": "**Команды:**\n```\neas build --platform ios\neas submit --platform ios\n```\n\n**Требования:**\n- iOS 17.0+ minimum\n- Xcode 15.2+\n- Без crashes 24ч\n\n**TestFlight:**\n- Internal: до 100 тестеров\n- External: требует Beta Review",
|
||||||
|
"x": 2420,
|
||||||
|
"y": 550
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_checklist",
|
||||||
|
"type": "card",
|
||||||
|
"title": "✅ Checklist Подготовки",
|
||||||
|
"borderColor": "green",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"checklist"
|
||||||
|
],
|
||||||
|
"description": "**Перед публикацией:**\n\n**Сайт:**\n□ wellnuo.com/privacy работает\n□ wellnuo.com/terms работает\n□ wellnuo.com/support работает\n\n**Материалы:**\n□ Screenshots готовы\n□ App Icon 1024x1024\n□ Все тексты готовы\n\n**Технические:**\n□ Demo account работает\n□ Build в TestFlight\n□ Нет crashes 24ч",
|
||||||
|
"x": 2800,
|
||||||
|
"y": 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_header",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🚀 ПУБЛИКАЦИЯ",
|
||||||
|
"borderColor": "blue",
|
||||||
|
"tags": [
|
||||||
|
"pub",
|
||||||
|
"overview"
|
||||||
|
],
|
||||||
|
"description": "**App Store Connect**\n\n**URL:** appstoreconnect.apple.com\n\n**Шаги:**\n1. Apple Developer Account\n2. Создание App\n3. Заполнение полей\n4. Submit на Review\n\n**Review Time:** 24-48 часов",
|
||||||
|
"x": 140,
|
||||||
|
"y": 800
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_account",
|
||||||
|
"type": "card",
|
||||||
|
"title": "👤 Apple Developer Account",
|
||||||
|
"borderColor": "purple",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**URL:** developer.apple.com/enroll\n**Стоимость:** $99/год\n\n**Тип:** Organization\n\n**Требуется:**\n- D-U-N-S Number\n- Юр. название компании\n- Website\n- Телефон для верификации\n\n**Время:** 1-7 дней",
|
||||||
|
"x": 520,
|
||||||
|
"y": 750
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_create",
|
||||||
|
"type": "card",
|
||||||
|
"title": "➕ Создание App",
|
||||||
|
"borderColor": "blue",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**My Apps → + → New App**\n\n**Заполнить:**\n- Platform: iOS\n- Name: WellNuo - Senior Care Monitor\n- Primary Language: English\n- Bundle ID: com.wellnuo.seniorcare\n- SKU: WELLNUO-SENIOR-001\n\n**User Access:** Full Access",
|
||||||
|
"x": 520,
|
||||||
|
"y": 950
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_app_info",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📝 App Information",
|
||||||
|
"borderColor": "blue",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Секция App Information:**\n\n**Subtitle:**\nElderly Wellness Tracking\n\n**Category:**\nPrimary: Health & Fitness\nSecondary: Lifestyle\n\n**Content Rights:**\nDoes not contain third-party content\n\n**Age Rating:**\nЗаполнить вопросник → **4+**",
|
||||||
|
"x": 900,
|
||||||
|
"y": 750
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_pricing",
|
||||||
|
"type": "card",
|
||||||
|
"title": "💰 Pricing",
|
||||||
|
"borderColor": "orange",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Schedule → Price:**\nBase Price: **Free**\n\n**Availability:**\nAll territories\n\n**In-App Purchases:**\nСоздать 3 продукта из подготовки\n\n**Subscriptions:**\nГруппа: WellNuo Premium\nTrial: 7 days",
|
||||||
|
"x": 900,
|
||||||
|
"y": 950
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_version",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Version Info",
|
||||||
|
"borderColor": "blue",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**iOS App → 1.0:**\n\n1. **Screenshots** - загрузить\n2. **Promotional Text** - из подготовки\n3. **Description** - из подготовки\n4. **Keywords** - из подготовки\n5. **Support URL** - wellnuo.com/support\n6. **Marketing URL** - wellnuo.com\n7. **What's New** - из подготовки\n8. **Build** - выбрать из TestFlight",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 750
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_review",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🔍 App Review",
|
||||||
|
"borderColor": "green",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Sign-In Required:** Yes\n\n**Demo Account:**\nEmail: demo@wellnuo.com\nPassword: WellNuoDemo2025!\n\n**Contact:**\nFirst: Bernhard\nLast: Knigge\nPhone: +1-408-647-7068\nEmail: bernhard@wellnuo.com\n\n**Notes:** вставить из подготовки",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 950
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_privacy",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🔒 App Privacy",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Privacy Policy URL:**\nhttps://wellnuo.com/privacy\n\n**Data Collection:**\nЗаполнить по чеклисту из App Privacy Labels\n\n**Tracking:** No\n\n**Third-Party SDKs:**\nOpenAI API (disclosed)",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 750
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_submit",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📤 Submit",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Финальные шаги:**\n\n1. ✓ Все поля заполнены\n2. ✓ URLs работают\n3. ✓ Build выбран\n4. ✓ Screenshots загружены\n5. **Add for Review**\n6. **Submit to App Review**\n\n**Review:** 24-48 часов\n**Release:** Automatic",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 950
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"connections": [
|
||||||
|
{
|
||||||
|
"from": "header",
|
||||||
|
"to": "prep_header",
|
||||||
|
"label": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "header",
|
||||||
|
"to": "pub_header",
|
||||||
|
"label": "2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_header",
|
||||||
|
"to": "prep_privacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_header",
|
||||||
|
"to": "prep_app_name"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_header",
|
||||||
|
"to": "prep_demo"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_header",
|
||||||
|
"to": "prep_iap"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_header",
|
||||||
|
"to": "prep_info_plist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_privacy",
|
||||||
|
"to": "prep_terms"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_terms",
|
||||||
|
"to": "prep_support"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_app_name",
|
||||||
|
"to": "prep_keywords"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_keywords",
|
||||||
|
"to": "prep_description"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_description",
|
||||||
|
"to": "prep_promo"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_promo",
|
||||||
|
"to": "prep_whats_new"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_whats_new",
|
||||||
|
"to": "prep_review_notes"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_demo",
|
||||||
|
"to": "prep_screenshots"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_screenshots",
|
||||||
|
"to": "prep_icon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_iap",
|
||||||
|
"to": "prep_age_rating"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_age_rating",
|
||||||
|
"to": "prep_export"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_info_plist",
|
||||||
|
"to": "prep_privacy_labels"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_privacy_labels",
|
||||||
|
"to": "prep_build"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_support",
|
||||||
|
"to": "prep_checklist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_review_notes",
|
||||||
|
"to": "prep_checklist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_icon",
|
||||||
|
"to": "prep_checklist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_export",
|
||||||
|
"to": "prep_checklist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_build",
|
||||||
|
"to": "prep_checklist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_checklist",
|
||||||
|
"to": "pub_header",
|
||||||
|
"label": "Готово →"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_header",
|
||||||
|
"to": "pub_account"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_account",
|
||||||
|
"to": "pub_create"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_create",
|
||||||
|
"to": "pub_app_info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_app_info",
|
||||||
|
"to": "pub_pricing"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_app_info",
|
||||||
|
"to": "pub_version"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_version",
|
||||||
|
"to": "pub_review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_review",
|
||||||
|
"to": "pub_privacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_pricing",
|
||||||
|
"to": "pub_privacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_privacy",
|
||||||
|
"to": "pub_submit"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tagsDictionary": [
|
||||||
|
{
|
||||||
|
"id": "tag-overview",
|
||||||
|
"name": "overview",
|
||||||
|
"color": "purple"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-prep",
|
||||||
|
"name": "prep",
|
||||||
|
"color": "orange"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-pub",
|
||||||
|
"name": "pub",
|
||||||
|
"color": "blue"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-website",
|
||||||
|
"name": "website",
|
||||||
|
"color": "red"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-appstore",
|
||||||
|
"name": "appstore",
|
||||||
|
"color": "lime"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-design",
|
||||||
|
"name": "design",
|
||||||
|
"color": "pink"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-tech",
|
||||||
|
"name": "tech",
|
||||||
|
"color": "teal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-checklist",
|
||||||
|
"name": "checklist",
|
||||||
|
"color": "green"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,575 @@
|
|||||||
|
{
|
||||||
|
"_meta": {
|
||||||
|
"name": "App Store Publication",
|
||||||
|
"updatedAt": "2025-12-12T21:45:22.793Z"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"id": "header",
|
||||||
|
"type": "card",
|
||||||
|
"title": "WellNuo - App Store Publication",
|
||||||
|
"borderColor": "purple",
|
||||||
|
"tags": [
|
||||||
|
"overview"
|
||||||
|
],
|
||||||
|
"description": "**Цель:** Опубликовать WellNuo в App Store\n\n**Две фазы:**\n1. **ПОДГОТОВКА** - создать страницы, тексты, материалы\n2. **ПУБЛИКАЦИЯ** - загрузить в App Store Connect\n\n**Контакт:**\nbernhard@wellnuo.com\n+1-408-647-7068",
|
||||||
|
"x": 140,
|
||||||
|
"y": 50
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_header",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📁 ПОДГОТОВКА",
|
||||||
|
"borderColor": "orange",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"overview"
|
||||||
|
],
|
||||||
|
"description": "**Всё что нужно сделать ДО публикации**\n\n**Разделы:**\n• Страницы сайта (3 URL)\n• App Store тексты\n• Дизайн материалы\n• Технические настройки\n• Demo account\n\n**Сайт:** wellnuo.com",
|
||||||
|
"x": 920.0125122070312,
|
||||||
|
"y": -127.84777069091797
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_privacy",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📄 Privacy Policy",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"website"
|
||||||
|
],
|
||||||
|
"description": "**URL:** https://wellnuo.com/privacy\n\n**Разделы для страницы:**\n\n1. **Data Collected:** Email, activity data, device info\n\n2. **How Used:** Monitoring, alerts, reports\n\n3. **AI Disclosure:** OpenAI GPT API. Anonymized data only. User consent required.\n\n4. **Sharing:** NO selling. Only: family, legal, providers.\n\n5. **Security:** AES-256 encryption\n\n6. **Rights:** Access, correct, delete\n\n7. **Children:** Not for under 13\n\n**Contact:** privacy@wellnuo.com",
|
||||||
|
"x": 520,
|
||||||
|
"y": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_terms",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📄 Terms of Service",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"website"
|
||||||
|
],
|
||||||
|
"description": "**URL:** https://wellnuo.com/terms\n\n**Ключевые пункты:**\n\n1. **NOT a medical device** - не замена врачу и 911\n\n2. **Subscriptions** - через Apple, auto-renew\n\n3. **Liability** - не отвечаем за сбои сенсоров\n\n4. **Apple EULA** - ссылка на стандартное\n\n5. **Governing Law** - California, USA\n\n**Contact:** legal@wellnuo.com",
|
||||||
|
"x": 520,
|
||||||
|
"y": 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_support",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📄 Support Page",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"website"
|
||||||
|
],
|
||||||
|
"description": "**URL:** https://wellnuo.com/support\n\n**Контакты:**\nEmail: support@wellnuo.com\nPhone: +1-408-647-7068\nHours: Mon-Fri, 9AM-6PM PST\nResponse: 24-48 hours\n\n**FAQ темы:**\n- Как работает WellNuo?\n- Безопасность данных\n- Отмена подписки\n- Добавление семьи\n- Удаление аккаунта\n\n**Troubleshooting:**\n- Crashes → перезапуск\n- Нет алертов → настройки\n- Сенсоры → Bluetooth",
|
||||||
|
"x": 520,
|
||||||
|
"y": 550
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_app_name",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 App Name & Info",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**App Name (30 chars):**\nWellNuo - Senior Care Monitor\n\n**Subtitle (30 chars):**\nElderly Wellness Tracking\n\n**Bundle ID:**\ncom.wellnuo.seniorcare\n\n**SKU:**\nWELLNUO-SENIOR-001\n\n**Primary Category:**\nHealth & Fitness\n\n**Secondary:**\nLifestyle\n\n**Copyright:**\n© 2025 WellNuo Inc.",
|
||||||
|
"x": 900,
|
||||||
|
"y": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_keywords",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Keywords (97/100)",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ:**\n\nsenior care,elderly monitor,family safety,wellness tracker,aging parents,remote care,health alerts\n\n**Правила:**\n- Без пробелов после запятых\n- Без слов из названия\n- Без множественного числа",
|
||||||
|
"x": 900,
|
||||||
|
"y": 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_description",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Description",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ:**\n\nCare for your loved ones while preserving their independence. WellNuo is a smart wellness monitoring system designed for elderly family members.\n\nWORRIED ABOUT AGING PARENTS LIVING ALONE?\nWellNuo gives you peace of mind with activity pattern monitoring and instant alerts when something seems unusual.\n\n◆ PRIVACY-FIRST APPROACH\nNo cameras. No microphones. No intrusion.\n\n◆ INSTANT ALERTS\nGet notified immediately when unusual inactivity is detected.\n\n◆ DAILY WELLNESS REPORTS\nTrack trends with easy-to-read reports.\n\n◆ FAMILY SHARING\nConnect the whole family.\n\n◆ AI-POWERED INSIGHTS (Premium)\nSmart analysis detects subtle changes.\n\nFREE:\n• Basic monitoring\n• Emergency alerts\n• 1 family member\n• 7-day history\n\nPREMIUM:\n• Unlimited history\n• AI analysis\n• Unlimited family\n• Priority support\n\nNOT a medical device.\n\nsupport@wellnuo.com\nwellnuo.com",
|
||||||
|
"x": 900,
|
||||||
|
"y": 550
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_promo",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Promotional Text",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ (170 chars max):**\n\nCare for your aging parents with peace of mind. WellNuo monitors wellness patterns without cameras - privacy first approach to elderly care.\n\n*Можно менять без ревью!*",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_whats_new",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 What's New (v1.0)",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ:**\n\nWelcome to WellNuo!\n\n• Real-time activity monitoring\n• Instant alert notifications\n• Daily and weekly wellness reports\n• Family sharing and coordination\n• Privacy-focused design\n• Sign in with Apple support\n\nStart caring smarter today.",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_review_notes",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Review Notes",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ:**\n\nThis app monitors elderly wellness through activity pattern analysis.\n\nDEMO ACCOUNT:\nThe demo account has 30 days of simulated sensor data. No physical hardware required for testing.\n\nFEATURES TO TEST:\n1. Dashboard - activity overview\n2. Alerts - notifications\n3. Reports - daily/weekly stats\n4. Settings - privacy controls\n5. Family - add members\n\nAI features use OpenAI API (disclosed in privacy policy).\n\nContact: support@wellnuo.com",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 550
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_demo",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🔑 Demo Account",
|
||||||
|
"borderColor": "green",
|
||||||
|
"tags": [
|
||||||
|
"prep"
|
||||||
|
],
|
||||||
|
"description": "**Для Apple Review:**\n\n**Email:** demo@wellnuo.com\n**Password:** WellNuoDemo2025!\n\n**Требования:**\n- 30 дней симулированных данных\n- Premium подписка активна\n- Все функции работают\n- Без реального оборудования\n\n**Contact:**\nFirst: Bernhard\nLast: Knigge\nPhone: +1-408-647-7068\nEmail: bernhard@wellnuo.com",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_screenshots",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📱 Screenshots",
|
||||||
|
"borderColor": "pink",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"design"
|
||||||
|
],
|
||||||
|
"description": "**Размеры:**\n\n**iPhone 6.7\" (обязательно):**\n1290×2796 px\n\n**iPhone 6.5\":**\n1284×2778 px\n\n**iPhone 5.5\" (старые):**\n1242×2208 px\n\n**Экраны (3-10 штук):**\n1. Dashboard\n2. Alerts\n3. Reports\n4. Settings\n5. Family",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_icon",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🎨 App Icon",
|
||||||
|
"borderColor": "pink",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"design"
|
||||||
|
],
|
||||||
|
"description": "**Размер:** 1024×1024 PNG\n\n**Требования:**\n- Без прозрачности (no alpha)\n- Без закругленных углов\n- Четко на всех размерах\n\n**Стиль:**\nСердце/забота, градиент синий",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 550
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_iap",
|
||||||
|
"type": "card",
|
||||||
|
"title": "💰 In-App Purchases",
|
||||||
|
"borderColor": "orange",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**Monthly:**\nID: com.wellnuo.premium.monthly\nPrice: $4.99/month\nName: WellNuo Premium\nDesc: Unlock unlimited history, AI insights, and family connections.\n\n**Yearly:**\nID: com.wellnuo.premium.yearly\nPrice: $49.99/year\nName: WellNuo Premium (Annual)\nDesc: Save 17% with annual subscription.\n\n**Lifetime:**\nID: com.wellnuo.lifetime\nPrice: $149.99\nName: WellNuo Lifetime\nDesc: One-time purchase for lifetime access.\n\n**Trial:** 7 days",
|
||||||
|
"x": 2040,
|
||||||
|
"y": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_age_rating",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Age Rating (4+)",
|
||||||
|
"borderColor": "teal",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**Ответы на вопросник:**\n\nViolence: **None**\nSexual Content: **None**\nProfanity: **None**\nDrugs: **None**\nGambling: **None**\nHorror: **None**\nMedical Info: **Infrequent/Mild**\nWeb Access: **No**\nContests: **No**\n\n**Результат: 4+**",
|
||||||
|
"x": 2040,
|
||||||
|
"y": 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_export",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Export Compliance",
|
||||||
|
"borderColor": "teal",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**Q: Uses encryption?**\nA: Yes\n\n**Q: Qualifies for exemption?**\nA: Yes - Standard HTTPS/TLS only.\n\nQualifies under Note 4 to Category 5, Part 2 of EAR.\n\nNo custom encryption algorithms.",
|
||||||
|
"x": 2040,
|
||||||
|
"y": 550
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_info_plist",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Info.plist Keys",
|
||||||
|
"borderColor": "cyan",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"tech"
|
||||||
|
],
|
||||||
|
"description": "**NSLocationWhenInUseUsageDescription:**\nWellNuo uses your location to detect when you arrive home or leave, helping monitor daily activity patterns.\n\n**NSCameraUsageDescription:**\nWellNuo uses the camera to scan QR codes when setting up devices.\n\n**NSHealthShareUsageDescription:**\nWellNuo reads health data to provide wellness monitoring.\n\n**NSUserNotificationsUsageDescription:**\nWellNuo sends notifications about wellness updates.",
|
||||||
|
"x": 2420,
|
||||||
|
"y": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_privacy_labels",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 App Privacy Labels",
|
||||||
|
"borderColor": "cyan",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**Data Collected:**\n\n✓ Contact Info (Email)\n - Linked: Yes\n - Purpose: App Functionality\n\n✓ Health & Fitness\n - Linked: Yes\n - Purpose: App Functionality\n\n✓ Identifiers (User ID)\n - Linked: Yes\n - Purpose: App Functionality\n\n✓ Usage Data\n - Linked: No\n - Purpose: Analytics\n\n✓ Diagnostics\n - Linked: No\n - Purpose: App Functionality\n\n**Tracking:** No",
|
||||||
|
"x": 2420,
|
||||||
|
"y": 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_build",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🔨 Build & TestFlight",
|
||||||
|
"borderColor": "teal",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"tech"
|
||||||
|
],
|
||||||
|
"description": "**Команды:**\n```\neas build --platform ios\neas submit --platform ios\n```\n\n**Требования:**\n- iOS 17.0+ minimum\n- Xcode 15.2+\n- Без crashes 24ч\n\n**TestFlight:**\n- Internal: до 100 тестеров\n- External: требует Beta Review",
|
||||||
|
"x": 2420,
|
||||||
|
"y": 550
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_checklist",
|
||||||
|
"type": "card",
|
||||||
|
"title": "✅ Checklist Подготовки",
|
||||||
|
"borderColor": "green",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"checklist"
|
||||||
|
],
|
||||||
|
"description": "**Перед публикацией:**\n\n**Сайт:**\n□ wellnuo.com/privacy работает\n□ wellnuo.com/terms работает\n□ wellnuo.com/support работает\n\n**Материалы:**\n□ Screenshots готовы\n□ App Icon 1024x1024\n□ Все тексты готовы\n\n**Технические:**\n□ Demo account работает\n□ Build в TestFlight\n□ Нет crashes 24ч",
|
||||||
|
"x": 983.7119140625,
|
||||||
|
"y": 602.5220031738281
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_header",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🚀 ПУБЛИКАЦИЯ",
|
||||||
|
"borderColor": "blue",
|
||||||
|
"tags": [
|
||||||
|
"pub",
|
||||||
|
"overview"
|
||||||
|
],
|
||||||
|
"description": "**App Store Connect**\n\n**URL:** appstoreconnect.apple.com\n\n**Шаги:**\n1. Apple Developer Account\n2. Создание App\n3. Заполнение полей\n4. Submit на Review\n\n**Review Time:** 24-48 часов",
|
||||||
|
"x": 140,
|
||||||
|
"y": 800
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_account",
|
||||||
|
"type": "card",
|
||||||
|
"title": "👤 Apple Developer Account",
|
||||||
|
"borderColor": "purple",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**URL:** developer.apple.com/enroll\n**Стоимость:** $99/год\n\n**Тип:** Organization\n\n**Требуется:**\n- D-U-N-S Number\n- Юр. название компании\n- Website\n- Телефон для верификации\n\n**Время:** 1-7 дней",
|
||||||
|
"x": 520,
|
||||||
|
"y": 750
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_create",
|
||||||
|
"type": "card",
|
||||||
|
"title": "➕ Создание App",
|
||||||
|
"borderColor": "blue",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**My Apps → + → New App**\n\n**Заполнить:**\n- Platform: iOS\n- Name: WellNuo - Senior Care Monitor\n- Primary Language: English\n- Bundle ID: com.wellnuo.seniorcare\n- SKU: WELLNUO-SENIOR-001\n\n**User Access:** Full Access",
|
||||||
|
"x": 520,
|
||||||
|
"y": 950
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_app_info",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📝 App Information",
|
||||||
|
"borderColor": "blue",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Секция App Information:**\n\n**Subtitle:**\nElderly Wellness Tracking\n\n**Category:**\nPrimary: Health & Fitness\nSecondary: Lifestyle\n\n**Content Rights:**\nDoes not contain third-party content\n\n**Age Rating:**\nЗаполнить вопросник → **4+**",
|
||||||
|
"x": 900,
|
||||||
|
"y": 750
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_pricing",
|
||||||
|
"type": "card",
|
||||||
|
"title": "💰 Pricing",
|
||||||
|
"borderColor": "orange",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Schedule → Price:**\nBase Price: **Free**\n\n**Availability:**\nAll territories\n\n**In-App Purchases:**\nСоздать 3 продукта из подготовки\n\n**Subscriptions:**\nГруппа: WellNuo Premium\nTrial: 7 days",
|
||||||
|
"x": 900,
|
||||||
|
"y": 950
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_version",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Version Info",
|
||||||
|
"borderColor": "blue",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**iOS App → 1.0:**\n\n1. **Screenshots** - загрузить\n2. **Promotional Text** - из подготовки\n3. **Description** - из подготовки\n4. **Keywords** - из подготовки\n5. **Support URL** - wellnuo.com/support\n6. **Marketing URL** - wellnuo.com\n7. **What's New** - из подготовки\n8. **Build** - выбрать из TestFlight",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 750
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_review",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🔍 App Review",
|
||||||
|
"borderColor": "green",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Sign-In Required:** Yes\n\n**Demo Account:**\nEmail: demo@wellnuo.com\nPassword: WellNuoDemo2025!\n\n**Contact:**\nFirst: Bernhard\nLast: Knigge\nPhone: +1-408-647-7068\nEmail: bernhard@wellnuo.com\n\n**Notes:** вставить из подготовки",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 950
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_privacy",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🔒 App Privacy",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Privacy Policy URL:**\nhttps://wellnuo.com/privacy\n\n**Data Collection:**\nЗаполнить по чеклисту из App Privacy Labels\n\n**Tracking:** No\n\n**Third-Party SDKs:**\nOpenAI API (disclosed)",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 750
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_submit",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📤 Submit",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Финальные шаги:**\n\n1. ✓ Все поля заполнены\n2. ✓ URLs работают\n3. ✓ Build выбран\n4. ✓ Screenshots загружены\n5. **Add for Review**\n6. **Submit to App Review**\n\n**Review:** 24-48 часов\n**Release:** Automatic",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 950
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"connections": [
|
||||||
|
{
|
||||||
|
"from": "header",
|
||||||
|
"to": "prep_header",
|
||||||
|
"label": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "header",
|
||||||
|
"to": "pub_header",
|
||||||
|
"label": "2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_header",
|
||||||
|
"to": "prep_privacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_header",
|
||||||
|
"to": "prep_app_name"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_header",
|
||||||
|
"to": "prep_demo"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_header",
|
||||||
|
"to": "prep_iap"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_header",
|
||||||
|
"to": "prep_info_plist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_privacy",
|
||||||
|
"to": "prep_terms"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_terms",
|
||||||
|
"to": "prep_support"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_app_name",
|
||||||
|
"to": "prep_keywords"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_keywords",
|
||||||
|
"to": "prep_description"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_description",
|
||||||
|
"to": "prep_promo"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_promo",
|
||||||
|
"to": "prep_whats_new"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_whats_new",
|
||||||
|
"to": "prep_review_notes"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_demo",
|
||||||
|
"to": "prep_screenshots"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_screenshots",
|
||||||
|
"to": "prep_icon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_iap",
|
||||||
|
"to": "prep_age_rating"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_age_rating",
|
||||||
|
"to": "prep_export"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_info_plist",
|
||||||
|
"to": "prep_privacy_labels"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_privacy_labels",
|
||||||
|
"to": "prep_build"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_support",
|
||||||
|
"to": "prep_checklist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_review_notes",
|
||||||
|
"to": "prep_checklist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_icon",
|
||||||
|
"to": "prep_checklist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_export",
|
||||||
|
"to": "prep_checklist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_build",
|
||||||
|
"to": "prep_checklist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_checklist",
|
||||||
|
"to": "pub_header",
|
||||||
|
"label": "Готово →"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_header",
|
||||||
|
"to": "pub_account"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_account",
|
||||||
|
"to": "pub_create"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_create",
|
||||||
|
"to": "pub_app_info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_app_info",
|
||||||
|
"to": "pub_pricing"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_app_info",
|
||||||
|
"to": "pub_version"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_version",
|
||||||
|
"to": "pub_review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_review",
|
||||||
|
"to": "pub_privacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_pricing",
|
||||||
|
"to": "pub_privacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_privacy",
|
||||||
|
"to": "pub_submit"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tagsDictionary": [
|
||||||
|
{
|
||||||
|
"id": "tag-overview",
|
||||||
|
"name": "overview",
|
||||||
|
"color": "purple"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-prep",
|
||||||
|
"name": "prep",
|
||||||
|
"color": "orange"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-pub",
|
||||||
|
"name": "pub",
|
||||||
|
"color": "blue"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-website",
|
||||||
|
"name": "website",
|
||||||
|
"color": "red"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-appstore",
|
||||||
|
"name": "appstore",
|
||||||
|
"color": "lime"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-design",
|
||||||
|
"name": "design",
|
||||||
|
"color": "pink"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-tech",
|
||||||
|
"name": "tech",
|
||||||
|
"color": "teal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-checklist",
|
||||||
|
"name": "checklist",
|
||||||
|
"color": "green"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,575 @@
|
|||||||
|
{
|
||||||
|
"_meta": {
|
||||||
|
"name": "App Store Publication",
|
||||||
|
"updatedAt": "2025-12-12T21:45:27.718Z"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"id": "header",
|
||||||
|
"type": "card",
|
||||||
|
"title": "WellNuo - App Store Publication",
|
||||||
|
"borderColor": "purple",
|
||||||
|
"tags": [
|
||||||
|
"overview"
|
||||||
|
],
|
||||||
|
"description": "**Цель:** Опубликовать WellNuo в App Store\n\n**Две фазы:**\n1. **ПОДГОТОВКА** - создать страницы, тексты, материалы\n2. **ПУБЛИКАЦИЯ** - загрузить в App Store Connect\n\n**Контакт:**\nbernhard@wellnuo.com\n+1-408-647-7068",
|
||||||
|
"x": 140,
|
||||||
|
"y": 50
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_header",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📁 ПОДГОТОВКА",
|
||||||
|
"borderColor": "orange",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"overview"
|
||||||
|
],
|
||||||
|
"description": "**Всё что нужно сделать ДО публикации**\n\n**Разделы:**\n• Страницы сайта (3 URL)\n• App Store тексты\n• Дизайн материалы\n• Технические настройки\n• Demo account\n\n**Сайт:** wellnuo.com",
|
||||||
|
"x": 920.0125122070312,
|
||||||
|
"y": -127.84777069091797
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_privacy",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📄 Privacy Policy",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"website"
|
||||||
|
],
|
||||||
|
"description": "**URL:** https://wellnuo.com/privacy\n\n**Разделы для страницы:**\n\n1. **Data Collected:** Email, activity data, device info\n\n2. **How Used:** Monitoring, alerts, reports\n\n3. **AI Disclosure:** OpenAI GPT API. Anonymized data only. User consent required.\n\n4. **Sharing:** NO selling. Only: family, legal, providers.\n\n5. **Security:** AES-256 encryption\n\n6. **Rights:** Access, correct, delete\n\n7. **Children:** Not for under 13\n\n**Contact:** privacy@wellnuo.com",
|
||||||
|
"x": 520,
|
||||||
|
"y": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_terms",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📄 Terms of Service",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"website"
|
||||||
|
],
|
||||||
|
"description": "**URL:** https://wellnuo.com/terms\n\n**Ключевые пункты:**\n\n1. **NOT a medical device** - не замена врачу и 911\n\n2. **Subscriptions** - через Apple, auto-renew\n\n3. **Liability** - не отвечаем за сбои сенсоров\n\n4. **Apple EULA** - ссылка на стандартное\n\n5. **Governing Law** - California, USA\n\n**Contact:** legal@wellnuo.com",
|
||||||
|
"x": 520,
|
||||||
|
"y": 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_support",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📄 Support Page",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"website"
|
||||||
|
],
|
||||||
|
"description": "**URL:** https://wellnuo.com/support\n\n**Контакты:**\nEmail: support@wellnuo.com\nPhone: +1-408-647-7068\nHours: Mon-Fri, 9AM-6PM PST\nResponse: 24-48 hours\n\n**FAQ темы:**\n- Как работает WellNuo?\n- Безопасность данных\n- Отмена подписки\n- Добавление семьи\n- Удаление аккаунта\n\n**Troubleshooting:**\n- Crashes → перезапуск\n- Нет алертов → настройки\n- Сенсоры → Bluetooth",
|
||||||
|
"x": 520,
|
||||||
|
"y": 550
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_app_name",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 App Name & Info",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**App Name (30 chars):**\nWellNuo - Senior Care Monitor\n\n**Subtitle (30 chars):**\nElderly Wellness Tracking\n\n**Bundle ID:**\ncom.wellnuo.seniorcare\n\n**SKU:**\nWELLNUO-SENIOR-001\n\n**Primary Category:**\nHealth & Fitness\n\n**Secondary:**\nLifestyle\n\n**Copyright:**\n© 2025 WellNuo Inc.",
|
||||||
|
"x": 900,
|
||||||
|
"y": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_keywords",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Keywords (97/100)",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ:**\n\nsenior care,elderly monitor,family safety,wellness tracker,aging parents,remote care,health alerts\n\n**Правила:**\n- Без пробелов после запятых\n- Без слов из названия\n- Без множественного числа",
|
||||||
|
"x": 900,
|
||||||
|
"y": 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_description",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Description",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ:**\n\nCare for your loved ones while preserving their independence. WellNuo is a smart wellness monitoring system designed for elderly family members.\n\nWORRIED ABOUT AGING PARENTS LIVING ALONE?\nWellNuo gives you peace of mind with activity pattern monitoring and instant alerts when something seems unusual.\n\n◆ PRIVACY-FIRST APPROACH\nNo cameras. No microphones. No intrusion.\n\n◆ INSTANT ALERTS\nGet notified immediately when unusual inactivity is detected.\n\n◆ DAILY WELLNESS REPORTS\nTrack trends with easy-to-read reports.\n\n◆ FAMILY SHARING\nConnect the whole family.\n\n◆ AI-POWERED INSIGHTS (Premium)\nSmart analysis detects subtle changes.\n\nFREE:\n• Basic monitoring\n• Emergency alerts\n• 1 family member\n• 7-day history\n\nPREMIUM:\n• Unlimited history\n• AI analysis\n• Unlimited family\n• Priority support\n\nNOT a medical device.\n\nsupport@wellnuo.com\nwellnuo.com",
|
||||||
|
"x": 900,
|
||||||
|
"y": 550
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_promo",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Promotional Text",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ (170 chars max):**\n\nCare for your aging parents with peace of mind. WellNuo monitors wellness patterns without cameras - privacy first approach to elderly care.\n\n*Можно менять без ревью!*",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_whats_new",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 What's New (v1.0)",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ:**\n\nWelcome to WellNuo!\n\n• Real-time activity monitoring\n• Instant alert notifications\n• Daily and weekly wellness reports\n• Family sharing and coordination\n• Privacy-focused design\n• Sign in with Apple support\n\nStart caring smarter today.",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_review_notes",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Review Notes",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**КОПИРОВАТЬ:**\n\nThis app monitors elderly wellness through activity pattern analysis.\n\nDEMO ACCOUNT:\nThe demo account has 30 days of simulated sensor data. No physical hardware required for testing.\n\nFEATURES TO TEST:\n1. Dashboard - activity overview\n2. Alerts - notifications\n3. Reports - daily/weekly stats\n4. Settings - privacy controls\n5. Family - add members\n\nAI features use OpenAI API (disclosed in privacy policy).\n\nContact: support@wellnuo.com",
|
||||||
|
"x": 1280,
|
||||||
|
"y": 550
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_demo",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🔑 Demo Account",
|
||||||
|
"borderColor": "green",
|
||||||
|
"tags": [
|
||||||
|
"prep"
|
||||||
|
],
|
||||||
|
"description": "**Для Apple Review:**\n\n**Email:** demo@wellnuo.com\n**Password:** WellNuoDemo2025!\n\n**Требования:**\n- 30 дней симулированных данных\n- Premium подписка активна\n- Все функции работают\n- Без реального оборудования\n\n**Contact:**\nFirst: Bernhard\nLast: Knigge\nPhone: +1-408-647-7068\nEmail: bernhard@wellnuo.com",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_screenshots",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📱 Screenshots",
|
||||||
|
"borderColor": "pink",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"design"
|
||||||
|
],
|
||||||
|
"description": "**Размеры:**\n\n**iPhone 6.7\" (обязательно):**\n1290×2796 px\n\n**iPhone 6.5\":**\n1284×2778 px\n\n**iPhone 5.5\" (старые):**\n1242×2208 px\n\n**Экраны (3-10 штук):**\n1. Dashboard\n2. Alerts\n3. Reports\n4. Settings\n5. Family",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_icon",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🎨 App Icon",
|
||||||
|
"borderColor": "pink",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"design"
|
||||||
|
],
|
||||||
|
"description": "**Размер:** 1024×1024 PNG\n\n**Требования:**\n- Без прозрачности (no alpha)\n- Без закругленных углов\n- Четко на всех размерах\n\n**Стиль:**\nСердце/забота, градиент синий",
|
||||||
|
"x": 1660,
|
||||||
|
"y": 550
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_iap",
|
||||||
|
"type": "card",
|
||||||
|
"title": "💰 In-App Purchases",
|
||||||
|
"borderColor": "orange",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**Monthly:**\nID: com.wellnuo.premium.monthly\nPrice: $4.99/month\nName: WellNuo Premium\nDesc: Unlock unlimited history, AI insights, and family connections.\n\n**Yearly:**\nID: com.wellnuo.premium.yearly\nPrice: $49.99/year\nName: WellNuo Premium (Annual)\nDesc: Save 17% with annual subscription.\n\n**Lifetime:**\nID: com.wellnuo.lifetime\nPrice: $149.99\nName: WellNuo Lifetime\nDesc: One-time purchase for lifetime access.\n\n**Trial:** 7 days",
|
||||||
|
"x": 2040,
|
||||||
|
"y": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_age_rating",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Age Rating (4+)",
|
||||||
|
"borderColor": "teal",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**Ответы на вопросник:**\n\nViolence: **None**\nSexual Content: **None**\nProfanity: **None**\nDrugs: **None**\nGambling: **None**\nHorror: **None**\nMedical Info: **Infrequent/Mild**\nWeb Access: **No**\nContests: **No**\n\n**Результат: 4+**",
|
||||||
|
"x": 2040,
|
||||||
|
"y": 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_export",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Export Compliance",
|
||||||
|
"borderColor": "teal",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**Q: Uses encryption?**\nA: Yes\n\n**Q: Qualifies for exemption?**\nA: Yes - Standard HTTPS/TLS only.\n\nQualifies under Note 4 to Category 5, Part 2 of EAR.\n\nNo custom encryption algorithms.",
|
||||||
|
"x": 2040,
|
||||||
|
"y": 550
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_info_plist",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Info.plist Keys",
|
||||||
|
"borderColor": "cyan",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"tech"
|
||||||
|
],
|
||||||
|
"description": "**NSLocationWhenInUseUsageDescription:**\nWellNuo uses your location to detect when you arrive home or leave, helping monitor daily activity patterns.\n\n**NSCameraUsageDescription:**\nWellNuo uses the camera to scan QR codes when setting up devices.\n\n**NSHealthShareUsageDescription:**\nWellNuo reads health data to provide wellness monitoring.\n\n**NSUserNotificationsUsageDescription:**\nWellNuo sends notifications about wellness updates.",
|
||||||
|
"x": 2420,
|
||||||
|
"y": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_privacy_labels",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 App Privacy Labels",
|
||||||
|
"borderColor": "cyan",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"appstore"
|
||||||
|
],
|
||||||
|
"description": "**Data Collected:**\n\n✓ Contact Info (Email)\n - Linked: Yes\n - Purpose: App Functionality\n\n✓ Health & Fitness\n - Linked: Yes\n - Purpose: App Functionality\n\n✓ Identifiers (User ID)\n - Linked: Yes\n - Purpose: App Functionality\n\n✓ Usage Data\n - Linked: No\n - Purpose: Analytics\n\n✓ Diagnostics\n - Linked: No\n - Purpose: App Functionality\n\n**Tracking:** No",
|
||||||
|
"x": 2420,
|
||||||
|
"y": 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_build",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🔨 Build & TestFlight",
|
||||||
|
"borderColor": "teal",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"tech"
|
||||||
|
],
|
||||||
|
"description": "**Команды:**\n```\neas build --platform ios\neas submit --platform ios\n```\n\n**Требования:**\n- iOS 17.0+ minimum\n- Xcode 15.2+\n- Без crashes 24ч\n\n**TestFlight:**\n- Internal: до 100 тестеров\n- External: требует Beta Review",
|
||||||
|
"x": 2420,
|
||||||
|
"y": 550
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "prep_checklist",
|
||||||
|
"type": "card",
|
||||||
|
"title": "✅ Checklist Подготовки",
|
||||||
|
"borderColor": "green",
|
||||||
|
"tags": [
|
||||||
|
"prep",
|
||||||
|
"checklist"
|
||||||
|
],
|
||||||
|
"description": "**Перед публикацией:**\n\n**Сайт:**\n□ wellnuo.com/privacy работает\n□ wellnuo.com/terms работает\n□ wellnuo.com/support работает\n\n**Материалы:**\n□ Screenshots готовы\n□ App Icon 1024x1024\n□ Все тексты готовы\n\n**Технические:**\n□ Demo account работает\n□ Build в TestFlight\n□ Нет crashes 24ч",
|
||||||
|
"x": 1017.3814697265625,
|
||||||
|
"y": 804.5396423339844
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_header",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🚀 ПУБЛИКАЦИЯ",
|
||||||
|
"borderColor": "blue",
|
||||||
|
"tags": [
|
||||||
|
"pub",
|
||||||
|
"overview"
|
||||||
|
],
|
||||||
|
"description": "**App Store Connect**\n\n**URL:** appstoreconnect.apple.com\n\n**Шаги:**\n1. Apple Developer Account\n2. Создание App\n3. Заполнение полей\n4. Submit на Review\n\n**Review Time:** 24-48 часов",
|
||||||
|
"x": 173.6695556640625,
|
||||||
|
"y": 1002.0176391601562
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_account",
|
||||||
|
"type": "card",
|
||||||
|
"title": "👤 Apple Developer Account",
|
||||||
|
"borderColor": "purple",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**URL:** developer.apple.com/enroll\n**Стоимость:** $99/год\n\n**Тип:** Organization\n\n**Требуется:**\n- D-U-N-S Number\n- Юр. название компании\n- Website\n- Телефон для верификации\n\n**Время:** 1-7 дней",
|
||||||
|
"x": 553.6695556640625,
|
||||||
|
"y": 952.0176391601562
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_create",
|
||||||
|
"type": "card",
|
||||||
|
"title": "➕ Создание App",
|
||||||
|
"borderColor": "blue",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**My Apps → + → New App**\n\n**Заполнить:**\n- Platform: iOS\n- Name: WellNuo - Senior Care Monitor\n- Primary Language: English\n- Bundle ID: com.wellnuo.seniorcare\n- SKU: WELLNUO-SENIOR-001\n\n**User Access:** Full Access",
|
||||||
|
"x": 553.6695556640625,
|
||||||
|
"y": 1152.0176391601562
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_app_info",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📝 App Information",
|
||||||
|
"borderColor": "blue",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Секция App Information:**\n\n**Subtitle:**\nElderly Wellness Tracking\n\n**Category:**\nPrimary: Health & Fitness\nSecondary: Lifestyle\n\n**Content Rights:**\nDoes not contain third-party content\n\n**Age Rating:**\nЗаполнить вопросник → **4+**",
|
||||||
|
"x": 933.6695556640625,
|
||||||
|
"y": 952.0176391601562
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_pricing",
|
||||||
|
"type": "card",
|
||||||
|
"title": "💰 Pricing",
|
||||||
|
"borderColor": "orange",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Schedule → Price:**\nBase Price: **Free**\n\n**Availability:**\nAll territories\n\n**In-App Purchases:**\nСоздать 3 продукта из подготовки\n\n**Subscriptions:**\nГруппа: WellNuo Premium\nTrial: 7 days",
|
||||||
|
"x": 933.6695556640625,
|
||||||
|
"y": 1152.0176391601562
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_version",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📋 Version Info",
|
||||||
|
"borderColor": "blue",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**iOS App → 1.0:**\n\n1. **Screenshots** - загрузить\n2. **Promotional Text** - из подготовки\n3. **Description** - из подготовки\n4. **Keywords** - из подготовки\n5. **Support URL** - wellnuo.com/support\n6. **Marketing URL** - wellnuo.com\n7. **What's New** - из подготовки\n8. **Build** - выбрать из TestFlight",
|
||||||
|
"x": 1313.6695556640625,
|
||||||
|
"y": 952.0176391601562
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_review",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🔍 App Review",
|
||||||
|
"borderColor": "green",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Sign-In Required:** Yes\n\n**Demo Account:**\nEmail: demo@wellnuo.com\nPassword: WellNuoDemo2025!\n\n**Contact:**\nFirst: Bernhard\nLast: Knigge\nPhone: +1-408-647-7068\nEmail: bernhard@wellnuo.com\n\n**Notes:** вставить из подготовки",
|
||||||
|
"x": 1313.6695556640625,
|
||||||
|
"y": 1152.0176391601562
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_privacy",
|
||||||
|
"type": "card",
|
||||||
|
"title": "🔒 App Privacy",
|
||||||
|
"borderColor": "red",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Privacy Policy URL:**\nhttps://wellnuo.com/privacy\n\n**Data Collection:**\nЗаполнить по чеклисту из App Privacy Labels\n\n**Tracking:** No\n\n**Third-Party SDKs:**\nOpenAI API (disclosed)",
|
||||||
|
"x": 1693.6695556640625,
|
||||||
|
"y": 952.0176391601562
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pub_submit",
|
||||||
|
"type": "card",
|
||||||
|
"title": "📤 Submit",
|
||||||
|
"borderColor": "lime",
|
||||||
|
"tags": [
|
||||||
|
"pub"
|
||||||
|
],
|
||||||
|
"description": "**Финальные шаги:**\n\n1. ✓ Все поля заполнены\n2. ✓ URLs работают\n3. ✓ Build выбран\n4. ✓ Screenshots загружены\n5. **Add for Review**\n6. **Submit to App Review**\n\n**Review:** 24-48 часов\n**Release:** Automatic",
|
||||||
|
"x": 1693.6695556640625,
|
||||||
|
"y": 1152.0176391601562
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"connections": [
|
||||||
|
{
|
||||||
|
"from": "header",
|
||||||
|
"to": "prep_header",
|
||||||
|
"label": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "header",
|
||||||
|
"to": "pub_header",
|
||||||
|
"label": "2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_header",
|
||||||
|
"to": "prep_privacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_header",
|
||||||
|
"to": "prep_app_name"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_header",
|
||||||
|
"to": "prep_demo"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_header",
|
||||||
|
"to": "prep_iap"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_header",
|
||||||
|
"to": "prep_info_plist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_privacy",
|
||||||
|
"to": "prep_terms"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_terms",
|
||||||
|
"to": "prep_support"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_app_name",
|
||||||
|
"to": "prep_keywords"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_keywords",
|
||||||
|
"to": "prep_description"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_description",
|
||||||
|
"to": "prep_promo"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_promo",
|
||||||
|
"to": "prep_whats_new"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_whats_new",
|
||||||
|
"to": "prep_review_notes"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_demo",
|
||||||
|
"to": "prep_screenshots"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_screenshots",
|
||||||
|
"to": "prep_icon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_iap",
|
||||||
|
"to": "prep_age_rating"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_age_rating",
|
||||||
|
"to": "prep_export"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_info_plist",
|
||||||
|
"to": "prep_privacy_labels"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_privacy_labels",
|
||||||
|
"to": "prep_build"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_support",
|
||||||
|
"to": "prep_checklist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_review_notes",
|
||||||
|
"to": "prep_checklist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_icon",
|
||||||
|
"to": "prep_checklist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_export",
|
||||||
|
"to": "prep_checklist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_build",
|
||||||
|
"to": "prep_checklist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "prep_checklist",
|
||||||
|
"to": "pub_header",
|
||||||
|
"label": "Готово →"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_header",
|
||||||
|
"to": "pub_account"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_account",
|
||||||
|
"to": "pub_create"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_create",
|
||||||
|
"to": "pub_app_info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_app_info",
|
||||||
|
"to": "pub_pricing"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_app_info",
|
||||||
|
"to": "pub_version"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_version",
|
||||||
|
"to": "pub_review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_review",
|
||||||
|
"to": "pub_privacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_pricing",
|
||||||
|
"to": "pub_privacy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "pub_privacy",
|
||||||
|
"to": "pub_submit"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tagsDictionary": [
|
||||||
|
{
|
||||||
|
"id": "tag-overview",
|
||||||
|
"name": "overview",
|
||||||
|
"color": "purple"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-prep",
|
||||||
|
"name": "prep",
|
||||||
|
"color": "orange"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-pub",
|
||||||
|
"name": "pub",
|
||||||
|
"color": "blue"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-website",
|
||||||
|
"name": "website",
|
||||||
|
"color": "red"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-appstore",
|
||||||
|
"name": "appstore",
|
||||||
|
"color": "lime"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-design",
|
||||||
|
"name": "design",
|
||||||
|
"color": "pink"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-tech",
|
||||||
|
"name": "tech",
|
||||||
|
"color": "teal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tag-checklist",
|
||||||
|
"name": "checklist",
|
||||||
|
"color": "green"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"_meta": {
|
"_meta": {
|
||||||
"name": "Main",
|
"name": "Main",
|
||||||
"updatedAt": "2025-12-12T23:00:00.000Z"
|
"updatedAt": "2025-12-12T21:41:10.294Z"
|
||||||
},
|
},
|
||||||
"elements": [
|
"elements": [
|
||||||
{
|
{
|
||||||
@ -25,31 +25,44 @@
|
|||||||
"type": "card",
|
"type": "card",
|
||||||
"title": "Questions",
|
"title": "Questions",
|
||||||
"description": "/Users/sergei/Desktop/WellNuo/wellnuoSheme/03_DiscussionQuestions.json",
|
"description": "/Users/sergei/Desktop/WellNuo/wellnuoSheme/03_DiscussionQuestions.json",
|
||||||
"x": 520,
|
"x": 515.8040161132812,
|
||||||
"y": 192
|
"y": 378.204833984375
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "scheme-appstore",
|
"id": "scheme-appstore",
|
||||||
"type": "card",
|
"type": "card",
|
||||||
"title": "App Store Publication - WellNuo",
|
"title": "App Store Publication - WellNuo",
|
||||||
"description": "/Users/sergei/Desktop/WellNuo/wellnuoSheme/04_AppStorePublication.json",
|
"description": "/Users/sergei/Desktop/WellNuo/wellnuoSheme/04_AppStorePublication.json",
|
||||||
"x": 520,
|
"x": 508.95477294921875,
|
||||||
"y": 307
|
"y": 478.3477478027344,
|
||||||
|
"tags": []
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "scheme-sysanal",
|
"id": "scheme-sysanal",
|
||||||
"type": "card",
|
"type": "card",
|
||||||
"title": "SysAnal",
|
"title": "SysAnal",
|
||||||
"description": "/Users/sergei/Desktop/WellNuo/wellnuoSheme/SysAnal.json",
|
"description": "/Users/sergei/Desktop/WellNuo/wellnuoSheme/SysAnal.json",
|
||||||
"x": 520,
|
"x": 554.7333984375,
|
||||||
"y": 422
|
"y": 169.93504333496094
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"connections": [
|
"connections": [
|
||||||
{"from": "root", "to": "scheme-env"},
|
{
|
||||||
{"from": "root", "to": "scheme-questions"},
|
"from": "root",
|
||||||
{"from": "root", "to": "scheme-appstore"},
|
"to": "scheme-env"
|
||||||
{"from": "root", "to": "scheme-sysanal"}
|
},
|
||||||
|
{
|
||||||
|
"from": "root",
|
||||||
|
"to": "scheme-questions"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "root",
|
||||||
|
"to": "scheme-appstore"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "root",
|
||||||
|
"to": "scheme-sysanal"
|
||||||
|
}
|
||||||
],
|
],
|
||||||
"tagsDictionary": []
|
"tagsDictionary": []
|
||||||
}
|
}
|
||||||