@ -8,8 +8,10 @@ This guide explains how to build TimeSafari for different platforms using the co
```bash
```bash
# 🖥️ Web Development
# 🖥️ Web Development
npm run build:web:dev # Start development server with hot reload
npm install # setup -- and pkgx.dev `dev` command before this will set environment with npm, etc
npm run build:web:prod # Production build
npm run build:web:serve -- --test # Start with test endorser server
npm run build:web:dev # Start development server with hot reload with local endorser server
npm run build:web:prod # Production build
# 📱 Mobile Development
# 📱 Mobile Development
npm run build:ios # iOS build (opens Xcode)
npm run build:ios # iOS build (opens Xcode)
@ -2401,4 +2403,4 @@ All scripts use consistent error handling:
---
---
**Note**: This documentation is maintained alongside the build system. For the most up-to-date information, refer to the actual script files and Vite configuration files in the repository.
**Note**: This documentation is maintained alongside the build system. For the most up-to-date information, refer to the actual script files and Vite configuration files in the repository.
[Time Safari](https://timesafari.org/) allows people to ease into collaboration: start with expressions of gratitude
[Time Safari](https://timesafari.org/) allows people to ease into collaboration: start with expressions of gratitude
and expand to crowd-fund with time & money, then record and see the impact of contributions.
and expand to crowd-fund with time & money, then record and see the impact of contributions.
## Database Migration Status
**Current Status**: The application is undergoing a migration from Dexie (IndexedDB) to SQLite using absurd-sql. This migration is in **Phase 2** with a well-defined migration fence in place.
### Migration Progress
- ✅ **SQLite Database Service**: Fully implemented with absurd-sql
- ✅ **Platform Service Layer**: Unified database interface across platforms
- ✅ **Settings Migration**: Core user settings transferred
- ✅ **Account Migration**: Identity and key management
- 🔄 **Contact Migration**: User contact data (via import interface)
- 📋 **Code Cleanup**: Remove unused Dexie imports
### Migration Fence
The migration is controlled by a **migration fence** that separates legacy Dexie code from the new SQLite implementation. See [Migration Fence Definition](doc/migration-fence-definition.md) for complete details.
**Key Points**:
- Legacy Dexie database is disabled by default
- All database operations go through `PlatformServiceMixin`
- Migration tools provide controlled access to both databases
- Clear separation between legacy and new code
### Migration Documentation
- [Migration Guide](doc/migration-to-wa-sqlite.md) - Complete migration process
- [Migration Fence Definition](doc/migration-fence-definition.md) - Fence boundaries and rules
See [project.task.yaml](project.task.yaml) for current priorities.
See [ClickUp](https://sharing.clickup.com/9014278710/l/h/8cmnyhp-174/10573fec74e2ba0) for current priorities.
(Numbers at the beginning of lines are estimated hours. See [taskyaml.org](https://taskyaml.org/) for details.)
## Setup & Building
## Setup & Building
@ -42,14 +15,16 @@ Quick start:
```bash
```bash
npm install
npm install
npm run dev
npm run build:web:serve -- --test
```
```
To be able to make submissions: go to "profile" (bottom left), go to the bottom and expand "Show Advanced Settings", go to the bottom and to the "Test Page", and finally "Become User 0" to see all the functionality.
See [BUILDING.md](BUILDING.md) for comprehensive build instructions for all platforms (Web, Electron, iOS, Android, Docker).
See [BUILDING.md](BUILDING.md) for comprehensive build instructions for all platforms (Web, Electron, iOS, Android, Docker).
## Development Database Clearing
## Development Database Clearing
TimeSafari provides a simple script-based approach to clear the database for development purposes.
TimeSafari provides a simple script-based approach to clear the local database (not the claim server) for development purposes.
// Redirect to error page with information about the invalid link
// Redirect to error page with information about the invalid link
awaitthis.router.replace({
awaitthis.router.replace({
@ -204,9 +205,8 @@ export class DeepLinkHandler {
validatedParams=awaitschema.parseAsync(params);
validatedParams=awaitschema.parseAsync(params);
}catch(error){
}catch(error){
// For parameter validation errors, provide specific error feedback
// For parameter validation errors, provide specific error feedback
logConsoleAndDb(
logger.error(
`[DeepLink] Invalid parameters for route name ${routeName} for path: ${path}: ${JSON.stringify(error)} ... with params: ${JSON.stringify(params)} ... and query: ${JSON.stringify(query)}`,
`[DeepLink] Invalid parameters for route name ${routeName} for path: ${path}: ${JSON.stringify(error)} ... with params: ${JSON.stringify(params)} ... and query: ${JSON.stringify(query)}`,
true,
);
);
awaitthis.router.replace({
awaitthis.router.replace({
name:"deep-link-error",
name:"deep-link-error",
@ -229,9 +229,8 @@ export class DeepLinkHandler {
params: validatedParams,
params: validatedParams,
});
});
}catch(error){
}catch(error){
logConsoleAndDb(
logger.error(
`[DeepLink] Error routing to route name ${routeName} for path: ${path}: ${JSON.stringify(error)} ... with validated params: ${JSON.stringify(validatedParams)}`,
`[DeepLink] Error routing to route name ${routeName} for path: ${path}: ${JSON.stringify(error)} ... with validated params: ${JSON.stringify(validatedParams)}`,
true,
);
);
// For parameter validation errors, provide specific error feedback
// For parameter validation errors, provide specific error feedback
"rigid shrug mobile smart veteran half all pond toilet brave review universe ship congress found yard skate elite apology jar uniform subway slender luggage";