markupr 2.1.8 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +292 -15
- package/dist/cli/index.mjs +3593 -0
- package/dist/main/index.mjs +743 -220
- package/dist/mcp/index.mjs +4053 -0
- package/package.json +32 -7
- package/.claude/commands/review-feedback.md +0 -47
- package/.eslintrc.json +0 -35
- package/.github/CODEOWNERS +0 -16
- package/.github/FUNDING.yml +0 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -56
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -54
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -89
- package/.github/dependabot.yml +0 -70
- package/.github/workflows/ci.yml +0 -184
- package/.github/workflows/deploy-landing.yml +0 -134
- package/.github/workflows/nightly.yml +0 -288
- package/.github/workflows/release.yml +0 -318
- package/CHANGELOG.md +0 -127
- package/CLAUDE.md +0 -137
- package/CODE_OF_CONDUCT.md +0 -9
- package/CONTRIBUTING.md +0 -390
- package/PRODUCT_VISION.md +0 -277
- package/SECURITY.md +0 -51
- package/SIGNING_INSTRUCTIONS.md +0 -284
- package/assets/DMG_BACKGROUND_INSTRUCTIONS.md +0 -130
- package/assets/svg-source/dmg-background.svg +0 -70
- package/assets/svg-source/icon.svg +0 -20
- package/assets/svg-source/tray-icon-processing.svg +0 -7
- package/assets/svg-source/tray-icon-recording.svg +0 -7
- package/assets/svg-source/tray-icon.svg +0 -6
- package/assets/tray-complete.png +0 -0
- package/assets/tray-complete@2x.png +0 -0
- package/assets/tray-completeTemplate.png +0 -0
- package/assets/tray-completeTemplate@2x.png +0 -0
- package/assets/tray-error.png +0 -0
- package/assets/tray-error@2x.png +0 -0
- package/assets/tray-errorTemplate.png +0 -0
- package/assets/tray-errorTemplate@2x.png +0 -0
- package/assets/tray-icon-processing.png +0 -0
- package/assets/tray-icon-processing@2x.png +0 -0
- package/assets/tray-icon-processingTemplate.png +0 -0
- package/assets/tray-icon-processingTemplate@2x.png +0 -0
- package/assets/tray-icon-recording.png +0 -0
- package/assets/tray-icon-recording@2x.png +0 -0
- package/assets/tray-icon-recordingTemplate.png +0 -0
- package/assets/tray-icon-recordingTemplate@2x.png +0 -0
- package/assets/tray-icon.png +0 -0
- package/assets/tray-icon@2x.png +0 -0
- package/assets/tray-iconTemplate.png +0 -0
- package/assets/tray-iconTemplate@2x.png +0 -0
- package/assets/tray-idle.png +0 -0
- package/assets/tray-idle@2x.png +0 -0
- package/assets/tray-idleTemplate.png +0 -0
- package/assets/tray-idleTemplate@2x.png +0 -0
- package/assets/tray-processing-0.png +0 -0
- package/assets/tray-processing-0@2x.png +0 -0
- package/assets/tray-processing-0Template.png +0 -0
- package/assets/tray-processing-0Template@2x.png +0 -0
- package/assets/tray-processing-1.png +0 -0
- package/assets/tray-processing-1@2x.png +0 -0
- package/assets/tray-processing-1Template.png +0 -0
- package/assets/tray-processing-1Template@2x.png +0 -0
- package/assets/tray-processing-2.png +0 -0
- package/assets/tray-processing-2@2x.png +0 -0
- package/assets/tray-processing-2Template.png +0 -0
- package/assets/tray-processing-2Template@2x.png +0 -0
- package/assets/tray-processing-3.png +0 -0
- package/assets/tray-processing-3@2x.png +0 -0
- package/assets/tray-processing-3Template.png +0 -0
- package/assets/tray-processing-3Template@2x.png +0 -0
- package/assets/tray-processing.png +0 -0
- package/assets/tray-processing@2x.png +0 -0
- package/assets/tray-processingTemplate.png +0 -0
- package/assets/tray-processingTemplate@2x.png +0 -0
- package/assets/tray-recording.png +0 -0
- package/assets/tray-recording@2x.png +0 -0
- package/assets/tray-recordingTemplate.png +0 -0
- package/assets/tray-recordingTemplate@2x.png +0 -0
- package/build/DMG_BACKGROUND_SPEC.md +0 -50
- package/build/dmg-background.png +0 -0
- package/build/dmg-background@2x.png +0 -0
- package/build/entitlements.mac.inherit.plist +0 -27
- package/build/entitlements.mac.plist +0 -41
- package/build/favicon-16.png +0 -0
- package/build/favicon-180.png +0 -0
- package/build/favicon-192.png +0 -0
- package/build/favicon-32.png +0 -0
- package/build/favicon-48.png +0 -0
- package/build/favicon-512.png +0 -0
- package/build/favicon-64.png +0 -0
- package/build/icon-128.png +0 -0
- package/build/icon-16.png +0 -0
- package/build/icon-24.png +0 -0
- package/build/icon-256.png +0 -0
- package/build/icon-32.png +0 -0
- package/build/icon-48.png +0 -0
- package/build/icon-64.png +0 -0
- package/build/icon.icns +0 -0
- package/build/icon.ico +0 -0
- package/build/icon.iconset/icon_128x128.png +0 -0
- package/build/icon.iconset/icon_128x128@2x.png +0 -0
- package/build/icon.iconset/icon_16x16.png +0 -0
- package/build/icon.iconset/icon_16x16@2x.png +0 -0
- package/build/icon.iconset/icon_256x256.png +0 -0
- package/build/icon.iconset/icon_256x256@2x.png +0 -0
- package/build/icon.iconset/icon_32x32.png +0 -0
- package/build/icon.iconset/icon_32x32@2x.png +0 -0
- package/build/icon.iconset/icon_512x512.png +0 -0
- package/build/icon.iconset/icon_512x512@2x.png +0 -0
- package/build/icon.png +0 -0
- package/build/installer-header.bmp +0 -0
- package/build/installer-header.png +0 -0
- package/build/installer-sidebar.bmp +0 -0
- package/build/installer-sidebar.png +0 -0
- package/build/installer.nsh +0 -45
- package/build/overlay-processing.png +0 -0
- package/build/overlay-recording.png +0 -0
- package/build/toolbar-record.png +0 -0
- package/build/toolbar-screenshot.png +0 -0
- package/build/toolbar-settings.png +0 -0
- package/build/toolbar-stop.png +0 -0
- package/dist/preload/index.mjs +0 -907
- package/dist/renderer/assets/index-CCmUjl9K.js +0 -19495
- package/dist/renderer/assets/index-CUqz_Gs6.css +0 -2270
- package/dist/renderer/index.html +0 -27
- package/docs/AI_AGENT_QUICKSTART.md +0 -42
- package/docs/AI_PIPELINE_DESIGN.md +0 -595
- package/docs/API.md +0 -514
- package/docs/ARCHITECTURE.md +0 -460
- package/docs/CONFIGURATION.md +0 -336
- package/docs/DEVELOPMENT.md +0 -508
- package/docs/EXPORT_FORMATS.md +0 -451
- package/docs/GETTING_STARTED.md +0 -236
- package/docs/KEYBOARD_SHORTCUTS.md +0 -334
- package/docs/TROUBLESHOOTING.md +0 -418
- package/docs/landing/index.html +0 -672
- package/docs/landing/script.js +0 -342
- package/docs/landing/styles.css +0 -1543
- package/electron-builder.yml +0 -140
- package/electron.vite.config.ts +0 -63
- package/railway.json +0 -12
- package/scripts/build.mjs +0 -51
- package/scripts/generate-icons.mjs +0 -314
- package/scripts/generate-installer-images.cjs +0 -253
- package/scripts/generate-tray-icons.mjs +0 -258
- package/scripts/notarize.cjs +0 -180
- package/scripts/one-click-clean-test.sh +0 -147
- package/scripts/postinstall.mjs +0 -36
- package/scripts/setup-markupr.sh +0 -55
- package/setup +0 -17
- package/site/index.html +0 -1835
- package/site/package.json +0 -11
- package/site/railway.json +0 -12
- package/site/server.js +0 -31
- package/src/main/AutoUpdater.ts +0 -392
- package/src/main/CrashRecovery.ts +0 -655
- package/src/main/ErrorHandler.ts +0 -703
- package/src/main/HotkeyManager.ts +0 -399
- package/src/main/MenuManager.ts +0 -529
- package/src/main/PermissionManager.ts +0 -420
- package/src/main/SessionController.ts +0 -1465
- package/src/main/TrayManager.ts +0 -540
- package/src/main/ai/AIPipelineManager.ts +0 -199
- package/src/main/ai/ClaudeAnalyzer.ts +0 -339
- package/src/main/ai/ImageOptimizer.ts +0 -176
- package/src/main/ai/StructuredMarkdownBuilder.ts +0 -379
- package/src/main/ai/index.ts +0 -16
- package/src/main/ai/types.ts +0 -258
- package/src/main/analysis/ClarificationGenerator.ts +0 -385
- package/src/main/analysis/FeedbackAnalyzer.ts +0 -531
- package/src/main/analysis/index.ts +0 -19
- package/src/main/audio/AudioCapture.ts +0 -978
- package/src/main/audio/audioUtils.ts +0 -100
- package/src/main/audio/index.ts +0 -20
- package/src/main/capture/index.ts +0 -1
- package/src/main/index.ts +0 -1693
- package/src/main/ipc/captureHandlers.ts +0 -272
- package/src/main/ipc/index.ts +0 -45
- package/src/main/ipc/outputHandlers.ts +0 -302
- package/src/main/ipc/sessionHandlers.ts +0 -56
- package/src/main/ipc/settingsHandlers.ts +0 -471
- package/src/main/ipc/types.ts +0 -56
- package/src/main/ipc/windowHandlers.ts +0 -277
- package/src/main/output/ClipboardService.ts +0 -369
- package/src/main/output/ExportService.ts +0 -539
- package/src/main/output/FileManager.ts +0 -416
- package/src/main/output/MarkdownGenerator.ts +0 -791
- package/src/main/output/MarkdownPatcher.ts +0 -299
- package/src/main/output/index.ts +0 -186
- package/src/main/output/sessionAdapter.ts +0 -207
- package/src/main/output/templates/html-template.ts +0 -553
- package/src/main/pipeline/FrameExtractor.ts +0 -330
- package/src/main/pipeline/PostProcessor.ts +0 -399
- package/src/main/pipeline/TranscriptAnalyzer.ts +0 -226
- package/src/main/pipeline/index.ts +0 -36
- package/src/main/platform/WindowsTaskbar.ts +0 -600
- package/src/main/platform/index.ts +0 -16
- package/src/main/settings/SettingsManager.ts +0 -730
- package/src/main/settings/index.ts +0 -19
- package/src/main/transcription/ModelDownloadManager.ts +0 -494
- package/src/main/transcription/TierManager.ts +0 -219
- package/src/main/transcription/TranscriptionRecoveryService.ts +0 -340
- package/src/main/transcription/WhisperService.ts +0 -748
- package/src/main/transcription/index.ts +0 -56
- package/src/main/transcription/types.ts +0 -135
- package/src/main/windows/PopoverManager.ts +0 -284
- package/src/main/windows/TaskbarIntegration.ts +0 -452
- package/src/main/windows/index.ts +0 -23
- package/src/preload/index.ts +0 -1047
- package/src/renderer/App.tsx +0 -515
- package/src/renderer/AppWrapper.tsx +0 -28
- package/src/renderer/assets/logo-dark.svg +0 -7
- package/src/renderer/assets/logo.svg +0 -7
- package/src/renderer/audio/AudioCaptureRenderer.ts +0 -454
- package/src/renderer/capture/ScreenRecordingRenderer.ts +0 -492
- package/src/renderer/components/AnnotationOverlay.tsx +0 -836
- package/src/renderer/components/AudioWaveform.tsx +0 -811
- package/src/renderer/components/ClarificationQuestions.tsx +0 -656
- package/src/renderer/components/CountdownTimer.tsx +0 -495
- package/src/renderer/components/CrashRecoveryDialog.tsx +0 -632
- package/src/renderer/components/DonateButton.tsx +0 -127
- package/src/renderer/components/ErrorBoundary.tsx +0 -308
- package/src/renderer/components/ExportDialog.tsx +0 -872
- package/src/renderer/components/HotkeyHint.tsx +0 -261
- package/src/renderer/components/KeyboardShortcuts.tsx +0 -787
- package/src/renderer/components/ModelDownloadDialog.tsx +0 -844
- package/src/renderer/components/Onboarding.tsx +0 -1830
- package/src/renderer/components/ProcessingOverlay.tsx +0 -157
- package/src/renderer/components/RecordingOverlay.tsx +0 -423
- package/src/renderer/components/SessionHistory.tsx +0 -1746
- package/src/renderer/components/SessionReview.tsx +0 -1321
- package/src/renderer/components/SettingsPanel.tsx +0 -217
- package/src/renderer/components/Skeleton.tsx +0 -347
- package/src/renderer/components/StatusIndicator.tsx +0 -86
- package/src/renderer/components/ThemeProvider.tsx +0 -429
- package/src/renderer/components/Tooltip.tsx +0 -370
- package/src/renderer/components/TranscriptionPreview.tsx +0 -183
- package/src/renderer/components/TranscriptionTierSelector.tsx +0 -640
- package/src/renderer/components/UpdateNotification.tsx +0 -377
- package/src/renderer/components/WindowSelector.tsx +0 -947
- package/src/renderer/components/index.ts +0 -99
- package/src/renderer/components/primitives/ApiKeyInput.tsx +0 -98
- package/src/renderer/components/primitives/ColorPicker.tsx +0 -65
- package/src/renderer/components/primitives/DangerButton.tsx +0 -45
- package/src/renderer/components/primitives/DirectoryPicker.tsx +0 -41
- package/src/renderer/components/primitives/Dropdown.tsx +0 -34
- package/src/renderer/components/primitives/KeyRecorder.tsx +0 -117
- package/src/renderer/components/primitives/SettingsSection.tsx +0 -32
- package/src/renderer/components/primitives/Slider.tsx +0 -43
- package/src/renderer/components/primitives/Toggle.tsx +0 -36
- package/src/renderer/components/primitives/index.ts +0 -10
- package/src/renderer/components/settings/AdvancedTab.tsx +0 -174
- package/src/renderer/components/settings/AppearanceTab.tsx +0 -77
- package/src/renderer/components/settings/GeneralTab.tsx +0 -40
- package/src/renderer/components/settings/HotkeysTab.tsx +0 -79
- package/src/renderer/components/settings/RecordingTab.tsx +0 -84
- package/src/renderer/components/settings/index.ts +0 -9
- package/src/renderer/components/settings/settingsStyles.ts +0 -673
- package/src/renderer/components/settings/tabConfig.tsx +0 -85
- package/src/renderer/components/settings/useSettingsPanel.ts +0 -447
- package/src/renderer/contexts/ProcessingContext.tsx +0 -227
- package/src/renderer/contexts/RecordingContext.tsx +0 -683
- package/src/renderer/contexts/UIContext.tsx +0 -326
- package/src/renderer/contexts/index.ts +0 -24
- package/src/renderer/donateMessages.ts +0 -69
- package/src/renderer/hooks/index.ts +0 -75
- package/src/renderer/hooks/useAnimation.tsx +0 -544
- package/src/renderer/hooks/useTheme.ts +0 -313
- package/src/renderer/index.html +0 -26
- package/src/renderer/main.tsx +0 -52
- package/src/renderer/styles/animations.css +0 -1093
- package/src/renderer/styles/app-shell.css +0 -662
- package/src/renderer/styles/globals.css +0 -515
- package/src/renderer/styles/theme.ts +0 -578
- package/src/renderer/types/electron.d.ts +0 -385
- package/src/shared/hotkeys.ts +0 -283
- package/src/shared/types.ts +0 -809
- package/tests/clipboard.test.ts +0 -228
- package/tests/e2e/criticalPaths.test.ts +0 -594
- package/tests/feedbackAnalyzer.test.ts +0 -303
- package/tests/integration/sessionFlow.test.ts +0 -583
- package/tests/markdownGenerator.test.ts +0 -418
- package/tests/output.test.ts +0 -96
- package/tests/setup.ts +0 -486
- package/tests/unit/appIntegration.test.ts +0 -676
- package/tests/unit/appViewState.test.ts +0 -281
- package/tests/unit/audioIpcChannels.test.ts +0 -17
- package/tests/unit/exportService.test.ts +0 -492
- package/tests/unit/hotkeys.test.ts +0 -92
- package/tests/unit/navigationPreload.test.ts +0 -94
- package/tests/unit/onboardingFlow.test.ts +0 -345
- package/tests/unit/permissionManager.test.ts +0 -175
- package/tests/unit/permissionManagerExpanded.test.ts +0 -296
- package/tests/unit/screenRecordingRenderer.test.ts +0 -368
- package/tests/unit/sessionController.test.ts +0 -515
- package/tests/unit/tierManager.test.ts +0 -61
- package/tests/unit/tierManagerExpanded.test.ts +0 -142
- package/tests/unit/transcriptAnalyzer.test.ts +0 -64
- package/tsconfig.json +0 -25
- package/vitest.config.ts +0 -46
|
@@ -1,318 +0,0 @@
|
|
|
1
|
-
# =============================================================================
|
|
2
|
-
# markupr Release Pipeline
|
|
3
|
-
# =============================================================================
|
|
4
|
-
# Triggered on version tags (v*)
|
|
5
|
-
# Builds signed installers for macOS and Windows
|
|
6
|
-
# Creates GitHub Release with changelog and assets
|
|
7
|
-
# =============================================================================
|
|
8
|
-
|
|
9
|
-
name: Release
|
|
10
|
-
|
|
11
|
-
on:
|
|
12
|
-
push:
|
|
13
|
-
tags:
|
|
14
|
-
- 'v*'
|
|
15
|
-
|
|
16
|
-
# Only one release at a time
|
|
17
|
-
concurrency:
|
|
18
|
-
group: release
|
|
19
|
-
cancel-in-progress: false
|
|
20
|
-
|
|
21
|
-
env:
|
|
22
|
-
NODE_VERSION: '20'
|
|
23
|
-
|
|
24
|
-
jobs:
|
|
25
|
-
# ===========================================================================
|
|
26
|
-
# Validate Release Tag
|
|
27
|
-
# ===========================================================================
|
|
28
|
-
validate-tag:
|
|
29
|
-
name: Validate Release Tag
|
|
30
|
-
runs-on: ubuntu-latest
|
|
31
|
-
outputs:
|
|
32
|
-
version: ${{ steps.version.outputs.version }}
|
|
33
|
-
is-prerelease: ${{ steps.version.outputs.is-prerelease }}
|
|
34
|
-
steps:
|
|
35
|
-
- name: Checkout repository
|
|
36
|
-
uses: actions/checkout@v6
|
|
37
|
-
|
|
38
|
-
- name: Extract version from tag
|
|
39
|
-
id: version
|
|
40
|
-
run: |
|
|
41
|
-
TAG_VERSION=${GITHUB_REF#refs/tags/v}
|
|
42
|
-
echo "version=$TAG_VERSION" >> $GITHUB_OUTPUT
|
|
43
|
-
|
|
44
|
-
# Check if this is a prerelease (alpha, beta, rc)
|
|
45
|
-
if [[ "$TAG_VERSION" =~ (alpha|beta|rc) ]]; then
|
|
46
|
-
echo "is-prerelease=true" >> $GITHUB_OUTPUT
|
|
47
|
-
else
|
|
48
|
-
echo "is-prerelease=false" >> $GITHUB_OUTPUT
|
|
49
|
-
fi
|
|
50
|
-
|
|
51
|
-
echo "Release version: $TAG_VERSION"
|
|
52
|
-
|
|
53
|
-
- name: Validate version matches package.json
|
|
54
|
-
run: |
|
|
55
|
-
PACKAGE_VERSION=$(node -p "require('./package.json').version")
|
|
56
|
-
TAG_VERSION=${{ steps.version.outputs.version }}
|
|
57
|
-
|
|
58
|
-
if [ "$PACKAGE_VERSION" != "$TAG_VERSION" ]; then
|
|
59
|
-
echo "Error: Tag version ($TAG_VERSION) does not match package.json version ($PACKAGE_VERSION)"
|
|
60
|
-
exit 1
|
|
61
|
-
fi
|
|
62
|
-
echo "Version validated: $TAG_VERSION"
|
|
63
|
-
|
|
64
|
-
# ===========================================================================
|
|
65
|
-
# Build macOS (Intel + Apple Silicon)
|
|
66
|
-
# ===========================================================================
|
|
67
|
-
build-macos:
|
|
68
|
-
name: Build macOS
|
|
69
|
-
runs-on: macos-latest
|
|
70
|
-
needs: validate-tag
|
|
71
|
-
env:
|
|
72
|
-
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
|
|
73
|
-
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
|
|
74
|
-
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
|
|
75
|
-
APPLE_ID: ${{ secrets.APPLE_ID }}
|
|
76
|
-
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
|
|
77
|
-
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
|
78
|
-
steps:
|
|
79
|
-
- name: Checkout repository
|
|
80
|
-
uses: actions/checkout@v6
|
|
81
|
-
|
|
82
|
-
- name: Setup Node.js
|
|
83
|
-
uses: actions/setup-node@v6
|
|
84
|
-
with:
|
|
85
|
-
node-version: ${{ env.NODE_VERSION }}
|
|
86
|
-
cache: 'npm'
|
|
87
|
-
|
|
88
|
-
- name: Install dependencies
|
|
89
|
-
run: npm ci
|
|
90
|
-
|
|
91
|
-
# Cache Electron binaries
|
|
92
|
-
- name: Cache Electron
|
|
93
|
-
uses: actions/cache@v5
|
|
94
|
-
with:
|
|
95
|
-
path: ~/Library/Caches/electron
|
|
96
|
-
key: macos-electron-${{ hashFiles('package-lock.json') }}
|
|
97
|
-
restore-keys: |
|
|
98
|
-
macos-electron-
|
|
99
|
-
|
|
100
|
-
- name: Build application
|
|
101
|
-
run: npm run build
|
|
102
|
-
|
|
103
|
-
# Install certificates for code signing
|
|
104
|
-
- name: Install Apple certificates
|
|
105
|
-
if: ${{ env.APPLE_CERTIFICATE != '' }}
|
|
106
|
-
run: |
|
|
107
|
-
# Create variables
|
|
108
|
-
CERTIFICATE_PATH=$RUNNER_TEMP/certificate.p12
|
|
109
|
-
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
|
|
110
|
-
|
|
111
|
-
# Import certificate
|
|
112
|
-
echo -n "$APPLE_CERTIFICATE" | base64 --decode -o $CERTIFICATE_PATH
|
|
113
|
-
|
|
114
|
-
# Create temporary keychain
|
|
115
|
-
security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
|
|
116
|
-
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
|
|
117
|
-
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
|
|
118
|
-
|
|
119
|
-
# Import certificate to keychain
|
|
120
|
-
security import $CERTIFICATE_PATH -P "$APPLE_CERTIFICATE_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
|
|
121
|
-
security list-keychain -d user -s $KEYCHAIN_PATH
|
|
122
|
-
|
|
123
|
-
# Allow codesign to access keychain
|
|
124
|
-
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
|
|
125
|
-
|
|
126
|
-
# Build and sign for macOS
|
|
127
|
-
- name: Package macOS (signed)
|
|
128
|
-
if: ${{ env.APPLE_ID != '' && env.APPLE_CERTIFICATE != '' }}
|
|
129
|
-
run: npx electron-builder --mac --publish never --config electron-builder.yml
|
|
130
|
-
env:
|
|
131
|
-
# Code signing
|
|
132
|
-
APPLE_ID: ${{ secrets.APPLE_ID }}
|
|
133
|
-
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
|
|
134
|
-
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
|
135
|
-
# Notarization
|
|
136
|
-
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
|
|
137
|
-
CSC_LINK: ${{ secrets.APPLE_CERTIFICATE }}
|
|
138
|
-
CSC_KEY_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
|
|
139
|
-
|
|
140
|
-
# Build unsigned if no signing credentials
|
|
141
|
-
- name: Package macOS (unsigned)
|
|
142
|
-
if: ${{ env.APPLE_ID == '' || env.APPLE_CERTIFICATE == '' }}
|
|
143
|
-
run: CSC_IDENTITY_AUTO_DISCOVERY=false npx electron-builder --mac --publish never --config electron-builder.yml
|
|
144
|
-
env:
|
|
145
|
-
CSC_IDENTITY_AUTO_DISCOVERY: false
|
|
146
|
-
|
|
147
|
-
- name: List build artifacts
|
|
148
|
-
run: ls -la release/
|
|
149
|
-
|
|
150
|
-
- name: Upload macOS artifacts
|
|
151
|
-
uses: actions/upload-artifact@v6
|
|
152
|
-
with:
|
|
153
|
-
name: release-macos
|
|
154
|
-
path: |
|
|
155
|
-
release/*.dmg
|
|
156
|
-
release/*.zip
|
|
157
|
-
release/*.blockmap
|
|
158
|
-
release/latest-mac.yml
|
|
159
|
-
if-no-files-found: error
|
|
160
|
-
retention-days: 30
|
|
161
|
-
|
|
162
|
-
# ===========================================================================
|
|
163
|
-
# Build Windows
|
|
164
|
-
# ===========================================================================
|
|
165
|
-
build-windows:
|
|
166
|
-
name: Build Windows
|
|
167
|
-
runs-on: windows-latest
|
|
168
|
-
needs: validate-tag
|
|
169
|
-
env:
|
|
170
|
-
WIN_SIGNING_AVAILABLE: ${{ secrets.WIN_CSC_LINK != '' }}
|
|
171
|
-
steps:
|
|
172
|
-
- name: Checkout repository
|
|
173
|
-
uses: actions/checkout@v6
|
|
174
|
-
|
|
175
|
-
- name: Setup Node.js
|
|
176
|
-
uses: actions/setup-node@v6
|
|
177
|
-
with:
|
|
178
|
-
node-version: ${{ env.NODE_VERSION }}
|
|
179
|
-
cache: 'npm'
|
|
180
|
-
|
|
181
|
-
- name: Install dependencies
|
|
182
|
-
run: npm ci
|
|
183
|
-
|
|
184
|
-
# Cache Electron binaries
|
|
185
|
-
- name: Cache Electron
|
|
186
|
-
uses: actions/cache@v5
|
|
187
|
-
with:
|
|
188
|
-
path: ~/AppData/Local/electron/Cache
|
|
189
|
-
key: windows-electron-${{ hashFiles('package-lock.json') }}
|
|
190
|
-
restore-keys: |
|
|
191
|
-
windows-electron-
|
|
192
|
-
|
|
193
|
-
- name: Build application
|
|
194
|
-
run: npm run build
|
|
195
|
-
|
|
196
|
-
# Build and sign for Windows
|
|
197
|
-
- name: Package Windows (signed)
|
|
198
|
-
if: ${{ env.WIN_SIGNING_AVAILABLE == 'true' }}
|
|
199
|
-
run: npx electron-builder --win --x64 --publish never --config electron-builder.yml
|
|
200
|
-
env:
|
|
201
|
-
WIN_CSC_LINK: ${{ secrets.WIN_CSC_LINK }}
|
|
202
|
-
WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }}
|
|
203
|
-
|
|
204
|
-
# Build unsigned if no signing credentials
|
|
205
|
-
- name: Package Windows (unsigned)
|
|
206
|
-
if: ${{ env.WIN_SIGNING_AVAILABLE != 'true' }}
|
|
207
|
-
run: npx electron-builder --win --x64 --publish never --config electron-builder.yml
|
|
208
|
-
env:
|
|
209
|
-
CSC_IDENTITY_AUTO_DISCOVERY: false
|
|
210
|
-
|
|
211
|
-
- name: List build artifacts
|
|
212
|
-
run: dir release
|
|
213
|
-
|
|
214
|
-
- name: Upload Windows artifacts
|
|
215
|
-
uses: actions/upload-artifact@v6
|
|
216
|
-
with:
|
|
217
|
-
name: release-windows
|
|
218
|
-
path: |
|
|
219
|
-
release/*.exe
|
|
220
|
-
release/*.msi
|
|
221
|
-
release/*.zip
|
|
222
|
-
release/*.blockmap
|
|
223
|
-
release/latest.yml
|
|
224
|
-
if-no-files-found: error
|
|
225
|
-
retention-days: 30
|
|
226
|
-
|
|
227
|
-
# ===========================================================================
|
|
228
|
-
# Create GitHub Release
|
|
229
|
-
# ===========================================================================
|
|
230
|
-
create-release:
|
|
231
|
-
name: Create GitHub Release
|
|
232
|
-
runs-on: ubuntu-latest
|
|
233
|
-
needs: [validate-tag, build-macos, build-windows]
|
|
234
|
-
permissions:
|
|
235
|
-
contents: write
|
|
236
|
-
steps:
|
|
237
|
-
- name: Checkout repository
|
|
238
|
-
uses: actions/checkout@v6
|
|
239
|
-
with:
|
|
240
|
-
fetch-depth: 0
|
|
241
|
-
|
|
242
|
-
- name: Download all artifacts
|
|
243
|
-
uses: actions/download-artifact@v7
|
|
244
|
-
with:
|
|
245
|
-
path: artifacts
|
|
246
|
-
|
|
247
|
-
- name: Display artifact structure
|
|
248
|
-
run: find artifacts -type f | head -50
|
|
249
|
-
|
|
250
|
-
- name: Generate changelog
|
|
251
|
-
id: changelog
|
|
252
|
-
run: |
|
|
253
|
-
# Get previous tag
|
|
254
|
-
PREVIOUS_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")
|
|
255
|
-
CURRENT_TAG=${{ github.ref_name }}
|
|
256
|
-
|
|
257
|
-
echo "## What's Changed" > CHANGELOG.md
|
|
258
|
-
echo "" >> CHANGELOG.md
|
|
259
|
-
|
|
260
|
-
if [ -n "$PREVIOUS_TAG" ]; then
|
|
261
|
-
echo "Changes since $PREVIOUS_TAG:" >> CHANGELOG.md
|
|
262
|
-
echo "" >> CHANGELOG.md
|
|
263
|
-
git log $PREVIOUS_TAG..$CURRENT_TAG --pretty=format:"- %s (%h)" >> CHANGELOG.md
|
|
264
|
-
else
|
|
265
|
-
echo "Initial release" >> CHANGELOG.md
|
|
266
|
-
fi
|
|
267
|
-
|
|
268
|
-
echo "" >> CHANGELOG.md
|
|
269
|
-
echo "" >> CHANGELOG.md
|
|
270
|
-
echo "## Downloads" >> CHANGELOG.md
|
|
271
|
-
echo "" >> CHANGELOG.md
|
|
272
|
-
echo "| Platform | Download |" >> CHANGELOG.md
|
|
273
|
-
echo "|----------|----------|" >> CHANGELOG.md
|
|
274
|
-
echo "| macOS (Apple Silicon) | \`markupr-${{ needs.validate-tag.outputs.version }}-arm64.dmg\` |" >> CHANGELOG.md
|
|
275
|
-
echo "| macOS (Intel) | \`markupr-${{ needs.validate-tag.outputs.version }}-x64.dmg\` |" >> CHANGELOG.md
|
|
276
|
-
echo "| Windows | \`markupr-Setup-${{ needs.validate-tag.outputs.version }}.exe\` |" >> CHANGELOG.md
|
|
277
|
-
echo "" >> CHANGELOG.md
|
|
278
|
-
echo "## Checksums" >> CHANGELOG.md
|
|
279
|
-
echo "" >> CHANGELOG.md
|
|
280
|
-
echo "\`\`\`" >> CHANGELOG.md
|
|
281
|
-
find artifacts -type f \( -name "*.dmg" -o -name "*.exe" -o -name "*.zip" \) -exec sha256sum {} \; >> CHANGELOG.md
|
|
282
|
-
echo "\`\`\`" >> CHANGELOG.md
|
|
283
|
-
|
|
284
|
-
cat CHANGELOG.md
|
|
285
|
-
|
|
286
|
-
- name: Create GitHub Release
|
|
287
|
-
uses: softprops/action-gh-release@v2
|
|
288
|
-
with:
|
|
289
|
-
tag_name: ${{ github.ref_name }}
|
|
290
|
-
name: markupr v${{ needs.validate-tag.outputs.version }}
|
|
291
|
-
body_path: CHANGELOG.md
|
|
292
|
-
draft: false
|
|
293
|
-
prerelease: ${{ needs.validate-tag.outputs.is-prerelease == 'true' }}
|
|
294
|
-
files: |
|
|
295
|
-
artifacts/release-macos/*.dmg
|
|
296
|
-
artifacts/release-macos/*.zip
|
|
297
|
-
artifacts/release-macos/*.blockmap
|
|
298
|
-
artifacts/release-macos/*.yml
|
|
299
|
-
artifacts/release-windows/*.exe
|
|
300
|
-
artifacts/release-windows/*.msi
|
|
301
|
-
artifacts/release-windows/*.zip
|
|
302
|
-
artifacts/release-windows/*.blockmap
|
|
303
|
-
artifacts/release-windows/*.yml
|
|
304
|
-
fail_on_unmatched_files: false
|
|
305
|
-
env:
|
|
306
|
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
307
|
-
|
|
308
|
-
- name: Release Summary
|
|
309
|
-
run: |
|
|
310
|
-
echo "## Release Summary" >> $GITHUB_STEP_SUMMARY
|
|
311
|
-
echo "" >> $GITHUB_STEP_SUMMARY
|
|
312
|
-
echo "**Version:** v${{ needs.validate-tag.outputs.version }}" >> $GITHUB_STEP_SUMMARY
|
|
313
|
-
echo "**Prerelease:** ${{ needs.validate-tag.outputs.is-prerelease }}" >> $GITHUB_STEP_SUMMARY
|
|
314
|
-
echo "" >> $GITHUB_STEP_SUMMARY
|
|
315
|
-
echo "### Artifacts" >> $GITHUB_STEP_SUMMARY
|
|
316
|
-
find artifacts -type f \( -name "*.dmg" -o -name "*.exe" -o -name "*.zip" \) | while read f; do
|
|
317
|
-
echo "- $(basename $f)" >> $GITHUB_STEP_SUMMARY
|
|
318
|
-
done
|
package/CHANGELOG.md
DELETED
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to markupr will be documented in this file.
|
|
4
|
-
|
|
5
|
-
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
-
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
-
|
|
8
|
-
## [Unreleased]
|
|
9
|
-
|
|
10
|
-
## [1.0.0] - 2026-02-04
|
|
11
|
-
|
|
12
|
-
### Highlights
|
|
13
|
-
**markupr Initial Public Release** - Voice-to-AI feedback for developers. Free and open source.
|
|
14
|
-
|
|
15
|
-
### Added
|
|
16
|
-
- **Bulletproof State Machine**: 7-state finite state machine with watchdog timer - can never get stuck
|
|
17
|
-
- **Menu Bar Native**: Runs entirely from the menu bar (no dock icon)
|
|
18
|
-
- **Three-Tier Transcription**: OpenAI (premium) -> Whisper (default) -> Timer fallback
|
|
19
|
-
- **Crash Recovery**: 5-second auto-save ensures no work is lost
|
|
20
|
-
- **Offline Mode**: Local Whisper transcription works without internet
|
|
21
|
-
- **Platform-Aware Hotkeys**: Cmd on Mac, Ctrl on Windows - just works
|
|
22
|
-
- **Donate Button**: Rotating messages for supporting the developer
|
|
23
|
-
- **Windows Taskbar Integration**: Overlay icons and toolbar buttons
|
|
24
|
-
|
|
25
|
-
### Changed
|
|
26
|
-
- Default transcription now uses local Whisper (no API key required)
|
|
27
|
-
- Improved documentation with comprehensive guides
|
|
28
|
-
- Enhanced stability across all platforms
|
|
29
|
-
|
|
30
|
-
### Technical
|
|
31
|
-
- State machine: IDLE -> STARTING -> RECORDING -> STOPPING -> PROCESSING -> REVIEWING -> EXPORTING
|
|
32
|
-
- Watchdog monitors state transitions with configurable timeouts
|
|
33
|
-
- Recovery manager handles unexpected exits gracefully
|
|
34
|
-
|
|
35
|
-
## [0.4.0] - 2026-02-02
|
|
36
|
-
|
|
37
|
-
### Added
|
|
38
|
-
- **Export Options**: PDF, HTML, and JSON export formats
|
|
39
|
-
- **AI-Powered Categorization**: Automatic feedback categorization (Bug, Feature, UX)
|
|
40
|
-
- **Crash Recovery**: Automatic session recovery after unexpected crashes
|
|
41
|
-
- **Auto-Updater**: Seamless application updates with release notes
|
|
42
|
-
- **Keyboard Shortcuts Panel**: In-app cheatsheet with customization
|
|
43
|
-
- **Session History Browser**: View and manage past recording sessions
|
|
44
|
-
- **Multi-Monitor Support**: Full support for multiple displays with source preview
|
|
45
|
-
- **Screenshot Annotations**: Arrow, circle, rectangle, freehand, and text tools
|
|
46
|
-
- **Audio Waveform Visualization**: Real-time audio level display
|
|
47
|
-
- **Countdown Timer**: Optional countdown before recording starts
|
|
48
|
-
- **Clarification Questions**: AI-generated follow-up questions for unclear feedback
|
|
49
|
-
- **Native macOS Menu Bar**: Full menu bar integration
|
|
50
|
-
|
|
51
|
-
### Changed
|
|
52
|
-
- Improved Settings panel with live preview
|
|
53
|
-
- Enhanced onboarding wizard with better guidance
|
|
54
|
-
- Better error messages and user feedback
|
|
55
|
-
- Upgraded to Electron 28
|
|
56
|
-
|
|
57
|
-
### Fixed
|
|
58
|
-
- Fixed screenshot timing during rapid speech
|
|
59
|
-
- Fixed hotkey registration on Windows
|
|
60
|
-
- Fixed memory leak during long sessions
|
|
61
|
-
- Fixed clipboard copy on some macOS versions
|
|
62
|
-
|
|
63
|
-
## [0.3.0] - 2026-01-15
|
|
64
|
-
|
|
65
|
-
### Added
|
|
66
|
-
- **Real-time Transcription Preview**: See transcription as you speak
|
|
67
|
-
- **Intelligent Screenshot Timing**: Voice activity detection triggers captures
|
|
68
|
-
- **Tray Icon States**: Visual feedback for idle/recording/processing/error
|
|
69
|
-
- **Settings Panel**: Comprehensive configuration UI
|
|
70
|
-
- **Session Review**: Edit, reorder, and delete feedback items before export
|
|
71
|
-
- **Theme System**: Dark, light, and system theme options
|
|
72
|
-
|
|
73
|
-
### Changed
|
|
74
|
-
- Improved OpenAI integration with better error handling
|
|
75
|
-
- Enhanced Markdown output format for AI consumption
|
|
76
|
-
- Better screenshot compression
|
|
77
|
-
|
|
78
|
-
### Fixed
|
|
79
|
-
- Fixed audio capture on Windows
|
|
80
|
-
- Fixed window selector thumbnail generation
|
|
81
|
-
- Fixed crash when OpenAI connection drops
|
|
82
|
-
|
|
83
|
-
## [0.2.0] - 2026-01-01
|
|
84
|
-
|
|
85
|
-
### Added
|
|
86
|
-
- **Window Selector**: Choose specific windows or screens to capture
|
|
87
|
-
- **Manual Screenshot**: Hotkey to capture screenshots on demand
|
|
88
|
-
- **Output Directory Setting**: Choose where sessions are saved
|
|
89
|
-
- **Clipboard Integration**: Auto-copy summary to clipboard
|
|
90
|
-
|
|
91
|
-
### Changed
|
|
92
|
-
- Improved UI responsiveness
|
|
93
|
-
- Better error messages
|
|
94
|
-
|
|
95
|
-
### Fixed
|
|
96
|
-
- Fixed hotkey conflicts with system shortcuts
|
|
97
|
-
- Fixed screenshot resolution on Retina displays
|
|
98
|
-
|
|
99
|
-
## [0.1.0] - 2025-12-15
|
|
100
|
-
|
|
101
|
-
### Added
|
|
102
|
-
- Initial release
|
|
103
|
-
- Voice narration capture with OpenAI transcription
|
|
104
|
-
- Automatic screenshot capture on voice pauses
|
|
105
|
-
- Markdown document generation
|
|
106
|
-
- Global hotkey to start/stop recording (`Cmd+Shift+F`)
|
|
107
|
-
- System tray icon
|
|
108
|
-
- Basic settings (API key configuration)
|
|
109
|
-
|
|
110
|
-
---
|
|
111
|
-
|
|
112
|
-
## Version History Summary
|
|
113
|
-
|
|
114
|
-
| Version | Date | Highlights |
|
|
115
|
-
|---------|------|------------|
|
|
116
|
-
| 1.0.0 | 2026-02-04 | **Initial Public Release** - Bulletproof state machine, offline Whisper |
|
|
117
|
-
| 0.4.0 | 2026-02-02 | Export formats, crash recovery, auto-updater |
|
|
118
|
-
| 0.3.0 | 2026-01-15 | Transcription preview, intelligent capture, settings |
|
|
119
|
-
| 0.2.0 | 2026-01-01 | Window selector, manual screenshots |
|
|
120
|
-
| 0.1.0 | 2025-12-15 | Initial scaffold |
|
|
121
|
-
|
|
122
|
-
[Unreleased]: https://github.com/eddiesanjuan/markupr/compare/v1.0.0...HEAD
|
|
123
|
-
[1.0.0]: https://github.com/eddiesanjuan/markupr/compare/v0.4.0...v1.0.0
|
|
124
|
-
[0.4.0]: https://github.com/eddiesanjuan/markupr/compare/v0.3.0...v0.4.0
|
|
125
|
-
[0.3.0]: https://github.com/eddiesanjuan/markupr/compare/v0.2.0...v0.3.0
|
|
126
|
-
[0.2.0]: https://github.com/eddiesanjuan/markupr/compare/v0.1.0...v0.2.0
|
|
127
|
-
[0.1.0]: https://github.com/eddiesanjuan/markupr/releases/tag/v0.1.0
|
package/CLAUDE.md
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
# CLAUDE.md - markupr
|
|
2
|
-
|
|
3
|
-
## Project Overview
|
|
4
|
-
|
|
5
|
-
markupr is a macOS menu bar app that intelligently captures developer feedback. It records your screen and voice simultaneously, then uses an intelligent post-processing pipeline to correlate transcript timestamps with the screen recording — extracting the right frames at the right moments and stitching everything into a structured, AI-ready Markdown document. The output is purpose-built for AI coding agents: every screenshot placed exactly where it belongs, every issue clearly documented.
|
|
6
|
-
|
|
7
|
-
**Version:** 1.2.0
|
|
8
|
-
**License:** MIT (Open Source)
|
|
9
|
-
|
|
10
|
-
## Tech Stack
|
|
11
|
-
|
|
12
|
-
- **Framework:** Electron + React + TypeScript
|
|
13
|
-
- **Build:** electron-vite + Vite
|
|
14
|
-
- **Transcription:** Local Whisper (default), OpenAI Whisper-1 API (optional cloud)
|
|
15
|
-
- **AI Analysis:** Anthropic Claude API (BYOK or premium tier)
|
|
16
|
-
- **Testing:** Vitest (356 tests)
|
|
17
|
-
- **Package:** electron-builder
|
|
18
|
-
- **Styling:** Tailwind CSS
|
|
19
|
-
|
|
20
|
-
## Architecture
|
|
21
|
-
|
|
22
|
-
```
|
|
23
|
-
src/
|
|
24
|
-
├── main/ # Electron main process
|
|
25
|
-
│ ├── index.ts # Entry point, window management, IPC orchestration
|
|
26
|
-
│ ├── SessionController.ts # 7-state FSM with watchdog timer
|
|
27
|
-
│ ├── CrashRecovery.ts # Auto-save every 5s, crash detection, recovery dialog
|
|
28
|
-
│ ├── ErrorHandler.ts # Centralized error handling
|
|
29
|
-
│ ├── HotkeyManager.ts # Global hotkey registration
|
|
30
|
-
│ ├── MenuManager.ts # Application menu
|
|
31
|
-
│ ├── TrayManager.ts # Menu bar tray icon and status
|
|
32
|
-
│ ├── PermissionManager.ts # macOS permission checks
|
|
33
|
-
│ ├── AutoUpdater.ts # Auto-update via electron-updater
|
|
34
|
-
│ ├── ai/ # AI analysis pipeline (Claude)
|
|
35
|
-
│ │ ├── AIPipelineManager.ts # Orchestrates AI analysis (free/byok/premium tiers)
|
|
36
|
-
│ │ ├── ClaudeAnalyzer.ts # Claude API integration
|
|
37
|
-
│ │ ├── ImageOptimizer.ts # Screenshot optimization for API
|
|
38
|
-
│ │ ├── StructuredMarkdownBuilder.ts # AI-enhanced markdown output
|
|
39
|
-
│ │ └── types.ts # AI pipeline types
|
|
40
|
-
│ ├── analysis/ # Feedback analysis and categorization
|
|
41
|
-
│ ├── audio/ # Microphone capture, VAD
|
|
42
|
-
│ ├── capture/ # Screen capture via desktopCapturer
|
|
43
|
-
│ ├── output/ # Document generation and export
|
|
44
|
-
│ │ ├── MarkdownGenerator.ts # llms.txt-inspired markdown output
|
|
45
|
-
│ │ ├── ExportService.ts # Multi-format export (MD, PDF, HTML, JSON)
|
|
46
|
-
│ │ ├── ClipboardService.ts # Clipboard bridge (copies file path)
|
|
47
|
-
│ │ ├── FileManager.ts # Session file management
|
|
48
|
-
│ │ └── sessionAdapter.ts # Type conversion utilities
|
|
49
|
-
│ ├── pipeline/ # Post-processing pipeline
|
|
50
|
-
│ │ ├── PostProcessor.ts # Pipeline orchestrator (transcribe → analyze → extract → generate)
|
|
51
|
-
│ │ ├── TranscriptAnalyzer.ts # Heuristic key-moment detection
|
|
52
|
-
│ │ └── FrameExtractor.ts # ffmpeg-based video frame extraction
|
|
53
|
-
│ ├── platform/ # Platform-specific code (Windows taskbar)
|
|
54
|
-
│ ├── settings/ # Persistent settings with secure API key storage
|
|
55
|
-
│ ├── transcription/ # Transcription tier management
|
|
56
|
-
│ │ ├── TierManager.ts # Tier selection (Whisper, timer-only)
|
|
57
|
-
│ │ ├── WhisperService.ts # Local Whisper integration
|
|
58
|
-
│ │ └── ModelDownloadManager.ts # Whisper model download from HuggingFace
|
|
59
|
-
│ └── windows/ # Window management (popover, taskbar)
|
|
60
|
-
├── renderer/ # React UI
|
|
61
|
-
│ ├── App.tsx # Main component with state machine UI
|
|
62
|
-
│ ├── AppWrapper.tsx # Root wrapper with providers
|
|
63
|
-
│ ├── components/ # UI components
|
|
64
|
-
│ │ ├── AnnotationOverlay.tsx # Drawing tools (arrow, circle, rect, freehand, text)
|
|
65
|
-
│ │ ├── AudioWaveform.tsx # Real-time audio level visualization
|
|
66
|
-
│ │ ├── CrashRecoveryDialog.tsx # Crash recovery UI
|
|
67
|
-
│ │ ├── DonateButton.tsx # Rotating donate messages
|
|
68
|
-
│ │ ├── ModelDownloadDialog.tsx # Whisper model download UI
|
|
69
|
-
│ │ ├── Onboarding.tsx # First-run experience
|
|
70
|
-
│ │ ├── SessionHistory.tsx # Session browser
|
|
71
|
-
│ │ ├── SessionReview.tsx # Post-recording review/edit
|
|
72
|
-
│ │ ├── SettingsPanel.tsx # Settings configuration
|
|
73
|
-
│ │ └── ... # Other UI components
|
|
74
|
-
│ ├── audio/ # Renderer-side audio capture bridge
|
|
75
|
-
│ ├── capture/ # Renderer-side screen recording (MediaRecorder)
|
|
76
|
-
│ └── hooks/ # React hooks (theme, animation)
|
|
77
|
-
├── preload/ # Context bridge (secure IPC)
|
|
78
|
-
└── shared/ # Types shared between processes
|
|
79
|
-
├── types.ts # IPC channels, payload types, state types
|
|
80
|
-
└── hotkeys.ts # Hotkey configuration types
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
## Commands
|
|
84
|
-
|
|
85
|
-
```bash
|
|
86
|
-
npm run dev # Development mode with hot reload
|
|
87
|
-
npm run build # Build for production
|
|
88
|
-
npm run build:desktop # Build desktop app only
|
|
89
|
-
npm test # Run all tests (356 tests)
|
|
90
|
-
npm run test:unit # Run unit tests only
|
|
91
|
-
npm run test:watch # Run tests in watch mode
|
|
92
|
-
npm run lint # Lint code
|
|
93
|
-
npm run lint:fix # Auto-fix lint issues
|
|
94
|
-
npm run typecheck # TypeScript check
|
|
95
|
-
npm run package # Package for current platform
|
|
96
|
-
npm run package:mac # Package for macOS
|
|
97
|
-
npm run package:win # Package for Windows
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
## Key Architecture Decisions
|
|
101
|
-
|
|
102
|
-
### State Machine
|
|
103
|
-
The recording session is governed by a 7-state FSM: `idle → starting → recording → stopping → processing → complete → error`. Every state has a maximum duration enforced by a watchdog timer that forces recovery if anything gets stuck.
|
|
104
|
-
|
|
105
|
-
### Post-Processing Pipeline
|
|
106
|
-
When recording stops, the pipeline runs: audio transcription (Whisper) → transcript analysis (key-moment detection) → video frame extraction (ffmpeg) → markdown generation. Each step degrades gracefully if a dependency is missing.
|
|
107
|
-
|
|
108
|
-
### Three-Tier Transcription
|
|
109
|
-
1. **OpenAI Whisper-1 API** (optional, best quality) — cloud-based, requires API key
|
|
110
|
-
2. **Local Whisper** (default) — runs on device, no API key needed
|
|
111
|
-
3. **Timer-only** (fallback) — captures screenshots on a timer when no transcription is available
|
|
112
|
-
|
|
113
|
-
### Crash Recovery
|
|
114
|
-
Session state auto-saves to disk every 5 seconds. On restart after a crash, the app detects the incomplete session and offers recovery.
|
|
115
|
-
|
|
116
|
-
### Clipboard Bridge
|
|
117
|
-
When a session completes, the **file path** to the markdown document is copied to clipboard — not the content. This is deliberate: the file persists on disk, and AI tools can read the full document including screenshots.
|
|
118
|
-
|
|
119
|
-
## IPC Communication
|
|
120
|
-
|
|
121
|
-
All main/renderer communication goes through the preload script. See `src/shared/types.ts` for IPC channel names.
|
|
122
|
-
|
|
123
|
-
## Configuration
|
|
124
|
-
|
|
125
|
-
No configuration required for first run. Local Whisper transcription works out of the box after downloading a model (~75MB for tiny, ~500MB for base).
|
|
126
|
-
|
|
127
|
-
Optional API keys (stored securely in OS keychain):
|
|
128
|
-
- **OpenAI** — for cloud post-session transcription
|
|
129
|
-
- **Anthropic** — for AI-enhanced document analysis (BYOK mode)
|
|
130
|
-
|
|
131
|
-
## Development Notes
|
|
132
|
-
|
|
133
|
-
- Menu bar popover window, frameless, always-on-top
|
|
134
|
-
- Screenshots saved as PNG files in session directories
|
|
135
|
-
- Voice activity detection uses RMS amplitude analysis
|
|
136
|
-
- All settings validated against JSON schema
|
|
137
|
-
- Secure API key storage via keytar (macOS Keychain, Windows Credential Manager) with encrypted fallback
|
package/CODE_OF_CONDUCT.md
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
# Code of Conduct
|
|
2
|
-
|
|
3
|
-
This project follows the [Contributor Covenant v2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct/).
|
|
4
|
-
|
|
5
|
-
## Enforcement
|
|
6
|
-
|
|
7
|
-
Report violations to: **conduct@markupr.app**
|
|
8
|
-
|
|
9
|
-
All reports will be reviewed and investigated promptly.
|