Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
127 commits
Select commit Hold shift + click to select a range
f347bea
video checkpoint
cwbooth5 Feb 2, 2026
7ac7bdf
fix(a11y): add accessibility labels to all camera controls
cwbooth5 May 26, 2026
3f2a12c
fix(a11y): correct camera switch and gallery accessibility labels per…
cwbooth5 May 26, 2026
72c9b52
fix(a11y): add accessibility labels to PIN entry screens
cwbooth5 May 26, 2026
573a054
fix(a11y): add accessibility labels to gallery cells and actions
cwbooth5 May 26, 2026
f32c82b
fix(a11y): hide decorative icons from VoiceOver in security overlays …
cwbooth5 May 26, 2026
43928e7
fix(a11y): replace hardcoded icon font sizes with .title3 in photo tools
cwbooth5 May 26, 2026
6c19871
fix(a11y): replace hardcoded font sizes with Dynamic Type styles in s…
cwbooth5 May 26, 2026
b60fef3
fix(a11y): replace hardcoded font sizes in PIN and onboarding screens
cwbooth5 May 26, 2026
62d6fe7
fix(a11y): replace remaining hardcoded font sizes with Dynamic Type s…
cwbooth5 May 26, 2026
387a4b5
fix(a11y): replace remaining camera and detail hardcoded font sizes
cwbooth5 May 26, 2026
ba71a60
fix(ux): add haptic feedback to shutter, recording, and PIN entry
cwbooth5 May 26, 2026
07a02d7
fix(swiftui): replace foregroundColor→foregroundStyle and cornerRadiu…
cwbooth5 May 26, 2026
0dd08dc
fix(swiftui): replace deprecated NavigationView with NavigationStack
cwbooth5 May 26, 2026
fe5ad6a
fix(swiftui): replace UIImpactFeedbackGenerator with .sensoryFeedback…
cwbooth5 May 26, 2026
c78bc00
fix(nav): remove nested NavigationStack from wizard, ImageInfo, and P…
cwbooth5 May 26, 2026
f574c6f
fix(nav): avoid double-dismiss black screen after decoy save
cwbooth5 May 30, 2026
9004965
fix(security): destroy non-decoy videos on poison pill activation
cwbooth5 May 30, 2026
a4992de
test: clean up orphaned test files; fold valid suites into the target
cwbooth5 May 30, 2026
9971b72
feat(security): support decoy videos so non-decoy videos are destroyed
cwbooth5 May 30, 2026
79fe8a5
feat(gallery): show progress spinner while saving decoy media
cwbooth5 May 30, 2026
9e3e1a7
feat(gallery): show real thumbnails for videos
cwbooth5 May 30, 2026
92b5ef5
refactor(gallery): remove dead SecureGalleryViewModel
cwbooth5 May 30, 2026
d21bc50
ci: guard that every test source file is a member of its test target
cwbooth5 May 30, 2026
fd97090
docs(readme): document fastlane build/test/release and the test-membe…
cwbooth5 May 30, 2026
dbc5c8f
fix(security): decoy videos were silently never created -> poison pil…
cwbooth5 May 30, 2026
b0fe93b
fix(video): decrypt over-read the final chunk -> fileIOError (broke s…
cwbooth5 May 30, 2026
dd72a7c
fix(security): keep decoy video thumbnails through the poison pill
cwbooth5 May 31, 2026
2159c54
feat(gallery): import videos from the photo library (encrypted)
cwbooth5 May 31, 2026
638b13f
style(camera): Liquid Glass control buttons
cwbooth5 May 31, 2026
62cb10b
feat(gallery): swipe through photos and videos together in detail view
cwbooth5 May 31, 2026
3c849ba
feat(video): glass inline player on the detail pager with reliable co…
cwbooth5 May 31, 2026
f8c09d0
fix(security): add file protection to wrapped DEK files
cwbooth5 May 31, 2026
dca6dfd
fix(security): propagate key-derivation errors instead of crashing
cwbooth5 Jun 1, 2026
3e5a823
fix(compiler): audioInput is nonisolated
cwbooth5 Jun 1, 2026
657ffda
fix(security): delete hardware keys and await eviction in security reset
cwbooth5 Jun 1, 2026
b849819
fix(security): use monotonic clock for session timeout and PIN backoff
cwbooth5 Jun 1, 2026
b6f2e25
fix(security): short-circuit poison-pill PIN verification
cwbooth5 Jun 1, 2026
eb9cd80
fix(security): delete dead stub-cipher-key plumbing
cwbooth5 Jun 1, 2026
b5f9ad3
fix(security): bind the PIN cryptographically to DEK unwrap (C1)
cwbooth5 Jun 1, 2026
0ac7655
fix(security): single-writer failed-attempt counter (M1)
cwbooth5 Jun 1, 2026
e4516c4
fix(security): complete file protection on the settings file (H2, par…
cwbooth5 Jun 1, 2026
6081d8d
feat(camera): add pure orientation-angle mapping and OrientationObserver
cwbooth5 Jun 2, 2026
aa48899
fix(camera): lock camera UI to portrait and remove dead landscape layout
cwbooth5 Jun 2, 2026
a3fe43b
feat(camera): rotate camera control glyphs to match device orientation
cwbooth5 Jun 2, 2026
4456659
fix(ipad): require full screen so the camera portrait lock is honored
cwbooth5 Jun 2, 2026
ee08341
fix(orientation): drop unsupported UIDevice.orientation hack
cwbooth5 Jun 2, 2026
ff9cb7d
fix(camera): stop controls shifting into the preview on device rotation
cwbooth5 Jun 3, 2026
75e01a5
Fix small view update warning
cwbooth5 Jun 3, 2026
705b88a
fix(ui): simplify glyph rotation
cwbooth5 Jun 3, 2026
7e48d3f
fix(ui): adjust spacing on zoom capsule
cwbooth5 Jun 3, 2026
596c1de
fix(camera): let control taps through the preview's focus gesture
cwbooth5 Jun 3, 2026
03fc814
feat(video): add auto play video toggle
cwbooth5 Jun 3, 2026
24388e9
feat(video): add replay button + mute toggle to inline player
cwbooth5 Jun 6, 2026
c1c55d8
refactor(detail-pager): add counter auto-hide and consistent layout
cwbooth5 Jun 6, 2026
e5bd224
style(ui): use system colors for consistency with glass backgrounds
cwbooth5 Jun 6, 2026
ff06e57
refactor(obfuscation): use MediaToolbarButton for consistent controls
cwbooth5 Jun 6, 2026
b7bcc34
fix(auth): isolate AuthorizationRepository to @MainActor
cwbooth5 Jun 6, 2026
d7e7fda
fix(video): tie encrypted-video delegate lifetime to its asset
cwbooth5 Jun 6, 2026
3fb4e49
fix(auth): make failed-attempt increment atomic in the data source
cwbooth5 Jun 6, 2026
2f3ddc8
fix(video): use built-in KVO publisher for AVPlayerItem status
cwbooth5 Jun 6, 2026
e2ab64a
views updates
cwbooth5 Jun 11, 2026
f21853c
docs: add media viewer UX + capture framing design spec
cwbooth5 Jun 12, 2026
e358b12
Add fastlane screenshot
cwbooth5 Jun 12, 2026
41e8e67
docs: add media viewer UX implementation plan
cwbooth5 Jun 12, 2026
6d0e374
fix(viewer): latch dismiss-drag direction once and track both axes
cwbooth5 Jun 12, 2026
ec9a820
feat(viewer): fade all chrome during the dismiss drag
cwbooth5 Jun 12, 2026
0c49ce6
docs: align spec with @Observable convention used in code
cwbooth5 Jun 12, 2026
64cf177
feat(video): pinch-zoom on video pages via ZoomableScrollView
cwbooth5 Jun 12, 2026
567582f
fix(camera): preview container matches capture aspect; max-res stills
cwbooth5 Jun 12, 2026
33e62eb
fix(video): fade action bar with opacity so dismiss-drag doesn't refl…
cwbooth5 Jun 12, 2026
00c24dd
fix(camera): pin max-res stills to the feed aspect; observe device se…
cwbooth5 Jun 12, 2026
9633e00
fix(tests): register drag-latch tests with the SnapSafeTests target
cwbooth5 Jun 12, 2026
8ae1755
docs(spec): gallery landscape support design
cwbooth5 Jun 13, 2026
60b5e9a
fix(orientation): drop portrait-reset on disappear
cwbooth5 Jun 13, 2026
dd21fc1
feat(gallery): support landscape orientation
cwbooth5 Jun 13, 2026
fba9a6b
periphery fixes, video fixes
cwbooth5 Jun 13, 2026
8e6f89e
Fix various security scan issues
cwbooth5 Jun 13, 2026
c0dc4fe
docs(spec): SecureImageRepository full-clean split design
cwbooth5 Jun 13, 2026
8fb00b0
docs(spec): fold in swift-concurrency + swiftui review findings
cwbooth5 Jun 13, 2026
c914e3a
docs(plan): SecureImageRepository split — PR1 detail + PR2/PR3 roadmap
cwbooth5 Jun 13, 2026
209f4ee
refactor(secureimage): add ImageProcessing namespace + tests
cwbooth5 Jun 13, 2026
10610d6
fix(secureimage): guard image context in rotateImage; broaden ImagePr…
cwbooth5 Jun 13, 2026
a468e44
refactor(secureimage): route image work through ImageProcessing
cwbooth5 Jun 13, 2026
b5662a7
refactor(secureimage): move readImageMetadata + metadata types out of…
cwbooth5 Jun 13, 2026
c741726
refactor(secureimage): extract PhotoStorageDataSource (directories + …
cwbooth5 Jun 13, 2026
7b6187f
refactor(secureimage): move file path + decoy enumeration helpers to …
cwbooth5 Jun 14, 2026
d2007a8
refactor(secureimage): add ImageProcessing.createThumbnailData + gene…
cwbooth5 Jun 14, 2026
5e2e892
fix(secureimage): guard scale>0 in createThumbnailData; log cache mis…
cwbooth5 Jun 14, 2026
50e2c83
refactor(secureimage): ThumbnailCache → @unchecked Sendable final class
cwbooth5 Jun 14, 2026
3f7606f
refactor(secureimage): SecureImageRepository → actor; read APIs retur…
cwbooth5 Jun 14, 2026
1f181fc
fix(gallery): guard decoy-selection loops against cancellation during…
cwbooth5 Jun 14, 2026
0eaec9c
refactor(gallery): route cell thumbnails through view model to repopu…
cwbooth5 Jun 14, 2026
6d93332
fix(gallery): clear decrypted thumbnails on deauth and on delete
cwbooth5 Jun 14, 2026
c5cca1f
refactor(decoy): route decoy-photo removal through RemoveDecoyPhotoUs…
cwbooth5 Jun 14, 2026
42bfdfa
chore(deps): bump faraday, jwt, aws-sdk-s3, addressable to patch CVEs
cwbooth5 Jun 14, 2026
a383c22
chore(periphery): fix 3 unused-code findings from fresh scan
cwbooth5 Jun 14, 2026
8880da2
fix(gallery): make full toolbar button frame tappable in photo detail
cwbooth5 Jun 14, 2026
b8d9df6
fix(decoy): correct decoy state/limit handling in detail and gallery
cwbooth5 Jun 14, 2026
985ca1e
fix(pin): make PIN field auto-focus reliable on appear
cwbooth5 Jun 14, 2026
bc60b89
fix(decoy): clear decoy videos when poison pill is removed
cwbooth5 Jun 14, 2026
ad47874
docs(spec): video info sheet design
cwbooth5 Jun 14, 2026
f3eb427
feat(video): add AVMetadataItemFactory for capture metadata and ISO 6709
cwbooth5 Jun 14, 2026
89d9b3d
feat(video): add VideoMetaData model and display formatting
cwbooth5 Jun 14, 2026
6be72e2
feat(video): add SecureImageRepository.getVideoMetaData read path
cwbooth5 Jun 14, 2026
69c2306
feat(video): embed location and creation date at record time
cwbooth5 Jun 14, 2026
ba4385c
feat(video): add VideoInfoViewModel
cwbooth5 Jun 14, 2026
a52634e
feat(video): add VideoInfoView sheet
cwbooth5 Jun 14, 2026
efc0995
feat(video): add videoInfo navigation case
cwbooth5 Jun 15, 2026
fa46da1
feat(video): add Info button to video detail toolbar
cwbooth5 Jun 15, 2026
4012b0c
chore(i18n): extract video info sheet strings into the catalog
cwbooth5 Jun 15, 2026
32f07bb
fix(pin): resolve PIN field focus deadlock from duplicate auth screens
cwbooth5 Jun 15, 2026
c8ea5dc
Remove old docs
cwbooth5 Jun 15, 2026
9b31d11
Update workflows to latest versions
cwbooth5 Jun 15, 2026
7f85780
Remove more leftover docs
cwbooth5 Jun 15, 2026
4c8c843
Change session timeout to 5min
cwbooth5 Jun 15, 2026
8bbad69
Length warning on PIN setup
cwbooth5 Jun 15, 2026
2e812b2
Add alphanumeric PIN design spec
cwbooth5 Jun 15, 2026
be61dd4
Add alphanumeric PIN implementation plan
cwbooth5 Jun 15, 2026
574a85b
feat: add PINType enum and embed it in HashedPin
cwbooth5 Jun 15, 2026
00994a6
feat: thread pinType through PinRepository and PIN-creation use cases
cwbooth5 Jun 15, 2026
261191b
feat: add alphanumeric strength rules to PinStrengthCheckUseCase
cwbooth5 Jun 15, 2026
83853ff
feat: add pinType to PINEntryField for dynamic keyboard and character…
cwbooth5 Jun 15, 2026
97e2938
feat: add alphanumeric toggle to PIN setup
cwbooth5 Jun 15, 2026
4cdb2eb
feat: load and apply pinType at PIN verification
cwbooth5 Jun 15, 2026
cf135c9
feat: add independent alphanumeric toggle to poison pill PIN setup
cwbooth5 Jun 15, 2026
316f4c7
Alphanumeric pins, gallery order, location precision
cwbooth5 Jun 17, 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
4 changes: 2 additions & 2 deletions .github/workflows/build-and-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:

steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v6

- name: Set Xcode version
run: sudo xcode-select -s /Applications/Xcode_26.0.1.app
Expand Down Expand Up @@ -50,7 +50,7 @@ jobs:

- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: test-results
path: |
Expand Down
10 changes: 9 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,12 @@ Configs/LocalOverrides.xcconfig
vendor/

# fastlane snapshot
screenshots/
screenshots/

SecureCameraAndroid/

# Local TODO scratch
TODO.md

.claude/worktrees
.superpowers/
6 changes: 6 additions & 0 deletions .periphery.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
project: SnapSafe.xcworkspace
schemes:
- SnapSafe
clean_build: true
build_arguments:
- -skipMacroValidation
98 changes: 98 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
# Agent guide for Swift and SwiftUI

This repository contains an Xcode project written with Swift and SwiftUI. Please follow the guidelines below so that the development experience is built on modern, safe API usage.


## Role

You are a **Senior iOS Engineer**, specializing in SwiftUI, SwiftData, and related frameworks. Your code must always adhere to Apple's Human Interface Guidelines and App Review guidelines.


## Core instructions

- Target iOS 26.0 or later. (Yes, it definitely exists.)
- Swift 6.2 or later, using modern Swift concurrency. Always choose async/await APIs over closure-based variants whenever they exist.
- SwiftUI backed up by `@Observable` classes for shared data.
- Do not introduce third-party frameworks without asking first.
- Avoid UIKit unless requested.


## Swift instructions

- `@Observable` classes must be marked `@MainActor` unless the project has Main Actor default actor isolation. Flag any `@Observable` class missing this annotation.
- All shared data should use `@Observable` classes with `@State` (for ownership) and `@Bindable` / `@Environment` (for passing).
- Strongly prefer not to use `ObservableObject`, `@Published`, `@StateObject`, `@ObservedObject`, or `@EnvironmentObject` unless they are unavoidable, or if they exist in legacy/integration contexts when changing architecture would be complicated.
- Assume strict Swift concurrency rules are being applied.
- Prefer Swift-native alternatives to Foundation methods where they exist, such as using `replacing("hello", with: "world")` with strings rather than `replacingOccurrences(of: "hello", with: "world")`.
- Prefer modern Foundation API, for example `URL.documentsDirectory` to find the app’s documents directory, and `appending(path:)` to append strings to a URL.
- Never use C-style number formatting such as `Text(String(format: "%.2f", abs(myNumber)))`; always use `Text(abs(change), format: .number.precision(.fractionLength(2)))` instead.
- Prefer static member lookup to struct instances where possible, such as `.circle` rather than `Circle()`, and `.borderedProminent` rather than `BorderedProminentButtonStyle()`.
- Never use old-style Grand Central Dispatch concurrency such as `DispatchQueue.main.async()`. If behavior like this is needed, always use modern Swift concurrency.
- Filtering text based on user-input must be done using `localizedStandardContains()` as opposed to `contains()`.
- Avoid force unwraps and force `try` unless it is unrecoverable.
- Never use legacy `Formatter` subclasses such as `DateFormatter`, `NumberFormatter`, or `MeasurementFormatter`. Always use the modern `FormatStyle` API instead. For example, to format a date, use `myDate.formatted(date: .abbreviated, time: .shortened)`. To parse a date from a string, use `Date(inputString, strategy: .iso8601)`. For numbers, use `myNumber.formatted(.number)` or custom format styles.

## SwiftUI instructions

- Always use `foregroundStyle()` instead of `foregroundColor()`.
- Always use `clipShape(.rect(cornerRadius:))` instead of `cornerRadius()`.
- Always use the `Tab` API instead of `tabItem()`.
- Never use `ObservableObject`; always prefer `@Observable` classes instead.
- Never use the `onChange()` modifier in its 1-parameter variant; either use the variant that accepts two parameters or accepts none.
- Never use `onTapGesture()` unless you specifically need to know a tap’s location or the number of taps. All other usages should use `Button`.
- Never use `Task.sleep(nanoseconds:)`; always use `Task.sleep(for:)` instead.
- Never use `UIScreen.main.bounds` to read the size of the available space.
- Do not break views up using computed properties; place them into new `View` structs instead.
- Do not force specific font sizes; prefer using Dynamic Type instead.
- Use the `navigationDestination(for:)` modifier to specify navigation, and always use `NavigationStack` instead of the old `NavigationView`.
- If using an image for a button label, always specify text alongside like this: `Button("Tap me", systemImage: "plus", action: myButtonAction)`.
- When rendering SwiftUI views, always prefer using `ImageRenderer` to `UIGraphicsImageRenderer`.
- Don’t apply the `fontWeight()` modifier unless there is good reason. If you want to make some text bold, always use `bold()` instead of `fontWeight(.bold)`.
- Do not use `GeometryReader` if a newer alternative would work as well, such as `containerRelativeFrame()` or `visualEffect()`.
- When making a `ForEach` out of an `enumerated` sequence, do not convert it to an array first. So, prefer `ForEach(x.enumerated(), id: \.element.id)` instead of `ForEach(Array(x.enumerated()), id: \.element.id)`.
- When hiding scroll view indicators, use the `.scrollIndicators(.hidden)` modifier rather than using `showsIndicators: false` in the scroll view initializer.
- Use the newest ScrollView APIs for item scrolling and positioning (e.g. `ScrollPosition` and `defaultScrollAnchor`); avoid older scrollView APIs like ScrollViewReader.
- Place view logic into view models or similar, so it can be tested.
- Avoid `AnyView` unless it is absolutely required.
- Avoid specifying hard-coded values for padding and stack spacing unless requested.
- Avoid using UIKit colors in SwiftUI code.


## SwiftData instructions

If SwiftData is configured to use CloudKit:

- Never use `@Attribute(.unique)`.
- Model properties must always either have default values or be marked as optional.
- All relationships must be marked optional.


## Project structure

- Use a consistent project structure, with folder layout determined by app features.
- Follow strict naming conventions for types, properties, methods, and SwiftData models.
- Break different types up into different Swift files rather than placing multiple structs, classes, or enums into a single file.
- Write unit tests for core application logic.
- Only write UI tests if unit tests are not possible.
- Add code comments and documentation comments as needed.
- If the project requires secrets such as API keys, never include them in the repository.
- If the project uses Localizable.xcstrings, prefer to add user-facing strings using symbol keys (e.g. helloWorld) in the string catalog with `extractionState` set to "manual", accessing them via generated symbols such as `Text(.helloWorld)`. Offer to translate new keys into all languages supported by the project.


## PR instructions

- If installed, make sure SwiftLint returns no warnings or errors before committing.


## Xcode MCP

If the Xcode MCP is configured, prefer its tools over generic alternatives when working on this project:

- `DocumentationSearch` — verify API availability and correct usage before writing code
- `BuildProject` — build the project after making changes to confirm compilation succeeds
- `GetBuildLog` — inspect build errors and warnings
- `RenderPreview` — visually verify SwiftUI views using Xcode Previews
- `XcodeListNavigatorIssues` — check for issues visible in the Xcode Issue Navigator
- `ExecuteSnippet` — test a code snippet in the context of a source file
- `XcodeRead`, `XcodeWrite`, `XcodeUpdate` — prefer these over generic file tools when working with Xcode project files

76 changes: 45 additions & 31 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -6,45 +6,47 @@ GEM
nkf
rexml
abbrev (0.1.2)
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
addressable (2.9.0)
public_suffix (>= 2.0.2, < 8.0)
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.4.0)
aws-partitions (1.1172.0)
aws-sdk-core (3.233.0)
aws-partitions (1.1260.0)
aws-sdk-core (3.252.0)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9)
base64
bigdecimal
jmespath (~> 1, >= 1.6.1)
logger
aws-sdk-kms (1.113.0)
aws-sdk-core (~> 3, >= 3.231.0)
aws-sdk-kms (1.129.0)
aws-sdk-core (~> 3, >= 3.248.0)
aws-sigv4 (~> 1.5)
aws-sdk-s3 (1.199.1)
aws-sdk-core (~> 3, >= 3.231.0)
aws-sdk-s3 (1.225.1)
aws-sdk-core (~> 3, >= 3.248.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
aws-sigv4 (1.12.1)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
base64 (0.3.0)
bigdecimal (3.3.1)
benchmark (0.5.0)
bigdecimal (4.1.2)
claide (1.1.0)
colored (1.2)
colored2 (3.1.2)
commander (4.6.0)
highline (~> 2.0.0)
csv (3.3.5)
declarative (0.0.20)
digest-crc (0.7.0)
rake (>= 12.0.0, < 14.0.0)
domain_name (0.6.20240107)
dotenv (2.8.1)
emoji_regex (3.2.3)
excon (0.112.0)
faraday (1.10.4)
faraday (1.10.5)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1)
Expand All @@ -63,46 +65,55 @@ GEM
faraday-em_synchrony (1.0.1)
faraday-excon (1.1.0)
faraday-httpclient (1.0.1)
faraday-multipart (1.1.1)
faraday-multipart (1.2.0)
multipart-post (~> 2.0)
faraday-net_http (1.0.2)
faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0)
faraday-rack (1.0.0)
faraday-retry (1.0.3)
faraday-retry (1.0.4)
faraday_middleware (1.2.1)
faraday (~> 1.0)
fastimage (2.4.0)
fastlane (2.228.0)
CFPropertyList (>= 2.3, < 4.0.0)
fastlane (2.236.1)
CFPropertyList (>= 2.3, < 5.0.0)
abbrev (~> 0.1)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
aws-sdk-s3 (~> 1.0)
aws-sdk-s3 (~> 1.197)
babosa (>= 1.0.3, < 2.0.0)
bundler (>= 1.12.0, < 3.0.0)
base64 (~> 0.2)
benchmark (>= 0.1.0)
bundler (>= 2.4.0, < 5.0.0)
colored (~> 1.2)
commander (~> 4.6)
csv (~> 3.3)
dotenv (>= 2.1.1, < 3.0.0)
emoji_regex (>= 0.1, < 4.0)
excon (>= 0.71.0, < 1.0.0)
faraday (~> 1.0)
faraday-cookie_jar (~> 0.0.6)
faraday_middleware (~> 1.0)
fastimage (>= 2.1.0, < 3.0.0)
fastlane-sirp (>= 1.0.0)
fastlane-sirp (>= 1.1.0)
gh_inspector (>= 1.1.2, < 2.0.0)
google-apis-androidpublisher_v3 (~> 0.3)
google-apis-playcustomapp_v1 (~> 0.1)
google-cloud-env (>= 1.6.0, < 2.0.0)
google-cloud-env (>= 1.6.0, < 2.3.0)
google-cloud-storage (~> 1.31)
highline (~> 2.0)
http-cookie (~> 1.0.5)
json (< 3.0.0)
jwt (>= 2.1.0, < 3)
jwt (>= 2.10.3, < 4)
logger (>= 1.6, < 2.0)
mini_magick (>= 4.9.4, < 5.0.0)
multi_json (~> 1.12)
multipart-post (>= 2.0.0, < 3.0.0)
mutex_m (~> 0.3)
naturally (~> 2.2)
nkf (~> 0.2)
optparse (>= 0.1.1, < 1.0.0)
ostruct (>= 0.1.0)
plist (>= 3.1.0, < 4.0.0)
rubyzip (>= 2.0.0, < 3.0.0)
security (= 0.1.5)
Expand All @@ -115,8 +126,7 @@ GEM
xcodeproj (>= 1.13.0, < 2.0.0)
xcpretty (~> 0.4.1)
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
fastlane-sirp (1.0.0)
sysrandom (~> 1.0)
fastlane-sirp (1.1.0)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.54.0)
google-apis-core (>= 0.11.0, < 2.a)
Expand All @@ -137,8 +147,9 @@ GEM
google-cloud-core (1.8.0)
google-cloud-env (>= 1.0, < 3.a)
google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0)
google-cloud-env (2.2.2)
base64 (~> 0.2)
faraday (>= 1.0, < 3.a)
google-cloud-errors (1.5.0)
google-cloud-storage (1.47.0)
addressable (~> 2.8)
Expand All @@ -148,20 +159,23 @@ GEM
google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0)
googleauth (1.8.1)
faraday (>= 0.17.3, < 3.a)
jwt (>= 1.4, < 3.0)
multi_json (~> 1.11)
google-logging-utils (0.2.0)
googleauth (1.17.0)
faraday (>= 1.0, < 3.a)
google-cloud-env (~> 2.2)
google-logging-utils (~> 0.1)
jwt (>= 1.4, < 4.0)
os (>= 0.9, < 2.0)
pstore (~> 0.1)
signet (>= 0.16, < 2.a)
highline (2.0.3)
http-cookie (1.0.8)
domain_name (~> 0.5)
httpclient (2.9.0)
mutex_m
jmespath (1.6.2)
json (2.15.1)
jwt (2.10.2)
json (2.19.9)
jwt (3.2.0)
base64
logger (1.7.0)
mini_magick (4.13.2)
Expand All @@ -176,7 +190,8 @@ GEM
os (1.1.4)
ostruct (0.6.1)
plist (3.7.2)
public_suffix (6.0.2)
pstore (0.2.1)
public_suffix (7.0.5)
rake (13.3.0)
representable (3.2.0)
declarative (< 0.1.0)
Expand All @@ -196,7 +211,6 @@ GEM
simctl (1.6.10)
CFPropertyList
naturally
sysrandom (1.0.5)
terminal-notifier (2.0.0)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
Expand Down
Loading