Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
99079e1
add settings option to change path color
cranberrymuffin Jul 27, 2025
fe9f678
display pace
cranberrymuffin Jul 28, 2025
ad9d4ea
increment version to 1.1
cranberrymuffin Jul 29, 2025
77f29f7
switch from using apple's uiimagepickercontroller to custom camera im…
cranberrymuffin Jul 29, 2025
1e80c5a
when editing an existing path, we should immediately start recording …
cranberrymuffin Jul 29, 2025
645a346
organize map components between live and static views
cranberrymuffin Jul 30, 2025
1a67c56
improve captured photo view
cranberrymuffin Jul 30, 2025
ed623a6
add an option to display all photos taken in a grid
cranberrymuffin Aug 12, 2025
b25c37c
simplify delete and dismiss function
cranberrymuffin Aug 13, 2025
32a5933
update photo viewing and management infrastructure
cranberrymuffin Aug 13, 2025
9c2c6fe
upgrade app version to 1.2
cranberrymuffin Aug 13, 2025
913b5f3
always navigate to path after stopping recording, conditionally show …
cranberrymuffin Aug 13, 2025
b363a13
conditionally hide photo viewer if there are no photos associated wit…
cranberrymuffin Aug 13, 2025
20b6a49
improve robustnuss of delete functionality
cranberrymuffin Aug 13, 2025
e13c244
add ability to sort based on path date, pace, time, or distance
cranberrymuffin Aug 21, 2025
e151553
increase version number from 1.2 -> 1.3
cranberrymuffin Aug 21, 2025
4f8234e
show rate app alert after 3 recordings
cranberrymuffin Aug 25, 2025
61c6458
fix but related to showing setName sheet not appearing consistently o…
cranberrymuffin Aug 25, 2025
b46ea81
increment app version from 1.3 -> 1.4
cranberrymuffin Aug 25, 2025
e2f9146
display path info in static map view
cranberrymuffin Sep 8, 2025
e002b3d
migrate to v1.5
cranberrymuffin Sep 25, 2025
1fcf10d
Move model files into PathRecorder/Models (git mv)
cranberrymuffin Mar 14, 2026
db07236
Extract PathStorage to Services/PathStorage.swift (separate storage l…
cranberrymuffin Mar 14, 2026
e3a680d
Model: update path photo/segment model and remove Item schema
cranberrymuffin Jun 21, 2026
c2836ad
App: apply pause/resume segment logic and camera capture safety
cranberrymuffin Jun 21, 2026
531d0a1
Display: draw separate path segments and fix photo annotations for ne…
cranberrymuffin Jun 21, 2026
44e44ea
Data migration: injectable UserDefaults and tests; ignore fixture.json
cranberrymuffin Jun 21, 2026
e381044
Display: stack photo pins by screen proximity and sort by timestamp
cranberrymuffin Jun 21, 2026
4fa66d1
Add JSON export and Settings Export JSON button
cranberrymuffin Mar 14, 2026
28ef8f7
Add optional phone/OTP auth in Settings, no app-level auth gate
cranberrymuffin Mar 14, 2026
93b6621
Backup: add Supabase schema migrations and storage bucket setup
cranberrymuffin Jun 21, 2026
07ceb3c
Backup: upload photos to Storage and upsert relational tables
cranberrymuffin Jun 21, 2026
434f7be
Settings: show backup progress bar and estimated time remaining
cranberrymuffin Jun 21, 2026
a28b087
Backup: sync-aware backup button, cloud restore on login, dirty tracking
cranberrymuffin Jun 22, 2026
d766d77
Fix crash in totalDistance when restored segment has 0 locations
cranberrymuffin Jun 22, 2026
5b2490f
Restore: fix silent failures with nested select + batch + progress bar
cranberrymuffin Jun 22, 2026
208804f
Settings: add country code picker for phone auth, fix OTP flow UX
cranberrymuffin Jun 22, 2026
e1af6f7
Recording: navigate app during recording, per-path backup transactions
cranberrymuffin Jun 22, 2026
5d092e2
Fix inflated duration by deferring segment-start anchor to first real…
cranberrymuffin Jun 22, 2026
5e3732c
Fix blank screen on resume by deferring push past dismiss() pop
cranberrymuffin Aug 5, 2026
fd51222
Backup: mark renamed/edited paths dirty so cloud sync catches them
cranberrymuffin Aug 5, 2026
3dc6f63
Delete: unify local+cloud path delete between home list and map detail
cranberrymuffin Aug 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -85,4 +85,7 @@ fastlane/test_output

iOSInjectionProject/

# Ignore local test fixtures
PathRecorderTests/fixture.json

# End of https://www.toptal.com/developers/gitignore/api/swift
68 changes: 64 additions & 4 deletions PathRecorder.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@
B93D3C352E07111700B158C8 /* PathRecorderWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = B93D3C1F2E07111600B158C8 /* PathRecorderWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
B93D3C422E07157000B158C8 /* Shared in Frameworks */ = {isa = PBXBuildFile; productRef = B93D3C412E07157000B158C8 /* Shared */; };
B93D3C442E07158300B158C8 /* Shared in Frameworks */ = {isa = PBXBuildFile; productRef = B93D3C432E07158300B158C8 /* Shared */; };
B9AD176E2F65C4AF00DB89CE /* Auth in Frameworks */ = {isa = PBXBuildFile; productRef = B9AD176D2F65C4AF00DB89CE /* Auth */; };
B9AD17702F65C4AF00DB89CE /* Functions in Frameworks */ = {isa = PBXBuildFile; productRef = B9AD176F2F65C4AF00DB89CE /* Functions */; };
B9AD17722F65C4AF00DB89CE /* PostgREST in Frameworks */ = {isa = PBXBuildFile; productRef = B9AD17712F65C4AF00DB89CE /* PostgREST */; };
B9AD17742F65C4AF00DB89CE /* Realtime in Frameworks */ = {isa = PBXBuildFile; productRef = B9AD17732F65C4AF00DB89CE /* Realtime */; };
B9AD17762F65C4AF00DB89CE /* Storage in Frameworks */ = {isa = PBXBuildFile; productRef = B9AD17752F65C4AF00DB89CE /* Storage */; };
B9AD18862F65D8AE00DB89CE /* Supabase in Frameworks */ = {isa = PBXBuildFile; productRef = B9AD18852F65D8AE00DB89CE /* Supabase */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -112,6 +118,12 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
B9AD18862F65D8AE00DB89CE /* Supabase in Frameworks */,
B9AD17762F65C4AF00DB89CE /* Storage in Frameworks */,
B9AD17722F65C4AF00DB89CE /* PostgREST in Frameworks */,
B9AD17702F65C4AF00DB89CE /* Functions in Frameworks */,
B9AD176E2F65C4AF00DB89CE /* Auth in Frameworks */,
B9AD17742F65C4AF00DB89CE /* Realtime in Frameworks */,
B93D3C422E07157000B158C8 /* Shared in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand Down Expand Up @@ -198,6 +210,12 @@
name = PathRecorder;
packageProductDependencies = (
B93D3C412E07157000B158C8 /* Shared */,
B9AD176D2F65C4AF00DB89CE /* Auth */,
B9AD176F2F65C4AF00DB89CE /* Functions */,
B9AD17712F65C4AF00DB89CE /* PostgREST */,
B9AD17732F65C4AF00DB89CE /* Realtime */,
B9AD17752F65C4AF00DB89CE /* Storage */,
B9AD18852F65D8AE00DB89CE /* Supabase */,
);
productName = PathRecorder;
productReference = 6141C8D32DECACB90034946C /* PathRecorder.app */;
Expand Down Expand Up @@ -309,6 +327,7 @@
minimizedProjectReferenceProxies = 1;
packageReferences = (
B93D3C402E07152A00B158C8 /* XCLocalSwiftPackageReference "Shared" */,
B9AD176C2F65C4AF00DB89CE /* XCRemoteSwiftPackageReference "supabase-swift" */,
);
preferredProjectObjectVersion = 77;
productRefGroup = 6141C8D42DECACB90034946C /* Products */;
Expand Down Expand Up @@ -551,7 +570,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
MARKETING_VERSION = 1.6;
PRODUCT_BUNDLE_IDENTIFIER = slugmuffin.PathRecorder;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
Expand Down Expand Up @@ -588,7 +607,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
MARKETING_VERSION = 1.6;
PRODUCT_BUNDLE_IDENTIFIER = slugmuffin.PathRecorder;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
Expand Down Expand Up @@ -687,7 +706,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0;
MARKETING_VERSION = 1.6;
PRODUCT_BUNDLE_IDENTIFIER = slugmuffin.PathRecorder.PathRecorderWidget;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
Expand Down Expand Up @@ -715,7 +734,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0;
MARKETING_VERSION = 1.6;
PRODUCT_BUNDLE_IDENTIFIER = slugmuffin.PathRecorder.PathRecorderWidget;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
Expand Down Expand Up @@ -782,6 +801,17 @@
};
/* End XCLocalSwiftPackageReference section */

/* Begin XCRemoteSwiftPackageReference section */
B9AD176C2F65C4AF00DB89CE /* XCRemoteSwiftPackageReference "supabase-swift" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/supabase/supabase-swift.git";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 2.5.1;
};
};
/* End XCRemoteSwiftPackageReference section */

/* Begin XCSwiftPackageProductDependency section */
B93D3C412E07157000B158C8 /* Shared */ = {
isa = XCSwiftPackageProductDependency;
Expand All @@ -791,6 +821,36 @@
isa = XCSwiftPackageProductDependency;
productName = Shared;
};
B9AD176D2F65C4AF00DB89CE /* Auth */ = {
isa = XCSwiftPackageProductDependency;
package = B9AD176C2F65C4AF00DB89CE /* XCRemoteSwiftPackageReference "supabase-swift" */;
productName = Auth;
};
B9AD176F2F65C4AF00DB89CE /* Functions */ = {
isa = XCSwiftPackageProductDependency;
package = B9AD176C2F65C4AF00DB89CE /* XCRemoteSwiftPackageReference "supabase-swift" */;
productName = Functions;
};
B9AD17712F65C4AF00DB89CE /* PostgREST */ = {
isa = XCSwiftPackageProductDependency;
package = B9AD176C2F65C4AF00DB89CE /* XCRemoteSwiftPackageReference "supabase-swift" */;
productName = PostgREST;
};
B9AD17732F65C4AF00DB89CE /* Realtime */ = {
isa = XCSwiftPackageProductDependency;
package = B9AD176C2F65C4AF00DB89CE /* XCRemoteSwiftPackageReference "supabase-swift" */;
productName = Realtime;
};
B9AD17752F65C4AF00DB89CE /* Storage */ = {
isa = XCSwiftPackageProductDependency;
package = B9AD176C2F65C4AF00DB89CE /* XCRemoteSwiftPackageReference "supabase-swift" */;
productName = Storage;
};
B9AD18852F65D8AE00DB89CE /* Supabase */ = {
isa = XCSwiftPackageProductDependency;
package = B9AD176C2F65C4AF00DB89CE /* XCRemoteSwiftPackageReference "supabase-swift" */;
productName = Supabase;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = 6141C8CB2DECACB90034946C /* Project object */;
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions PathRecorder/AppDelegate.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import UIKit
import BackgroundTasks

class AppDelegate: NSObject, UIApplicationDelegate {
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
Expand Down
Loading