├── client
├── public
│ ├── sw.js
│ ├── favicon-64x64.png
│ ├── favicon-128x128.png
│ ├── favicon-512x512.png
│ ├── goals-onboarding.png
│ ├── tags-onboarding.png
│ ├── integration-fitbit.png
│ ├── analytics-onboarding.png
│ ├── dashboard-onboarding.png
│ ├── integration-todoist.png
│ ├── integration-weather.png
│ ├── trackables-onboarding.png
│ ├── goals-onboarding-mobile.png
│ ├── tags-onboarding-mobile.png
│ ├── analytics-onboarding-mobile.png
│ ├── dashboard-onboarding-mobile.png
│ ├── trackables-onboarding-mobile.png
│ └── dashboard-onboarding-mobile (copy 1).png
├── android
│ ├── app
│ │ ├── .gitignore
│ │ ├── src
│ │ │ ├── main
│ │ │ │ ├── res
│ │ │ │ │ ├── drawable
│ │ │ │ │ │ ├── splash.png
│ │ │ │ │ │ └── small_icon.png
│ │ │ │ │ ├── drawable-night
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── mipmap-hdpi
│ │ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ │ ├── ic_launcher_round.png
│ │ │ │ │ │ ├── ic_launcher_background.png
│ │ │ │ │ │ └── ic_launcher_foreground.png
│ │ │ │ │ ├── mipmap-ldpi
│ │ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ │ ├── ic_launcher_round.png
│ │ │ │ │ │ ├── ic_launcher_background.png
│ │ │ │ │ │ └── ic_launcher_foreground.png
│ │ │ │ │ ├── mipmap-mdpi
│ │ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ │ ├── ic_launcher_round.png
│ │ │ │ │ │ ├── ic_launcher_background.png
│ │ │ │ │ │ └── ic_launcher_foreground.png
│ │ │ │ │ ├── drawable-land-hdpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-land-ldpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-land-mdpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-port-hdpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-port-ldpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-port-mdpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── mipmap-xhdpi
│ │ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ │ ├── ic_launcher_round.png
│ │ │ │ │ │ ├── ic_launcher_background.png
│ │ │ │ │ │ └── ic_launcher_foreground.png
│ │ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ │ ├── ic_launcher_round.png
│ │ │ │ │ │ ├── ic_launcher_background.png
│ │ │ │ │ │ └── ic_launcher_foreground.png
│ │ │ │ │ ├── drawable-land-xhdpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-land-xxhdpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-land-xxxhdpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-port-xhdpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-port-xxhdpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-port-xxxhdpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── mipmap-xxxhdpi
│ │ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ │ ├── ic_launcher_round.png
│ │ │ │ │ │ ├── ic_launcher_background.png
│ │ │ │ │ │ └── ic_launcher_foreground.png
│ │ │ │ │ ├── drawable-land-night-hdpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-land-night-ldpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-land-night-mdpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-land-night-xhdpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-land-night-xxhdpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-port-night-hdpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-port-night-ldpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-port-night-mdpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-port-night-xhdpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-port-night-xxhdpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-land-night-xxxhdpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── drawable-port-night-xxxhdpi
│ │ │ │ │ │ └── splash.png
│ │ │ │ │ ├── values
│ │ │ │ │ │ ├── ic_launcher_background.xml
│ │ │ │ │ │ ├── strings.xml
│ │ │ │ │ │ └── styles.xml
│ │ │ │ │ ├── xml
│ │ │ │ │ │ └── file_paths.xml
│ │ │ │ │ ├── mipmap-anydpi-v26
│ │ │ │ │ │ ├── ic_launcher.xml
│ │ │ │ │ │ └── ic_launcher_round.xml
│ │ │ │ │ └── layout
│ │ │ │ │ │ └── activity_main.xml
│ │ │ │ └── java
│ │ │ │ │ └── dev
│ │ │ │ │ └── adoe
│ │ │ │ │ └── perfice
│ │ │ │ │ └── MainActivity.java
│ │ │ ├── test
│ │ │ │ └── java
│ │ │ │ │ └── com
│ │ │ │ │ └── getcapacitor
│ │ │ │ │ └── myapp
│ │ │ │ │ └── ExampleUnitTest.java
│ │ │ └── androidTest
│ │ │ │ └── java
│ │ │ │ └── com
│ │ │ │ └── getcapacitor
│ │ │ │ └── myapp
│ │ │ │ └── ExampleInstrumentedTest.java
│ │ ├── capacitor.build.gradle
│ │ └── proguard-rules.pro
│ ├── gradle
│ │ └── wrapper
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ ├── settings.gradle
│ ├── variables.gradle
│ ├── build.gradle
│ ├── gradle.properties
│ └── capacitor.settings.gradle
├── .vscode
│ └── extensions.json
├── assets
│ ├── splash.png
│ ├── icon-only.png
│ ├── screenshot.png
│ ├── splash-dark.png
│ ├── icon-background.png
│ └── icon-foreground.png
├── src
│ ├── util
│ │ ├── window.ts
│ │ ├── local.ts
│ │ ├── math.ts
│ │ ├── event.ts
│ │ ├── promise.ts
│ │ └── perf.ts
│ ├── vite-env.d.ts
│ ├── model
│ │ ├── ui
│ │ │ ├── button.ts
│ │ │ ├── router.svelte.ts
│ │ │ ├── segmented.ts
│ │ │ ├── dropdown.ts
│ │ │ ├── dynamicInput.ts
│ │ │ └── sidebar.ts
│ │ ├── auth
│ │ │ └── auth.ts
│ │ ├── goal
│ │ │ └── goal.ts
│ │ ├── analytics
│ │ │ ├── analytics.ts
│ │ │ └── ui.ts
│ │ ├── integration
│ │ │ └── ui.ts
│ │ ├── tag
│ │ │ ├── tag.ts
│ │ │ └── suggestions.ts
│ │ ├── journal
│ │ │ ├── search
│ │ │ │ ├── ui.ts
│ │ │ │ └── date.ts
│ │ │ └── journal.ts
│ │ └── sharedWidgets
│ │ │ └── table
│ │ │ └── table.ts
│ ├── assets
│ │ ├── OpenMoji-black-glyf.woff2
│ │ └── goal_suggestions.json
│ ├── components
│ │ ├── base
│ │ │ ├── modal
│ │ │ │ ├── ModalFooterContainer.svelte
│ │ │ │ └── generic
│ │ │ │ │ ├── GenericInfoModal.svelte
│ │ │ │ │ ├── GenericDeleteModal.svelte
│ │ │ │ │ └── GenericEntityModal.svelte
│ │ │ ├── dynamic
│ │ │ │ └── DynamicLabel.svelte
│ │ │ ├── icon
│ │ │ │ └── Icon.svelte
│ │ │ ├── color
│ │ │ │ └── ColorPickerButton.svelte
│ │ │ ├── iconLabel
│ │ │ │ ├── IconLabel.svelte
│ │ │ │ └── IconLabelBetween.svelte
│ │ │ ├── button
│ │ │ │ ├── LineButton.svelte
│ │ │ │ ├── HorizontalPlusButton.svelte
│ │ │ │ ├── IconButton.svelte
│ │ │ │ ├── Button.svelte
│ │ │ │ └── PopupIconButton.svelte
│ │ │ ├── title
│ │ │ │ ├── Title.svelte
│ │ │ │ └── TitleAndCalendar.svelte
│ │ │ ├── timeScope
│ │ │ │ ├── SimpleTimeScopePicker.svelte
│ │ │ │ └── RangedTimeScopePicker.svelte
│ │ │ ├── gesture
│ │ │ │ └── SwipeDetector.svelte
│ │ │ ├── card
│ │ │ │ ├── GenericActionsCard.svelte
│ │ │ │ ├── GenericEditDeleteCard.svelte
│ │ │ │ └── TitledCard.svelte
│ │ │ ├── inline
│ │ │ │ ├── InlineCreateLineButton.svelte
│ │ │ │ └── InlineCreateInput.svelte
│ │ │ ├── dropdown
│ │ │ │ └── BindableDropdownButton.svelte
│ │ │ ├── calendarScroll
│ │ │ │ └── CalendarScrollItem.svelte
│ │ │ ├── invertedSegmented
│ │ │ │ └── InvertedSegment.svelte
│ │ │ ├── contextMenu
│ │ │ │ └── ContextMenuButtons.svelte
│ │ │ └── weekDays
│ │ │ │ └── WeekDays.svelte
│ │ ├── journal
│ │ │ ├── day
│ │ │ │ ├── JournalEntryTimestamp.svelte
│ │ │ │ ├── JournalSummaryContainer.svelte
│ │ │ │ ├── JournalCardBase.svelte
│ │ │ │ ├── JournalDayDate.svelte
│ │ │ │ └── JournalTagEntries.svelte
│ │ │ └── search
│ │ │ │ ├── types
│ │ │ │ ├── freeText
│ │ │ │ │ └── FreeTextSearchOptions.svelte
│ │ │ │ ├── tag
│ │ │ │ │ ├── filters
│ │ │ │ │ │ ├── TagOneOfFilterCard.svelte
│ │ │ │ │ │ └── TagByCategoryFilterCard.svelte
│ │ │ │ │ └── TagSearchActions.svelte
│ │ │ │ ├── trackable
│ │ │ │ │ └── filters
│ │ │ │ │ │ ├── TrackableOneOfFilterCard.svelte
│ │ │ │ │ │ └── TrackableByCategoryFilterCard.svelte
│ │ │ │ ├── GenericFilterContainer.svelte
│ │ │ │ └── date
│ │ │ │ │ └── DateSearchOptions.svelte
│ │ │ │ └── common
│ │ │ │ ├── OneOfFilterCard.svelte
│ │ │ │ └── ByCategoryFilterCard.svelte
│ │ ├── sidebar
│ │ │ └── drawer
│ │ │ │ ├── DrawerOpenButton.svelte
│ │ │ │ └── DrawerButton.svelte
│ │ ├── form
│ │ │ ├── fields
│ │ │ │ ├── input
│ │ │ │ │ ├── DateInputFormField.svelte
│ │ │ │ │ ├── TimeOfDayInputFormField.svelte
│ │ │ │ │ ├── DateTimeInputFormField.svelte
│ │ │ │ │ ├── TimeElapsedInputFormField.svelte
│ │ │ │ │ ├── BooleanInputFormField.svelte
│ │ │ │ │ └── VanillaInputFormField.svelte
│ │ │ │ ├── richInput
│ │ │ │ │ └── RichInputFormField.svelte
│ │ │ │ ├── textArea
│ │ │ │ │ └── TextAreaFormField.svelte
│ │ │ │ ├── segmented
│ │ │ │ │ └── SegmentedFormField.svelte
│ │ │ │ ├── hierarchy
│ │ │ │ │ └── HierarchyButton.svelte
│ │ │ │ ├── range
│ │ │ │ │ └── RangeFormField.svelte
│ │ │ │ └── select
│ │ │ │ │ └── SelectOptionButton.svelte
│ │ │ └── editor
│ │ │ │ ├── display
│ │ │ │ ├── segmented
│ │ │ │ │ └── EditSegmentedOptionCard.svelte
│ │ │ │ ├── select
│ │ │ │ │ ├── EditSelectOptionCard.svelte
│ │ │ │ │ └── EditSelectGrid.svelte
│ │ │ │ ├── range
│ │ │ │ │ └── EditRangeQuestionSettings.svelte
│ │ │ │ └── hierarchy
│ │ │ │ │ └── EditHierarchyQuestionDisplaySettings.svelte
│ │ │ │ ├── sidebar
│ │ │ │ └── SidebarDropdownHeader.svelte
│ │ │ │ └── data
│ │ │ │ └── hierarchy
│ │ │ │ └── EditHierarchyQuestionSettings.svelte
│ │ ├── trackable
│ │ │ ├── edit
│ │ │ │ ├── EditTrackableForm.svelte
│ │ │ │ ├── EditTrackableIntegrations.svelte
│ │ │ │ └── general
│ │ │ │ │ ├── EditTrackableAnalytics.svelte
│ │ │ │ │ ├── value
│ │ │ │ │ └── EditTrackableValueRepresentation.svelte
│ │ │ │ │ ├── habit
│ │ │ │ │ └── EditTrackableHabitCard.svelte
│ │ │ │ │ └── EditTrackableCategory.svelte
│ │ │ └── card
│ │ │ │ ├── value
│ │ │ │ └── table
│ │ │ │ │ ├── TableTrackableRenderer.svelte
│ │ │ │ │ └── TrackableTableEntry.svelte
│ │ │ │ └── habit
│ │ │ │ └── HabitTrackableRenderer.svelte
│ │ ├── dashboard
│ │ │ ├── types
│ │ │ │ ├── table
│ │ │ │ │ ├── TableWidgetEntry.svelte
│ │ │ │ │ ├── TableWidgetGroupHeader.svelte
│ │ │ │ │ └── DashboardTableWidget.svelte
│ │ │ │ ├── entryRow
│ │ │ │ │ └── EntryRowItem.svelte
│ │ │ │ ├── checkList
│ │ │ │ │ └── ChecklistEntry.svelte
│ │ │ │ ├── welcome
│ │ │ │ │ └── DashboardWelcomeWidget.svelte
│ │ │ │ └── goal
│ │ │ │ │ └── DashboardGoalWidget.svelte
│ │ │ └── sidebar
│ │ │ │ ├── edit
│ │ │ │ └── types
│ │ │ │ │ ├── welcome
│ │ │ │ │ └── EditWelcomeWidgetSidebar.svelte
│ │ │ │ │ ├── newCorrelations
│ │ │ │ │ └── EditNewCorrelationsWidgetSidebar.svelte
│ │ │ │ │ ├── entryRow
│ │ │ │ │ └── EditEntryRowWidgetSidebar.svelte
│ │ │ │ │ ├── checklist
│ │ │ │ │ └── EditChecklistWidgetSidebar.svelte
│ │ │ │ │ ├── table
│ │ │ │ │ └── EditTableWidgetSidebar.svelte
│ │ │ │ │ └── insights
│ │ │ │ │ └── EditInsightsWidgetSidebar.svelte
│ │ │ │ └── add
│ │ │ │ └── AddWidgetSidebar.svelte
│ │ ├── goal
│ │ │ ├── GoalMetIndicator.svelte
│ │ │ ├── multi
│ │ │ │ ├── GoalMetConditionEntry.svelte
│ │ │ │ ├── MultiConditionRenderer.svelte
│ │ │ │ └── ConditionEntry.svelte
│ │ │ ├── single
│ │ │ │ ├── GoalMetSingleCondition.svelte
│ │ │ │ ├── ComparisonSingleCondition.svelte
│ │ │ │ └── SingleConditionRenderer.svelte
│ │ │ ├── GoalNewCard.svelte
│ │ │ └── editor
│ │ │ │ ├── condition
│ │ │ │ └── comparison
│ │ │ │ │ └── AddSourceButton.svelte
│ │ │ │ └── sidebar
│ │ │ │ └── AddSourceSidebar.svelte
│ │ ├── settings
│ │ │ ├── SettingsIntegrations.svelte
│ │ │ ├── SettingsDataExport.svelte
│ │ │ ├── auth
│ │ │ │ └── login
│ │ │ │ │ └── ResendConfirmation.svelte
│ │ │ ├── SettingsDeleteData.svelte
│ │ │ ├── ConfigureUrlModal.svelte
│ │ │ └── DeleteAccountModal.svelte
│ │ ├── variable
│ │ │ └── edit
│ │ │ │ ├── EditBackButton.svelte
│ │ │ │ └── EditVariableName.svelte
│ │ ├── reflection
│ │ │ ├── GlobalReflectionModal.svelte
│ │ │ ├── modal
│ │ │ │ └── ReflectionPageButton.svelte
│ │ │ └── editor
│ │ │ │ └── sidebar
│ │ │ │ └── widget
│ │ │ │ ├── ReflectionEditTableWidget.svelte
│ │ │ │ ├── ReflectionEditChecklistWidget.svelte
│ │ │ │ └── ReflectionEditFormWidget.svelte
│ │ ├── tag
│ │ │ ├── TagButtonBase.svelte
│ │ │ ├── TagValueCard.svelte
│ │ │ └── TagCard.svelte
│ │ ├── sharedWidgets
│ │ │ └── checklist
│ │ │ │ ├── EditChecklistConditionCard.svelte
│ │ │ │ └── EditTagChecklistCondition.svelte
│ │ ├── integration
│ │ │ ├── EditIntegrationWebhook.svelte
│ │ │ ├── modals
│ │ │ │ ├── GlobalIntegrationModals.svelte
│ │ │ │ └── IntegrationUnauthenticatedModal.svelte
│ │ │ └── IntegrationEntityCard.svelte
│ │ ├── analytics
│ │ │ ├── details
│ │ │ │ ├── CorrelationMessage.svelte
│ │ │ │ ├── trackable
│ │ │ │ │ └── BasicCategoricalAnalyticsRow.svelte
│ │ │ │ ├── CorrelationBar.svelte
│ │ │ │ └── tag
│ │ │ │ │ └── TagWeekDayAnalytics.svelte
│ │ │ ├── QuestionLabel.svelte
│ │ │ ├── trackable
│ │ │ │ └── AnalyticsTrackableLineChart.svelte
│ │ │ └── tag
│ │ │ │ └── AnalyticsTagView.svelte
│ │ ├── mobile
│ │ │ └── MobileTopBar.svelte
│ │ └── onboarding
│ │ │ ├── OnboardingImage.svelte
│ │ │ └── OnboardingRegister.svelte
│ ├── main.ts
│ ├── stores
│ │ ├── ui
│ │ │ └── drawer.ts
│ │ ├── deletion
│ │ │ └── deletion.ts
│ │ ├── export
│ │ │ ├── complete.ts
│ │ │ └── formEntry.ts
│ │ ├── feedback
│ │ │ └── feedback.ts
│ │ ├── import
│ │ │ └── complete.ts
│ │ ├── dashboard
│ │ │ └── widget
│ │ │ │ ├── welcome.ts
│ │ │ │ ├── trackable.ts
│ │ │ │ └── goal.ts
│ │ ├── remote
│ │ │ └── remote.ts
│ │ └── journal
│ │ │ └── tag.ts
│ ├── services
│ │ ├── deletion
│ │ │ └── deletion.ts
│ │ ├── notification
│ │ │ └── web.ts
│ │ └── observer.ts
│ ├── swSetup.ts
│ ├── db
│ │ ├── migration
│ │ │ └── migrations
│ │ │ │ ├── chartTitles.ts
│ │ │ │ └── defaultQuestionValues.ts
│ │ └── dexie
│ │ │ ├── encryption.ts
│ │ │ ├── search.ts
│ │ │ ├── migration.ts
│ │ │ ├── variable.ts
│ │ │ └── reflection.ts
│ └── views
│ │ └── feedback
│ │ └── FeedbackView.svelte
├── tsconfig.json
├── svelte.config.js
├── docker-compose.yml
├── nginx.conf
├── Dockerfile
├── tailwind.config.js
├── capacitor.config.ts
├── tests
│ ├── common.ts
│ ├── time-scope.test.ts
│ ├── primitive.test.ts
│ └── simple-time.test.ts
├── tsconfig.app.json
├── tsconfig.node.json
└── index.html
├── server
├── .gitignore
├── build-auth.sh
├── build-sync.sh
├── util
│ ├── go.mod
│ ├── number.go
│ ├── slice.go
│ ├── rand.go
│ └── map.go
├── build-gateway.sh
├── build-integration.sh
├── build.sh
├── integration
│ ├── internal
│ │ ├── constants
│ │ │ └── constants.go
│ │ ├── controller
│ │ │ ├── util.go
│ │ │ └── integration_webhook.go
│ │ ├── util
│ │ │ └── http.go
│ │ ├── collection
│ │ │ ├── integration_entity.go
│ │ │ └── integration_type.go
│ │ └── service
│ │ │ └── auth_test.go
│ ├── cmd
│ │ └── integration
│ │ │ └── integration.go
│ └── Dockerfile
├── sync
│ ├── internal
│ │ ├── constants.go
│ │ ├── validate.go
│ │ ├── salt_controller.go
│ │ ├── key_service.go
│ │ └── salt_service.go
│ ├── cmd
│ │ └── sync
│ │ │ └── sync.go
│ └── Dockerfile
├── auth
│ ├── cmd
│ │ └── auth
│ │ │ └── auth.go
│ ├── internal
│ │ ├── model.go
│ │ └── kafka.go
│ └── Dockerfile
├── gateway
│ └── Dockerfile
├── README.md
├── proto
│ ├── go.mod
│ └── go.sum
└── mongoutil
│ ├── go.mod
│ └── bson.go
├── docs
├── selfhost
│ ├── sync
│ │ ├── index.md
│ │ └── _category_.json
│ ├── integrations
│ │ ├── _category_.json
│ │ └── index.md
│ └── _category_.json
└── index.md
├── .gitignore
└── LICENSE
/client/public/sw.js:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/client/android/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build/*
2 | !/build/.npmkeep
3 |
--------------------------------------------------------------------------------
/server/.gitignore:
--------------------------------------------------------------------------------
1 | .env
2 | deploy-*.sh
3 | *-deployment.yaml
--------------------------------------------------------------------------------
/docs/selfhost/sync/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | id: sync
3 | ---
4 |
5 | # Sync
--------------------------------------------------------------------------------
/server/build-auth.sh:
--------------------------------------------------------------------------------
1 | docker build -f auth/Dockerfile -t auth:latest .
--------------------------------------------------------------------------------
/server/build-sync.sh:
--------------------------------------------------------------------------------
1 | docker build -f sync/Dockerfile -t sync:latest .
2 |
--------------------------------------------------------------------------------
/server/util/go.mod:
--------------------------------------------------------------------------------
1 | module perfice.adoe.dev/util
2 |
3 | go 1.24.3
4 |
--------------------------------------------------------------------------------
/server/build-gateway.sh:
--------------------------------------------------------------------------------
1 | docker build -f gateway/Dockerfile -t gateway:latest .
--------------------------------------------------------------------------------
/docs/selfhost/sync/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 | "label": "Sync",
3 | "position": 2
4 | }
--------------------------------------------------------------------------------
/client/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": ["svelte.svelte-vscode"]
3 | }
4 |
--------------------------------------------------------------------------------
/client/assets/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/HEAD/client/assets/splash.png
--------------------------------------------------------------------------------
/server/build-integration.sh:
--------------------------------------------------------------------------------
1 | docker build -f integration/Dockerfile -t integration:latest .
2 |
--------------------------------------------------------------------------------
/client/src/util/window.ts:
--------------------------------------------------------------------------------
1 | export function isMobile() {
2 | return window.innerWidth < 768;
3 | }
--------------------------------------------------------------------------------
/client/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
8 | {formatTimestampHHMM(timestamp)} 9 |
10 | -------------------------------------------------------------------------------- /client/src/model/tag/tag.ts: -------------------------------------------------------------------------------- 1 | export interface Tag { 2 | id: string; 3 | name: string; 4 | variableId: string; 5 | order: number; 6 | categoryId: string | null; 7 | } 8 | 9 | export const UNCATEGORIZED_TAG_CATEGORY_ID = ""; 10 | 11 | export interface TagCategory { 12 | id: string; 13 | name: string; 14 | order: number; 15 | } 16 | -------------------------------------------------------------------------------- /server/gateway/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:1.24-alpine AS builder 2 | WORKDIR /app 3 | 4 | COPY gateway/ ./gateway 5 | COPY proto/ ./proto 6 | COPY util/ ./util 7 | 8 | WORKDIR /app/gateway 9 | RUN go build -o gateway . 10 | 11 | FROM alpine:latest 12 | WORKDIR /root/ 13 | COPY --from=builder /app/gateway/gateway . 14 | 15 | EXPOSE 3000 16 | CMD ["./gateway"] 17 | 18 | -------------------------------------------------------------------------------- /server/README.md: -------------------------------------------------------------------------------- 1 | # server 2 | Perfice can be run completely locally without a server, but using a server allows some extra features. 3 | The server component is responsible for synchronizing data between devices and pulling data automatically from integrations like Fitbit, Todoist into the platform. 4 | 5 | More information can be read in the [docs](https://perfice.adoe.dev/docs/). -------------------------------------------------------------------------------- /client/src/components/sidebar/drawer/DrawerOpenButton.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 |9 | {entry.prefix} 10 |
11 |{entry.suffix}
12 |{title}
11 |{value.name}
11 |Updates should be sent to this URL:
12 | e.currentTarget.select()}/> -------------------------------------------------------------------------------- /client/android/app/src/main/java/dev/adoe/perfice/MainActivity.java: -------------------------------------------------------------------------------- 1 | package io.perfice.app; 2 | 3 | import android.os.Bundle; 4 | import android.webkit.WebView; 5 | 6 | import com.getcapacitor.BridgeActivity; 7 | 8 | public class MainActivity extends BridgeActivity { 9 | @Override 10 | public void onCreate(Bundle savedInstanceState) { 11 | super.onCreate(savedInstanceState); 12 | } 13 | 14 | @Override 15 | public void onStart() { 16 | super.onStart(); 17 | WebView webview = getBridge().getWebView(); 18 | webview.setOverScrollMode(WebView.OVER_SCROLL_NEVER); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /client/android/app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 |
9 |