abue-ammar/tinycast
Tinycast — a tiny, fully native macOS launcher, hotkeys, and clipboard history.
The code number leaves out tests, fixtures, docs, examples, data files, styles, translations and vendored code, and 5 generated files: Scripts/raycast-runtime/src/api/enums.generated.js, Tinycast/Features/Calculator/Model/CountryZoneData.generated.swift, Tinycast/Features/Calculator/Model/CurrencyData.generated.swift, Tinycast/Features/Emoji/Model/EmojiData.generated.swift, Tinycast/Resources/RaycastRuntime.generated.js.
Largest clones in the code
- 14 lines in 16 placesswift59 tokensTests/action-menu-search-test.swift:5–18Tests/ai-chat-test.swift:6–19Tests/apple-intelligence-test.swift:8–21Tests/hotkey-test.swift:39–52Tests/interface-size-test.swift:7–20and 11 more
5struct ActionMenuSearchTests { 6 static var failures = 0 7 static var passes = 0 8 9 static func expect(_ condition: @autoclosure () -> Bool, _ message: String) { 10 if condition() { 11 passes += 1 12 } else { 13 failures += 1 14 print("FAIL: \(message)")First 10 of 14 lines.
- 16 lines in 3 placesswift108 tokensTinycast/Features/AI/UI/ChatHistoryView.swift:89–104Tinycast/Features/Calculator/UI/CalculatorHistoryView.swift:110–125Tinycast/Features/Snippets/UI/SnippetsListView.swift:53–68
89let selected: Bool 90@State private var hovered = false 91 92private var fill: Color { 93 if selected { return Theme.Colors.selection } 94 if hovered { return Theme.Colors.rowHover } 95 return .clear 96} 97 98var body: some View {First 10 of 16 lines.
- 12 lines in 5 placesswift53 tokensTests/ai-instructions-test.swift:5–16Tests/apple-shortcut-test.swift:4–15Tests/favorites-test.swift:4–15Tests/redaction-test.swift:5–16Tests/settings-backup-test.swift:4–15
5struct AIInstructionsTest { 6 static func main() { 7 var failures = 0 8 9 func check(_ description: String, _ condition: @autoclosure () -> Bool) { 10 if condition() { 11 print("PASS \(description)") 12 } else { 13 print("FAIL \(description)") 14 failures += 1First 10 of 12 lines.
7 more
- 15 lines in 4 placesswift70 tokens
- 11 lines in 4 placesswift65 tokens
- 26 lines in 2 placesjavascript187 tokens
- 12 lines in 4 placesswift62 tokens
- 11 lines in 4 placesswift58 tokens
- 26 lines in 2 placesswift173 tokens
- 12 lines in 4 placesswift57 tokens
Largest clones over all files, tests and data included
- 17 lines in 3 placestxtdocs and examples602 tokensTests/ai-fixtures/openrouter-nemotron-reasoning.txt:35–51Tests/ai-fixtures/openrouter-nemotron-reasoning.txt:57–73Tests/ai-fixtures/openrouter-nemotron-reasoning.txt:81–97
35data: {"id":"gen-1786242345-6EfeRYvogwFsbuw8r4pY","object":"chat.completion.chunk","created":1786242345,"model":"nvidia/nemotron-3-nano-30b-a3b:free","provider… 36 37data: {"id":"gen-1786242345-6EfeRYvogwFsbuw8r4pY","object":"chat.completion.chunk","created":1786242345,"model":"nvidia/nemotron-3-nano-30b-a3b:free","provider… 38 39data: {"id":"gen-1786242345-6EfeRYvogwFsbuw8r4pY","object":"chat.completion.chunk","created":1786242345,"model":"nvidia/nemotron-3-nano-30b-a3b:free","provider… 40 41data: {"id":"gen-1786242345-6EfeRYvogwFsbuw8r4pY","object":"chat.completion.chunk","created":1786242345,"model":"nvidia/nemotron-3-nano-30b-a3b:free","provider… 42 43data: {"id":"gen-1786242345-6EfeRYvogwFsbuw8r4pY","object":"chat.completion.chunk","created":1786242345,"model":"nvidia/nemotron-3-nano-30b-a3b:free","provider… 44First 10 of 17 lines.
- 14 lines in 16 placesswift59 tokensTests/action-menu-search-test.swift:5–18Tests/ai-chat-test.swift:6–19Tests/apple-intelligence-test.swift:8–21Tests/hotkey-test.swift:39–52Tests/interface-size-test.swift:7–20and 11 more
5struct ActionMenuSearchTests { 6 static var failures = 0 7 static var passes = 0 8 9 static func expect(_ condition: @autoclosure () -> Bool, _ message: String) { 10 if condition() { 11 passes += 1 12 } else { 13 failures += 1 14 print("FAIL: \(message)")First 10 of 14 lines.
- 20 lines in 2 placesjavascript263 tokens
52const Keyboard = { 53 Shortcut: { 54 Common: { 55 Copy: { modifiers: ["cmd", "shift"], key: "c" }, 56 CopyDeeplink: { modifiers: ["cmd", "shift"], key: "c" }, 57 CopyName: { modifiers: ["cmd", "shift"], key: "." }, 58 CopyPath: { modifiers: ["cmd", "shift"], key: "," }, 59 Save: { modifiers: ["cmd"], key: "s" }, 60 Duplicate: { modifiers: ["cmd"], key: "d" }, 61 Edit: { modifiers: ["cmd"], key: "e" },23`):()=>{};return s.enabled=i,n?.(s),s}var rr=Symbol.for("nodejs.util.promisify.custom"),Ou={promisify(a){return a[rr]?a[rr]:(...n)=>new Promise((i,s)=>{a(...n,…First 10 of 20 lines, the second copy on the right.
- 16 lines in 3 placesswift108 tokens
- 12 lines in 5 placesswift53 tokens
By format, code only
| Format | Files | Lines | Clones | Duplicated lines | Duplication |
|---|---|---|---|---|---|
| swift | 681 | 111,800 | 207 | 2,402 | 2.15% |
| javascript | 28 | 9,030 | 5 | 68 | 0.75% |
| bash | 17 | 1,518 | 4 | 31 | 2.04% |
| tsx | 29 | 2,153 | 0 | 0 | 0% |
| typescript | 15 | 818 | 0 | 0 | 0% |
| perl | 1 | 174 | 0 | 0 | 0% |
By format, all files
| Format | Files | Lines | Clones | Duplicated lines | Duplication |
|---|---|---|---|---|---|
| swift | 684 | 114,560 | 207 | 2,402 | 2.1% |
| javascript | 30 | 9,644 | 9 | 131 | 1.36% |
| yaml | 10 | 1,467 | 7 | 108 | 7.36% |
| bash | 23 | 1,617 | 4 | 31 | 1.92% |
| txt | 4 | 240 | 4 | 48 | 20% |
| markdown | 81 | 14,624 | 3 | 21 | 0.14% |
| json | 7 | 3,378 | 0 | 0 | 0% |
| tsx | 31 | 2,284 | 0 | 0 | 0% |
| typescript | 16 | 845 | 0 | 0 | 0% |
| css | 1 | 600 | 0 | 0 | 0% |
Trending appearances
| Day | Rank | Stars | Files | Lines | Clones | All files | Code | Health | Commit |
|---|---|---|---|---|---|---|---|---|---|
| Sep 18, 2026 | #9 | 6,226 (+739) | 897 | 149,607 | 234 | 1.83% | 1.99% | — | 7dc4450 |
| Sep 17, 2026 | #4 | 5,733 (+1,179) | 883 | 146,400 | 237 | 1.89% | 2.06% | — | db35515 |
Want this for your own project? Install jscpd and run jscpd ., or measure it the way the baselines were measured.