Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
1a58de6
fix: stuff
Sep 24, 2025
f6737b0
fix: upgrade the project to most recent xcode
Sep 24, 2025
e167098
Add a dropdown that shows the transcript in the recording summary
GitWither Aug 6, 2025
298b3c2
Implement code review changes, reuse defined color constants
GitWither Aug 7, 2025
339298c
fix: stuff
Sep 24, 2025
8aaaa0b
fix: upgrade the project to most recent xcode
Sep 24, 2025
869de69
feat: Add System-Wide audio tap recording functionality
wobondar Aug 13, 2025
7e6950c
fix: recording the system audio at last
Sep 24, 2025
3f34a82
feat: copy transcript and timestamps
Sep 24, 2025
34a8e70
feat: dark theme icon
Sep 24, 2025
68614f0
feat: cli and gitignore
Sep 25, 2025
bdaf31f
fix: tests
Sep 25, 2025
37f33f2
chore: always use the black icon on the system tray
Sep 25, 2025
dcf4e03
WIP: system tray revised changes
Sep 26, 2025
7629593
feat: vad
Sep 26, 2025
9c05566
feat: system tray icon switches to red, merge the vad branch and avoi…
Sep 27, 2025
19b368a
WIP: VAD dumps now contain text!
Sep 27, 2025
ed5cdd1
feat: enable VAD for the system audio too
Sep 27, 2025
cac6039
feat: vad for system audio and pretty transcriptions
Sep 27, 2025
3534e1d
chore: close icon color
Sep 27, 2025
455a94f
feat: access recaps and settings independently
Sep 27, 2025
dcc5266
feat: global shortcut settings
Sep 27, 2025
e231c14
feat: select a destination folder in the user directory
Sep 28, 2025
a8b587f
feat: apply prettifier to transcriptions, transcribe segments and who…
Sep 28, 2025
2b989c6
chore: remove UI hacks, rationalize settings
Sep 28, 2025
23dcbd8
feat: prepare a redistributable package
Sep 28, 2025
e7d2924
feat: cli run
Sep 28, 2025
4c72da8
feat: option to disable segments transcript and summarization
Oct 2, 2025
3266dcc
feat: remove the VAD
Oct 2, 2025
d462078
feat: specify the configuration
Oct 2, 2025
3e006a8
feat: openai models selector
Oct 2, 2025
c71d216
fix: markdown prettifier
Oct 2, 2025
867eafd
fix: use the configured folder to store the recordings and the
Oct 2, 2025
723295c
fix: drop tags from the transcription text
Oct 2, 2025
0b6d078
fix: use the right directory for the recordings and transcripts
Oct 2, 2025
5b53056
fix: remove | before and after the text
Oct 2, 2025
42d98e4
chore: debugging logs and whitespaces
Oct 2, 2025
8e7a811
fix: the folder picker now does not lose the settings panel during
Oct 2, 2025
381e39e
chore: use system tray tint
Oct 3, 2025
c09db1a
fix: display transcription-only recaps
Oct 3, 2025
a271e97
fix: UI to fix stuck recordings
Oct 3, 2025
f906e63
fix: update the state of the recording when a transcription is in
Oct 3, 2025
69e545d
chore: avoid print
Oct 3, 2025
e31b637
chore: AGENTS.md
Oct 3, 2025
d14b448
fix: unit tests
Oct 3, 2025
76b658f
chore: unit tests guidance
Oct 3, 2025
09ccbbb
chore: swiftlint
Oct 3, 2025
da2bd2d
fix: connect a bluetooth device after startup
Oct 3, 2025
8479240
chore: fix linter errors
Oct 3, 2025
0afa65b
chore: lockfile
Oct 3, 2025
a808ecc
chore: reformat with zed
Oct 3, 2025
f2d7465
chore: formatting
Oct 3, 2025
eafa5fe
chore: reformatting with swiftlinter
Oct 3, 2025
7632af9
chore: instruct Claude
Oct 3, 2025
806c069
chore: reduce linting errors
Oct 3, 2025
4ad1c3a
chore: line length violations
Oct 3, 2025
56cf9c7
fix: resolve OSLog string concatenation build errors
Oct 3, 2025
71bd710
fix: resolve all swiftlint violations and refactor codebase
Oct 4, 2025
6b49a7e
fix(release0: clear debug macros
Oct 4, 2025
f96d3a4
fix: unit tests
Oct 4, 2025
fe318b8
wip: drag and drop
Oct 4, 2025
517020b
feat: button to test the openai and openrouter providers
Oct 4, 2025
e5e55a8
fix: keep the drag and drop panel open on drag
Oct 4, 2025
fe25b70
feat: apply the same formatting as recording transcripts
Oct 4, 2025
04f31e7
fix(unit-tests): missing mocks
Oct 4, 2025
a6ee10d
Merge pull request #1 from nillebco/feat/drag-and-drop
nilleb Oct 4, 2025
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
216 changes: 108 additions & 108 deletions .github/workflows/linter.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,133 +2,133 @@ name: Build and Lint

on:
push:
branches: [ main ]
branches: [main]
pull_request:
branches: [ main ]
branches: [main]
workflow_dispatch:

jobs:
lint:
name: SwiftLint
runs-on: macos-15
if: github.event.pull_request.draft == false

steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install SwiftLint
run: brew install swiftlint
- name: Run SwiftLint
run: |
cd Recap
swiftlint --strict --reporter github-actions-logging
- name: Checkout code
uses: actions/checkout@v4

- name: Install SwiftLint
run: brew install swiftlint

- name: Run SwiftLint
run: |
cd Recap
swiftlint --strict --reporter github-actions-logging

build:
name: Build
runs-on: macos-15
if: github.event.pull_request.draft == false

steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- name: Cache DerivedData
uses: actions/cache@v4
with:
path: ~/Library/Developer/Xcode/DerivedData
key: ${{ runner.os }}-deriveddata-${{ hashFiles('Recap.xcodeproj/project.pbxproj') }}
restore-keys: |
${{ runner.os }}-deriveddata-
- name: Resolve Package Dependencies
run: |
xcodebuild -resolvePackageDependencies \
-project Recap.xcodeproj \
-scheme Recap
- name: Build Project
run: |
xcodebuild build \
-project Recap.xcodeproj \
-scheme Recap \
-configuration Debug \
-destination 'platform=macOS' \
-skipMacroValidation \
CODE_SIGNING_ALLOWED=NO
- name: Build Release
run: |
xcodebuild build \
-project Recap.xcodeproj \
-scheme Recap \
-configuration Release \
-destination 'platform=macOS' \
-skipMacroValidation \
CODE_SIGNING_ALLOWED=NO
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable

- name: Cache DerivedData
uses: actions/cache@v4
with:
path: ~/Library/Developer/Xcode/DerivedData
key: ${{ runner.os }}-deriveddata-${{ hashFiles('Recap.xcodeproj/project.pbxproj') }}
restore-keys: |
${{ runner.os }}-deriveddata-

- name: Resolve Package Dependencies
run: |
xcodebuild -resolvePackageDependencies \
-project Recap.xcodeproj \
-scheme Recap

- name: Build Project
run: |
xcodebuild build \
-project Recap.xcodeproj \
-scheme Recap \
-configuration Debug \
-destination 'platform=macOS' \
-skipMacroValidation \
CODE_SIGNING_ALLOWED=NO

- name: Build Release
run: |
xcodebuild build \
-project Recap.xcodeproj \
-scheme Recap \
-configuration Release \
-destination 'platform=macOS' \
-skipMacroValidation \
CODE_SIGNING_ALLOWED=NO

test:
name: Test
runs-on: macos-15
needs: build
if: github.event.pull_request.draft == false

steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- name: Cache DerivedData
uses: actions/cache@v4
with:
path: ~/Library/Developer/Xcode/DerivedData
key: ${{ runner.os }}-deriveddata-${{ hashFiles('Recap.xcodeproj/project.pbxproj') }}
restore-keys: |
${{ runner.os }}-deriveddata-
- name: Resolve Package Dependencies
run: |
xcodebuild -resolvePackageDependencies \
-project Recap.xcodeproj \
-scheme Recap
- name: Run Tests with Coverage
run: |
xcodebuild test \
-project Recap.xcodeproj \
-scheme Recap \
-destination 'platform=macOS' \
-resultBundlePath TestResults.xcresult \
-enableCodeCoverage YES \
-only-testing:RecapTests \
-skipMacroValidation \
CODE_SIGNING_ALLOWED=NO
- name: Generate Coverage Report
run: |
xcrun xccov view --report --json TestResults.xcresult > coverage.json
- name: Upload Test Results
uses: actions/upload-artifact@v4
if: always()
with:
name: test-results
path: TestResults.xcresult
- name: Upload Coverage Reports
uses: codecov/codecov-action@v5
with:
file: coverage.json
flags: unittests
name: recap-coverage
fail_ci_if_error: false
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable

- name: Cache DerivedData
uses: actions/cache@v4
with:
path: ~/Library/Developer/Xcode/DerivedData
key: ${{ runner.os }}-deriveddata-${{ hashFiles('Recap.xcodeproj/project.pbxproj') }}
restore-keys: |
${{ runner.os }}-deriveddata-

- name: Resolve Package Dependencies
run: |
xcodebuild -resolvePackageDependencies \
-project Recap.xcodeproj \
-scheme Recap

- name: Run Tests with Coverage
run: |
xcodebuild test \
-project Recap.xcodeproj \
-scheme Recap \
-destination 'platform=macOS' \
-resultBundlePath TestResults.xcresult \
-enableCodeCoverage YES \
-only-testing:RecapTests \
-skipMacroValidation \
CODE_SIGNING_ALLOWED=NO

- name: Generate Coverage Report
run: |
xcrun xccov view --report --json TestResults.xcresult > coverage.json

- name: Upload Test Results
uses: actions/upload-artifact@v4
if: always()
with:
name: test-results
path: TestResults.xcresult

- name: Upload Coverage Reports
uses: codecov/codecov-action@v5
with:
files: coverage.json
flags: unittests
name: recap-coverage
fail_ci_if_error: false
9 changes: 8 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -90,4 +90,11 @@ fastlane/test_output
iOSInjectionProject/

# Mac OS
.DS_Store
.DS_Store

# Archive outputs
Archives/
*.xcarchive
Recap.app

dist/
75 changes: 75 additions & 0 deletions .swift-format
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
{
"fileScopedDeclarationPrivacy" : {
"accessLevel" : "private"
},
"indentConditionalCompilationBlocks" : true,
"indentSwitchCaseLabels" : false,
"indentation" : {
"spaces" : 2
},
"lineBreakAroundMultilineExpressionChainComponents" : false,
"lineBreakBeforeControlFlowKeywords" : false,
"lineBreakBeforeEachArgument" : false,
"lineBreakBeforeEachGenericRequirement" : false,
"lineBreakBetweenDeclarationAttributes" : false,
"lineLength" : 100,
"maximumBlankLines" : 1,
"multiElementCollectionTrailingCommas" : true,
"noAssignmentInExpressions" : {
"allowedFunctions" : [
"XCTAssertNoThrow"
]
},
"prioritizeKeepingFunctionOutputTogether" : false,
"reflowMultilineStringLiterals" : "never",
"respectsExistingLineBreaks" : true,
"rules" : {
"AllPublicDeclarationsHaveDocumentation" : false,
"AlwaysUseLiteralForEmptyCollectionInit" : false,
"AlwaysUseLowerCamelCase" : true,
"AmbiguousTrailingClosureOverload" : true,
"AvoidRetroactiveConformances" : true,
"BeginDocumentationCommentWithOneLineSummary" : false,
"DoNotUseSemicolons" : true,
"DontRepeatTypeInStaticProperties" : true,
"FileScopedDeclarationPrivacy" : true,
"FullyIndirectEnum" : true,
"GroupNumericLiterals" : true,
"IdentifiersMustBeASCII" : true,
"NeverForceUnwrap" : false,
"NeverUseForceTry" : false,
"NeverUseImplicitlyUnwrappedOptionals" : false,
"NoAccessLevelOnExtensionDeclaration" : true,
"NoAssignmentInExpressions" : true,
"NoBlockComments" : true,
"NoCasesWithOnlyFallthrough" : true,
"NoEmptyLinesOpeningClosingBraces" : false,
"NoEmptyTrailingClosureParentheses" : true,
"NoLabelsInCasePatterns" : true,
"NoLeadingUnderscores" : false,
"NoParensAroundConditions" : true,
"NoPlaygroundLiterals" : true,
"NoVoidReturnOnFunctionSignature" : true,
"OmitExplicitReturns" : false,
"OneCasePerLine" : true,
"OneVariableDeclarationPerLine" : true,
"OnlyOneTrailingClosureArgument" : true,
"OrderedImports" : true,
"ReplaceForEachWithForLoop" : true,
"ReturnVoidInsteadOfEmptyTuple" : true,
"TypeNamesShouldBeCapitalized" : true,
"UseEarlyExits" : false,
"UseExplicitNilCheckInConditions" : true,
"UseLetInEveryBoundCaseVariable" : true,
"UseShorthandTypeNames" : true,
"UseSingleLinePropertyGetter" : true,
"UseSynthesizedInitializer" : true,
"UseTripleSlashForDocumentationComments" : true,
"UseWhereClausesInForLoops" : false,
"ValidateDocumentationComments" : false
},
"spacesAroundRangeFormationOperators" : false,
"spacesBeforeEndOfLineComments" : 2,
"tabWidth" : 8,
"version" : 1
}
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2025 Recap AI & Rawand Ahmed Shaswar
Copyright (c) 2025 Recap AI & Rawand Ahmed Shaswar, Ivo Bellin Salarin

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
Loading