Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
78aae55
refactor: Phase 1 - foundation utilities and cleanup
aramb-dev Feb 14, 2026
e96ee1a
refactor: Phase 2 - Zustand stores for options and history
aramb-dev Feb 14, 2026
f42f0fe
refactor: Phase 3 - route-based architecture
aramb-dev Feb 14, 2026
54124d4
refactor: Phase 4 - extract studio components from TranscriptionStudio
aramb-dev Feb 14, 2026
e7b6a18
refactor: Phase 5 - merge mobile/desktop duplicates
aramb-dev Feb 14, 2026
60b0fb4
refactor: Phase 6 - design token overhaul
aramb-dev Feb 14, 2026
27756cc
refactor: Phase 7 - cleanup and polish
aramb-dev Feb 14, 2026
f6c8fce
fix(studio): use AssemblyAI audio URL as source of truth
aramb-dev Apr 27, 2026
7d7d5ab
feat(app): refresh support pages and feedback telemetry
aramb-dev Apr 27, 2026
54745f8
chore(app): refresh dependencies and simplify legal pages
aramb-dev Apr 27, 2026
16d3c51
fix(feedback): scale modal embed to fit the viewport
aramb-dev Apr 27, 2026
20a543b
feat(ui): improve mobile nav and docs layout
aramb-dev Apr 27, 2026
dd95822
docs(changelog): add 3.4.0 release notes
aramb-dev Apr 27, 2026
64d4278
fix(app): address TypeScript and SSR safety issues across components
aramb-dev Apr 27, 2026
3914275
fix(studio): replace hardcoded blue values with design tokens in Audi…
aramb-dev Apr 27, 2026
823538e
fix(history): patch completed entry instead of overwriting with defaults
aramb-dev Apr 27, 2026
a15242b
fix(history): migrate completed sessions to history store on DB upgrade
aramb-dev Apr 27, 2026
b3bd909
fix(storage): key audio URL in localStorage by prediction ID
aramb-dev Apr 27, 2026
ef2b1ce
fix(export): prevent invalid SRT/VTT timestamps when ms rounds to 1000
aramb-dev Apr 27, 2026
6c23e77
fix(export): correct wordCount for empty/whitespace-only transcriptions
aramb-dev Apr 27, 2026
d6e1710
fix(studio): escape regex metacharacters in transcript search term
aramb-dev Apr 27, 2026
6f47b04
fix(utils): treat 0 seconds as a valid duration in formatDuration
aramb-dev Apr 27, 2026
2a2c43b
fix(utils): treat 0 bytes as a valid size in formatFileSize
aramb-dev Apr 27, 2026
b032c9f
fix(studio): hash full speaker string for stable, always-valid color …
aramb-dev Apr 27, 2026
1bb731d
fix(history): persist failed status to IndexedDB on all failure paths
aramb-dev Apr 27, 2026
447bd07
fix(a11y): make history cards keyboard-operable with role, tabIndex, …
aramb-dev Apr 27, 2026
6bb86bd
fix(history): treat 'starting' status as in-progress, not failure
aramb-dev Apr 27, 2026
26c4e66
fix(upload): guard handleUpload against concurrent double-submits wit…
aramb-dev Apr 27, 2026
220136f
fix(feedback): build Tally embed URL from allowlist only, drop raw qu…
aramb-dev Apr 27, 2026
c3b0811
fix(studio): skip setIsLoading in finally when a redirect already occ…
aramb-dev Apr 27, 2026
9af4d30
fix(studio): use useSearchParams for redirect to prevent empty-state …
aramb-dev Apr 27, 2026
1441bd2
fix(transcribe): clear existing poll interval before restarting in ha…
aramb-dev Apr 27, 2026
7b21f3d
fix(transcribe): correct word count for empty transcription in result UI
aramb-dev Apr 27, 2026
690fe83
fix(studio): only set isPlaying true after play() resolves successfully
aramb-dev Apr 27, 2026
5f6d890
fix(studio): always render A/B loop controls when audio is loaded
aramb-dev Apr 27, 2026
50042fc
fix(export): reuse shared formatTimeForSRT/VTT from export-formats; f…
aramb-dev Apr 27, 2026
205d79d
fix(export): include json, csv, and md in Download All Formats
aramb-dev Apr 27, 2026
44b946a
fix(config): align success/warning tokens, move getStorage into try, …
aramb-dev Apr 27, 2026
2bda566
fix(polling): track and clear initial poll setTimeout to prevent stal…
aramb-dev Apr 27, 2026
ee2e56e
fix(a11y): dialog semantics for shortcuts modal; guard audio shortcut…
aramb-dev Apr 27, 2026
4b8e340
fix(quality): resolve 19 SonarQube code smells; fix Vercel npm build
aramb-dev Apr 27, 2026
8644dcf
fix(i18n): use toLocaleLowerCase for locale-aware word frequency in s…
aramb-dev Apr 27, 2026
77505fd
fix(hooks): extend interactive element guard; clear initial poll time…
aramb-dev Apr 27, 2026
c07103d
chore(tooling): add Biome — lint, format, CSS parser with Tailwind di…
aramb-dev Apr 27, 2026
1ba22e7
chore: remove preview and setup-firebase-cors scripts
aramb-dev Apr 27, 2026
550e991
chore(tooling): remove eslint and migrate to biome
aramb-dev Apr 27, 2026
2fec190
build(config): update biome configuration and scripts
aramb-dev Apr 27, 2026
ad47214
refactor: optimize hooks and improve type safety
aramb-dev Apr 27, 2026
d3bb018
style(project): apply consistent formatting and code style updates
aramb-dev Apr 27, 2026
3c9017a
refactor(core): reorganize imports and optimize hook logic
aramb-dev Apr 27, 2026
3820415
feat(studio): enhance security and stability across core services
aramb-dev Apr 27, 2026
b4a11db
chore(config): ignore package-lock.json
aramb-dev Apr 27, 2026
750553e
ci(github): add linting and type-checking workflows
aramb-dev Apr 27, 2026
1c978f6
refactor(core): remove printerz proxy and unused pdf dependencies
aramb-dev Apr 27, 2026
75acb6a
style(studio): reformat export controls markup
aramb-dev Apr 27, 2026
aff5a34
ci(github): update workflow branch syntax
aramb-dev Apr 27, 2026
f4842d7
refactor(core): improve security, stability, and code organization
aramb-dev Apr 27, 2026
e095f40
refactor: improve security, stability, and data integrity
aramb-dev Apr 27, 2026
109479a
chore: resolve merge conflict — keep package-lock.json deleted (proje…
aramb-dev Apr 27, 2026
e546853
security(server): disable x-powered-by header
aramb-dev Apr 27, 2026
dff58b4
chore(server): remove unnecessary console log
aramb-dev Apr 27, 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
2 changes: 0 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,5 @@ NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=
NEXT_PUBLIC_FIREBASE_APP_ID=

PRINTERZ_API_KEY=
NEXT_PUBLIC_GOOGLE_ANALYTICS_ID=
NEXT_PUBLIC_MICROSOFT_CLARITY_ID=
NEXT_PUBLIC_PRINTERZ_TEMPLATE_ID=
28 changes: 28 additions & 0 deletions .github/workflows/biome.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: Biome

on:
push:
branches:
- "**"
pull_request:
branches:
- "**"

jobs:
biome:
name: biome ci
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- uses: oven-sh/setup-bun@v2
with:
bun-version: "1.x"
cache: true

- name: Install dependencies
run: bun install --frozen-lockfile
Comment thread
coderabbitai[bot] marked this conversation as resolved.

- name: Lint & format check
run: bun run ci
28 changes: 28 additions & 0 deletions .github/workflows/typecheck.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: Typecheck

on:
push:
branches:
- "**"
pull_request:
branches:
- "**"

jobs:
typecheck:
name: tsc --noEmit
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- uses: oven-sh/setup-bun@v2
with:
bun-version: "1.x"
cache: true

- name: Install dependencies
run: bun install --frozen-lockfile
Comment thread
coderabbitai[bot] marked this conversation as resolved.

- name: Type check
run: bun x tsc --noEmit --ignoreDeprecations 6.0
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ node_modules
dist
dist-ssr
*.local
package-lock.json

# Editor directories and files
.vscode/*
Expand Down
311 changes: 311 additions & 0 deletions biome.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,311 @@
{
"$schema": "https://biomejs.dev/schemas/2.4.13/schema.json",
"vcs": { "enabled": true, "clientKind": "git", "useIgnoreFile": true },
"files": { "ignoreUnknown": false },
"formatter": {
"enabled": true,
"formatWithErrors": false,
"indentStyle": "space",
"indentWidth": 2,
"lineEnding": "lf",
"lineWidth": 80,
"attributePosition": "auto",
"bracketSameLine": false,
"bracketSpacing": true,
"expand": "auto",
"useEditorconfig": true
},
"linter": {
"enabled": true,
"rules": {
"recommended": false,
"complexity": {
"noAdjacentSpacesInRegex": "error",
"noExtraBooleanCast": "error",
"noUselessCatch": "error",
"noUselessEscapeInRegex": "error",
"noUselessTypeConstraint": "error"
},
"correctness": {
"noConstAssign": "error",
"noConstantCondition": "error",
"noEmptyCharacterClassInRegex": "error",
"noEmptyPattern": "error",
"noGlobalObjectCalls": "error",
"noInvalidBuiltinInstantiation": "error",
"noInvalidConstructorSuper": "error",
"noNonoctalDecimalEscape": "error",
"noPrecisionLoss": "error",
"noSelfAssign": "error",
"noSetterReturn": "error",
"noSwitchDeclarations": "error",
"noUndeclaredVariables": "error",
"noUnreachable": "error",
"noUnreachableSuper": "error",
"noUnsafeFinally": "error",
"noUnsafeOptionalChaining": "error",
"noUnusedLabels": "error",
"noUnusedPrivateClassMembers": "error",
"noUnusedVariables": "error",
"useIsNan": "error",
"useValidForDirection": "error",
"useValidTypeof": "error",
"useYield": "error"
},
"style": {
"noCommonJs": "error",
"noNamespace": "error",
"useArrayLiterals": "error",
"useAsConstAssertion": "error"
},
"suspicious": {
"noAsyncPromiseExecutor": "error",
"noCatchAssign": "error",
"noClassAssign": "error",
"noCompareNegZero": "error",
"noConstantBinaryExpressions": "error",
"noControlCharactersInRegex": "error",
"noDebugger": "error",
"noDuplicateCase": "error",
"noDuplicateClassMembers": "error",
"noDuplicateElseIf": "error",
"noDuplicateObjectKeys": "error",
"noDuplicateParameters": "error",
"noEmptyBlockStatements": "error",
"noExplicitAny": "error",
"noExtraNonNullAssertion": "error",
"noFallthroughSwitchClause": "error",
"noFunctionAssign": "error",
"noGlobalAssign": "error",
"noImportAssign": "error",
"noIrregularWhitespace": "error",
"noMisleadingCharacterClass": "error",
"noMisleadingInstantiator": "error",
"noNonNullAssertedOptionalChain": "error",
"noPrototypeBuiltins": "error",
"noRedeclare": "error",
"noShadowRestrictedNames": "error",
"noSparseArray": "error",
"noUnassignedVariables": "error",
"noUnsafeDeclarationMerging": "error",
"noUnsafeNegation": "error",
"noUnusedExpressions": "off",
"noUselessRegexBackrefs": "error",
"noWith": "error",
"useGetterReturn": "error",
"useNamespaceKeyword": "error"
}
},
"includes": ["**", "!dist", "!.next", "!node_modules"]
},
"javascript": {
"formatter": {
"jsxQuoteStyle": "double",
"quoteProperties": "asNeeded",
"trailingCommas": "all",
"semicolons": "asNeeded",
"arrowParentheses": "always",
"bracketSameLine": false,
"quoteStyle": "double",
"attributePosition": "auto",
"bracketSpacing": true
},
"globals": []
},
"css": {
"parser": {
"cssModules": false,
"allowWrongLineComments": true,
"tailwindDirectives": true
},
"linter": { "enabled": true },
"formatter": { "enabled": true }
},
"html": {
"formatter": {
"indentScriptAndStyle": false,
"selfCloseVoidElements": "always"
}
},
"overrides": [
{
"includes": ["**/*.ts", "**/*.tsx", "**/*.mts", "**/*.cts"],
"linter": {
"rules": {
"complexity": { "noArguments": "error" },
"correctness": {
"noConstAssign": "off",
"noGlobalObjectCalls": "off",
"noInvalidBuiltinInstantiation": "off",
"noInvalidConstructorSuper": "off",
"noSetterReturn": "off",
"noUndeclaredVariables": "off",
"noUnreachable": "off",
"noUnreachableSuper": "off"
},
"style": { "useConst": "error" },
"suspicious": {
"noClassAssign": "off",
"noDuplicateClassMembers": "off",
"noDuplicateObjectKeys": "off",
"noDuplicateParameters": "off",
"noFunctionAssign": "off",
"noImportAssign": "off",
"noRedeclare": "off",
"noUnsafeNegation": "off",
"noVar": "error",
"noWith": "off",
"useGetterReturn": "off"
}
}
}
},
{
"includes": ["**/*.{js,jsx,ts,tsx}"],
"javascript": {
"globals": [
"onanimationend",
"exports",
"ongamepadconnected",
"onlostpointercapture",
"onanimationiteration",
"onkeyup",
"onmousedown",
"onanimationstart",
"onslotchange",
"onprogress",
"ontransitionstart",
"onpause",
"onended",
"onpointerover",
"onscrollend",
"onformdata",
"ontransitionrun",
"onanimationcancel",
"ondrag",
"onchange",
"onbeforeinstallprompt",
"onbeforexrselect",
"onmessage",
"ontransitioncancel",
"onpointerdown",
"onabort",
"onpointerout",
"oncuechange",
"ongotpointercapture",
"onscrollsnapchanging",
"onsearch",
"onsubmit",
"onstalled",
"onsuspend",
"onreset",
"onerror",
"onresize",
"onmouseenter",
"ongamepaddisconnected",
"ondragover",
"onbeforetoggle",
"onmouseover",
"onpagehide",
"onmousemove",
"onratechange",
"oncommand",
"onmessageerror",
"onwheel",
"ondevicemotion",
"onauxclick",
"ontransitionend",
"onpaste",
"onpageswap",
"ononline",
"ondeviceorientationabsolute",
"onkeydown",
"onclose",
"onselect",
"onpageshow",
"onpointercancel",
"onbeforematch",
"onpointerrawupdate",
"ondragleave",
"onscrollsnapchange",
"onseeked",
"onwaiting",
"onbeforeunload",
"onplaying",
"onvolumechange",
"ondragend",
"onstorage",
"onloadeddata",
"onfocus",
"onoffline",
"onplay",
"onafterprint",
"onclick",
"oncut",
"onmouseout",
"ondblclick",
"oncanplay",
"onloadstart",
"onappinstalled",
"onpointermove",
"ontoggle",
"oncontextmenu",
"onblur",
"oncancel",
"onbeforeprint",
"oncontextrestored",
"onloadedmetadata",
"onpointerup",
"onlanguagechange",
"oncopy",
"onselectstart",
"onscroll",
"onload",
"ondragstart",
"onbeforeinput",
"oncanplaythrough",
"oninput",
"oninvalid",
"ontimeupdate",
"ondurationchange",
"onselectionchange",
"onmouseup",
"location",
"onkeypress",
"onpointerleave",
"oncontextlost",
"ondrop",
"onsecuritypolicyviolation",
"oncontentvisibilityautostatechange",
"ondeviceorientation",
"onseeking",
"onrejectionhandled",
"onunload",
"onmouseleave",
"onhashchange",
"onpointerenter",
"onmousewheel",
"onunhandledrejection",
"ondragenter",
"onpopstate",
"onpagereveal",
"onemptied"
]
},
"linter": {
"rules": {
"correctness": {
"noUnusedVariables": "error",
"useExhaustiveDependencies": "warn",
"useHookAtTopLevel": "error"
}
}
}
},
{ "includes": ["**/*.cjs"], "javascript": { "globals": ["exports"] } }
],
"assist": {
"enabled": true,
"actions": { "source": { "organizeImports": "on" } }
}
}
Loading
Loading