1 view
julyx10/lap
An offline-first photo manager for large local libraries
Vue★ 2,929+122 that day#9 on trending
C59.4/100
Duplication80
2.7% in vue, rust, javascript, typescript, bash, cpp, perl, c, powershell, objectivecDead code92
0.8%Complexity34
79.1% The score is jscpd's own --health model: markup, data and text left out, tests kept. The numbers below are the trending scan's.
1.99%duplicated code · 2,363 of 118,943 lines
224clones in code
263code files of 459 scanned
2.08%duplicated over all files · 267 clones
Most complex files
- src-tauri/src/t_sqlite.rs2525 cx
- src-vite/src/components/Content.vue1522 cx
- src-tauri/src/t_utils.rs886 cx
- src-tauri/src/t_cmds.rs678 cx
- src-vite/src/common/api.js466 cx
- src-tauri/src/t_image.rs381 cx
- src-tauri/src/t_dedup.rs262 cx
- src-tauri/src/t_video.rs236 cx
- src-vite/src/views/ImageEditor.vue204 cx
- src-vite/src/common/utils.ts199 cx
Dead code 0.81% unused · 58 findings
- src-vite/src/components/SearchBox.vueunused-file
- src-vite/src/components/Person.vue:showBetaTooltipunused-symbol
- src-vite/src/components/Content.vue:cancelIndexingunused-symbol
- src-vite/src/components/FileInfo.vue:previewFormatLabelunused-symbol
- src-vite/src/common/shortcuts.ts:getBindingSignaturesunused-symbol
- src-vite/src/components/MoveTo.vue:propsunused-symbol
- src-vite/src/components/TitleBar.vue:propsunused-symbol
- src-vite/src/components/FileInfo.vue:histogramChannelLabelunused-symbol
- src-vite/src/components/SelectionPanel.vue:multiSelectDateRangeunused-symbol
- src-vite/src/views/Home.vue:isCheckingUpdateunused-symbol
The code number leaves out tests, fixtures, docs, examples, data files, styles, translations and vendored code.
Largest clones in the code
- 15 lines in 3 placesrust172 tokenssrc-tauri/src/t_sqlite.rs:5166–5180src-tauri/src/t_sqlite.rs:5249–5263src-tauri/src/t_sqlite.rs:6081–6096
5166query.push_str(&format!(" ORDER BY {}", Self::build_order_clause(params))); 5167 5168let final_params: Vec<&dyn ToSql> = sql_params.iter().map(|p| p.as_ref()).collect(); 5169let conn = open_conn()?; 5170let mut stmt = conn.prepare(&query).map_err(|e| e.to_string())?; 5171let rows = stmt 5172 .query_map(&final_params[..], |row| row.get::<_, i64>(0)) 5173 .map_err(|e| e.to_string())?; 5174 5175let mut ids = Vec::new();First 10 of 15 lines.
- 11 lines in 3 placesrust154 tokenssrc-tauri/src/t_sqlite.rs:1690–1700src-tauri/src/t_sqlite.rs:7978–7988src-tauri/src/t_sqlite.rs:8003–8013
1690 GROUP BY cf.collection_id", 1691 AFile::live_photo_companion_exclusion_condition(), 1692 AFile::album_filter_sql("a"), 1693 AFile::inaccessible_album_filter("b"), 1694 AFile::search_exclusion_condition("b"), 1695); 1696let mut stmt = conn.prepare(&query).map_err(|e| e.to_string())?; 1697let rows = stmt.query_map([], |row| Ok((row.get::<_, i64>(0)?, row.get::<_, i64>(1)?))) 1698 .map_err(|e| e.to_string())?; 1699rows.collect::<Result<HashMap<_, _>, _>>().map_err(|e| e.to_string())First 10 of 11 lines.
- 10 lines in 7 placestypescript50 tokenssrc-vite/src/views/Settings.vue:791–800src-vite/src/views/Settings.vue:819–829src-vite/src/views/Settings.vue:944–954src-vite/src/views/Settings.vue:961–971src-vite/src/views/Settings.vue:978–988and 2 more
791 : localeMsg.value.settings.general.theme_options_dark; 792 793 const result = []; 794 for (let i = 0; i < options.length; i++) { 795 result.push({ label: options[i], value: i }); 796 } 797 return result; 798}); 799 800const currentTheme = computed({819 const options = localeMsg.value.settings.browse.folder_sort_options || []; 820 const result = []; 821 822 for (let i = 0; i < options.length; i++) { 823 result.push({ label: options[i], value: i }); 824 } 825 826 return result; 827}); 828
7 more
- 31 lines in 2 placestypescript254 tokens
- 25 lines in 2 placesrust241 tokens
- 34 lines in 2 placesrust231 tokens
- 21 lines in 2 placesrust212 tokens
- 24 lines in 2 placesrust193 tokens
- 12 lines in 3 placesrust96 tokens
- 14 lines in 3 placesrust93 tokens
Largest clones over all files, tests and data included
- 26 lines in 9 placesbashdocs and examples88 tokensREADME.md:171–196i18n/README.de.md:168–193i18n/README.es.md:168–193i18n/README.fr.md:168–193i18n/README.ja.md:168–193and 4 more
171git clone --recursive https://github.com/julyx10/lap.git 172cd lap 173git submodule update --init --recursive 174cargo install tauri-cli --version "^2.0.0" --locked 175./scripts/download_models.sh # Windows: .\scripts\download_models.ps1 176./scripts/download_ffmpeg_sidecar.sh # Windows: .\scripts\download_ffmpeg_sidecar.ps1 177cd src-vite && pnpm install && cd .. 178cargo tauri dev 179``` 180First 10 of 26 lines.
- 65 lines in 2 placesyamldata files448 tokens
257 windows-${{ matrix.arch }}-cargo-pr- 258 259- name: Install frontend dependencies 260 working-directory: src-vite 261 run: pnpm install --frozen-lockfile 262 263- name: Cache AI Models 264 id: cache-ai-models 265 uses: actions/cache@v4 266 with:First 10 of 65 lines.
- 9 lines in 6 placesmarkdowntranslations86 tokensi18n/README.de.md:4–12i18n/README.fr.md:4–12i18n/README.ja.md:4–12i18n/README.ko.md:4–12i18n/README.pt.md:4–12and 1 more
4 <h3>Open-Source-Desktop-Fotomanager für macOS, Windows und Linux.</h3> 5 <p> 6 <a href="https://github.com/julyx10/lap/releases"><img src="https://img.shields.io/github/v/release/julyx10/lap" alt="GitHub release"></a> 7 <a href="https://github.com/julyx10/lap/releases"><img src="https://img.shields.io/github/downloads/julyx10/lap/total" alt="GitHub all releases"></a> 8 <a href="https://github.com/julyx10/lap/stargazers"><img src="https://img.shields.io/github/stars/julyx10/lap" alt="GitHub stars"></a> 9 </p> 10</div> 11 12[English](../README.md) | Deutsch | [Français](README.fr.md) | [Español](README.es.md) | [Português](README.pt.md) | [Русский](README.ru.md) | [简体中文](README.zh…4 <h3>Gestionnaire de photos de bureau open source pour macOS, Windows et Linux.</h3> 5 <p> 6 <a href="https://github.com/julyx10/lap/releases"><img src="https://img.shields.io/github/v/release/julyx10/lap" alt="GitHub release"></a> 7 <a href="https://github.com/julyx10/lap/releases"><img src="https://img.shields.io/github/downloads/julyx10/lap/total" alt="GitHub all releases"></a> 8 <a href="https://github.com/julyx10/lap/stargazers"><img src="https://img.shields.io/github/stars/julyx10/lap" alt="GitHub stars"></a> 9 </p> 10</div> 11 12[English](../README.md) | [Deutsch](README.de.md) | Français | [Español](README.es.md) | [Português](README.pt.md) | [Русский](README.ru.md) | [简体中文](README.zh… - 49 lines in 2 placesyamldata files375 tokens
- 15 lines in 3 placesrust172 tokens
By format, code only
| Format | Files | Lines | Clones | Duplicated lines | Duplication |
|---|---|---|---|---|---|
| rust | 29 | 32,537 | 140 | 1,507 | 4.63% |
| typescript | 69 | 30,559 | 71 | 735 | 2.41% |
| html | 57 | 5,763 | 6 | 64 | 1.11% |
| javascript | 20 | 4,920 | 4 | 37 | 0.75% |
| cpp | 2 | 530 | 1 | 8 | 1.51% |
| css | 8 | 325 | 1 | 6 | 1.85% |
| objectivec | 1 | 92 | 1 | 6 | 6.52% |
| vue | 61 | 42,793 | 0 | 0 | 0% |
| bash | 12 | 984 | 0 | 0 | 0% |
| perl | 1 | 174 | 0 | 0 | 0% |
By format, all files
| Format | Files | Lines | Clones | Duplicated lines | Duplication |
|---|---|---|---|---|---|
| rust | 29 | 32,537 | 140 | 1,507 | 4.63% |
| typescript | 71 | 30,647 | 71 | 735 | 2.4% |
| yaml | 6 | 1,389 | 22 | 366 | 26.35% |
| markdown | 39 | 3,787 | 11 | 85 | 2.24% |
| bash | 21 | 1,227 | 8 | 72 | 5.87% |
| html | 58 | 5,778 | 6 | 64 | 1.11% |
| javascript | 20 | 4,920 | 4 | 37 | 0.75% |
| json | 15 | 14,964 | 1 | 33 | 0.22% |
| markup | 119 | 1,052 | 1 | 10 | 0.95% |
| css | 11 | 618 | 1 | 6 | 0.97% |
Trending appearances
| Day | Rank | Stars | Files | Lines | Clones | All files | Code | Health | Commit |
|---|---|---|---|---|---|---|---|---|---|
| Sep 25, 2026 | #9 | 2,929 (+122) | 459 | 140,940 | 267 | 2.08% | 1.99% | C 59.4 | 69a1633 |
Want this for your own project? Install jscpd and run jscpd ., or measure it the way the baselines were measured.