# Python
__pycache__/
*.py[cod]
*.egg-info/
dist/
build/
.eggs/
*.egg
.venv/
venv/

# Node
node_modules/
frontend/dist/
# Isolated gate-build output: building straight into dist/ EPERMs against
# the running local stand's open file handles, so gate builds target
# dist-gate/ and get copied over dist/ afterwards.
frontend/dist-gate/
# The same output under the other names it has been written to. dist-gate/
# above only ever matched the hyphenated spelling, so these three sat
# untracked and unignored at about 676 MB between them, which is exactly the
# size of accident a single `git add -A` in this tree would commit.
frontend/distgate/
frontend/distlead/
frontend/dist_*_backup/
# Scratch output from one-off measurement runs.
frontend/esb.err
slot_census_out.txt

# IDE
.vscode/
.idea/
*.swp
*.swo

# OS
.DS_Store
Thumbs.db

# Environment
.env
.env.local
.env.production
# The three lines above name suffixes somebody thought of. Any other one, a
# .env.staging or a .env.dev or a prod.env copied off a server, was tracked as
# ordinary source in a public repository. Name the shape instead: *.env catches
# a name ending in .env, .env.* catches any suffix after .env.
#
# The negation is load-bearing, do not delete it. .env.* DOES match
# .env.example, and the three tracked template files (.env.example,
# backend/.env.example, deploy/docker/.env.example) are the only thing keeping
# it from swallowing them. Verified with git check-ignore on all three.
*.env
.env.*
!.env.example

# Two files the running application writes, both holding live secrets: the
# generated demo passwords from app/main.py _persist_demo_credentials, and the
# persisted JWT signing secret from app/config.py. Both default to a directory
# outside the checkout (OE_CLI_DATA_DIR, else ~/.openestimator), so this is not
# covering a live leak. It is the guard for a data directory pointed at the
# working tree, which is a plausible dev or container misconfiguration and
# would otherwise put a signing secret into a commit. Unanchored on purpose:
# the data directory can be at any depth.
.demo_credentials.json
.jwt-secret

# Database
*.db
*.db-shm
*.db-wal
*.sqlite3
openestimate.db*

# Docker volumes
pg_data/
minio_data/
qdrant_data/

# Testing
htmlcov/
.coverage
coverage.xml
.pytest_cache/
frontend/test-results/
frontend/e2e-results/
frontend/e2e/v1.9/.auth-token.txt
frontend/e2e/v1.9/.auth-state.json
*.trace.zip
frontend/video-output/
.tests-artifacts/
frontend/playwright.video.config.ts
frontend/e2e/_*.spec.ts
frontend/e2e/*-diagnostic.spec.ts

# New Playwright E2E harness (tests/e2e/) — generated artefacts only
frontend/qa-report/
frontend/qa-screenshots/
frontend/qa-output/
frontend/qa-results.json
frontend/playwright/.auth/
frontend/test-results/
qa-report/
qa-screenshots/
qa-output/
playwright/.auth/
test-results/

# Backend dev/debug artefacts, QA scratch and runtime data are ignored in
# backend/.gitignore, which is the Python project root. A pattern written here
# as backend/... is inert for the wheel build: hatchling matches repo-root
# patterns against paths relative to backend/, so it looks for backend/backend/.

# Build
*.tar.gz
*.whl
frontend/stats.html

# Logs
*.log
logs/

# Process id files a dev or build script leaves behind. `frontend/build.pid`
# outlived its build and sat untracked at the top of the tree, which is the
# shape of file a wide `git add` sweeps into somebody else's commit.
*.pid

# Generated
# backend/locales/ — kept tracked: stub locales ship with the wheel,
# auto-generation now happens on top of tracked baselines so new
# langs added in source DON'T silently drop out of releases.
i18n-audit/
translation_keys.txt

# Per-tenant runtime data — uploads, processed BIM blobs, generated
# exports, debug artifacts. Never committed; lives only on the host.
data/bim/
data/uploads/
data/exports/
data/cwicr/cache/
data/approvals/
data/transmittals/
data/geo_hub/
data/tilesets/
data/reports/
data/takeoff_documents/
data/dwg_uploads/
data/dwg_entities/
data/dwg_thumbnails/
data/pointcloud/
frontend/debug-bim/

# MCP artifacts
.mcp.json

# The agent working notes. Local only, and the only thing that kept them out
# of the repo until now was .git/info/exclude, which is per-clone and does not
# survive a fresh clone. .claude/ also holds credentials (pypi-api-token.txt,
# token.txt, _pat.txt) beside the notes, so a pathless add there costs more
# than an embarrassing document. Nothing under .claude/ is tracked today, so
# the blanket pattern changes nothing; if we ever want to ship part of it,
# say .claude/skills/, this needs a negation rather than a wider net.
# marketing-site/CLAUDE.md needs no line here: /marketing-site/ below
# already ignores that whole tree. It is in the hygiene denylist instead,
# which is the half that still applies if one is ever force-added.
.claude/
CLAUDE-DASHBOARDS.md
AGENTS.md

# Internal-only files: planning, strategy, QA artifacts, audits and runbooks.
# Kept local, never published. Enforced by scripts/check_repo_hygiene.py at
# commit, CI and build time. If you keep one of these locally it stays
# untracked; do not force-add it.
/R[0-9]*_*REPORT.md
/ISSUE_*_HANDOVER.md
/_handover_dossiers/
/docs/strategy/
/docs/qa/
/docs/postgres-migration/
/docs/roadmap/
/docs/handover/
/docs/initiative-ai-estimator/
/docs/RUNBOOK.md
/docs/MASTER_PLAN*.md
/docs/SECURITY_AUDIT*.md
/docs/I18N_AUDIT*.md
/docs/ROADMAP_v*.md
/docs/MONEY_FLOAT*.md
/docs/validation_report.md
/qa/
/scripts/*_report.json
/scripts/i18n_coverage_report.txt
**/__audit_report.md
**/*UI_FLOWS.html
.playwright-mcp/

# TS incremental build cache
**/tsconfig.tsbuildinfo

# QA / Dev artifacts
screenshots/
!docs/screenshots/
# qa/screenshots/ holds the source for the route-grid screenshot suite
# (full-app.spec.ts + playwright.config.ts + README.md). Output PNGs go
# to qa-report/screenshots/<date>/ which is still ignored.
!qa/screenshots/
qa/screenshots/_pw_artifacts/
qa-tests/
ux-review/
QA_*.md
UX_*.md
# Curated QA docs committed deliberately — opt-in exceptions to the above ignores.
!docs/qa/UX_WEAKNESSES_AUDIT.md
!docs/strategy/UX_*.md
TESTING_PLAN.md
TAKEOFF_TESTING_PLAN.md
IMPROVEMENTS_TODO.md
AUDIT_*.md
REVIEW_PROGRESS.md
test-screenshots/

# Dev screenshots & images
*.png
*.jpeg
*.jpg
# Desktop (Tauri) app icons are real source, not dev screenshots
!desktop/src-tauri/icons/**/*.png
!frontend/public/favicon.png
!frontend/public/logo.png
# Public brand assets ship in the wheel (About page founder avatar, book
# cover, logo). The global *.png ignore above kept these untracked, so CI
# built the frontend without them and a fresh install served the SPA
# index.html in their place - the founder avatar rendered as a broken image.
!frontend/public/brand/*.png
# Contributor avatars on the About page thank-you wall are shipped assets too
!frontend/public/contributors/*.png
!docs/screenshots/*.png
!docs/screenshots/*.jpg
!docs/screenshots/*.jpeg
!docs/qa/**/*.png
!docs/qa/**/*.jpg
!docs/qa/**/*.jpeg
!frontend/public/og-image.png
!frontend/public/*.jpg
!frontend/public/*.jpeg
# Partner-pack company logos are real shipped assets, not dev screenshots
!packs/**/logo.png

# LanceDB local data
lancedb_data/
*.lance

# Cached data
*.parquet
.openestimator/

# Desktop build
desktop/dist/
desktop/build/
desktop/src-tauri/target/
desktop/src-tauri/binaries/

# Backup files
*.backup.*

# Local-only working state (not for commit)
tmp/

# How-it-works translation pipeline scratch (regenerable inputs; the
# per-locale frontend/src/app/locales/*.ts are the committed source of truth).
frontend/scripts/.howto-i18n/

# Smoke-sweep E2E run artefacts (regenerable test output, not source).
frontend/qa-smoke/
frontend/qa-smoke-report/
frontend/*.log.err
frontend/*.log.out
qa-tests/v275-probe/shots*/
i18n_audit_report.md
qa-report/

# Heavy sample data — fetched on demand, not committed
data/bim/
docs/media/*.mp4

# Re-ingest rollback backups (snapshots of a single BIM model's prior
# state, captured by scripts/reingest_bim_model.py for safe rollback).
# Large, transient, not source.
data/reingest_backup_*.json

# Generated license inventories — attached to GH Releases, not committed
/NOTICE.backend.json
/NOTICE.frontend.json

# Deep-QA sweep working artifacts (progress + per-module findings; durable on disk, not committed)
qa-sweep/

# QA wave working dir: audit reports, walk/crawl probes, one-shot i18n scripts,
# pr-body drafts and a local token file. Internal only, never published
# (constraint #9). Also in the hygiene denylist as a second guard.
qa-wave/

# Persona testing machine: company/role/region personas, Playwright runner,
# screenshots, assertions, improvement-finder output. Internal only, never
# published (constraint #9). Also in the hygiene denylist as a second guard.
qa-personas/

# Scratch/debug artifacts (never commit)
__diag.txt
_ddltest.py
_verify_out.txt
/zzqacopy.txt
/ddl_echo.txt
/qa_verify_out.txt
/__qa_snippet.txt

# Embedded-Postgres (pixeltable-pgserver) data dirs — never commit
.smoke_pgdata/
**/test_pgdata/

# Ad-hoc QA scratch output (never commit)
_qa_tmp/

# --- session scratch / scan dumps / probe scripts (not product source) ---
/oe_*.txt
/oe_openapi.json
/d5_*.txt
/_audit_d3.txt
/_d3_rawsql.txt
/_scan_*.txt
/qa_*.txt
/qa_*.py
/qa_out.txt
/qa_sweep.py
/_ci_*.txt
/_ci_checks*.json
/_fe_ci_log.txt
/_open_issues.json
/_tok.json
/_tok.txt
/closed_prs.json
/c_1*.json
/_i18n_*.mjs
/_pdf_font_wire.workflow.js
/_wheel*.sh
/_ws*.sh
/_pytest_smoke.sh
/_wave1_verify.sh
/HANDOVER_NEW_AGENT.md
/_deploy642/
/_dl_build/
/_i18n_gaps/
/_pr_review/
frontend/_*.cjs
frontend/_*.mjs
frontend/_qa_b3dm.bin
frontend/test-results-e2e-clean/
qa/screenshots/_pw_artifacts_*
docs/postgres-migration/*.txt
docs/postgres-migration/*.json
docs/postgres-migration/*.diff
docs/strategy/improvement-2026-06/_*.txt
/_wheelboot_health.json
data/connectors/

# Recurring session scratch (QA temp output + i18n build/merge tooling)
/_qa_tmp_*
/_i18n_*.py
/_i18n_*.js
/_i18n_*.json
/_i18n_new_*.txt
/_qa_tsc_out.txt

frontend/_qa_tmp_*
frontend/tsc_result.txt
frontend/tsc_out.txt
frontend/_final_tsc.txt
frontend/qa-*.mjs

# Transient i18n debt dumps and one-off translation backfill scripts (mirror kept
# integration strings; untracked to keep brand names out of the repo)
scripts/_mn_*.json
scripts/_mn_gaps_dump.txt
scripts/_visible_gap.json
scripts/_categorize_mixed.py
scripts/_dump_heavily.py
scripts/_find_mixed.py
scripts/_top_leaked_words.py
scripts/translate_mn_*.py

# Session-local scratch, repro snapshots and secrets (never commit)
/.ci_latest_run
/.oe_token.txt
/.oe_projects.txt
/_projects.json
/_m_*.json
/_backend_restart.*
/tmp_rvt_repro*.py
frontend/_qa/
frontend/scripts/_apply_translations.cjs
frontend/scripts/_dupcheck.cjs
frontend/scripts/_extract_missing_keys.cjs
frontend/scripts/_finalize_i18n.sh
frontend/scripts/_i18n_stage2_state.cjs
frontend/scripts/_stage2_tx/
frontend/scripts/_validate_out.cjs
frontend/scripts/_vite.out
# Session-throwaway Playwright walks, verify/debug probes and one-shot i18n
# key generators. Internal only, kept local (constraint #9). Glob-scoped so it
# never touches tracked helpers like _stream-a-test.mjs.
frontend/scripts/_walk_*.mjs
frontend/scripts/_verify-*.mjs
frontend/scripts/_verify_*.mjs
frontend/scripts/_debug-*.mjs
frontend/scripts/_workflow-walk.mjs
frontend/scripts/_shot-*.mjs
frontend/scripts/_import-map-*.mjs
frontend/scripts/_i18n_*.py

# --- Cost-base (CWICR) working artifacts: local only, never publish ---
# The multi-country cost-base build pipeline emits large spreadsheets, probe
# dumps and internal notes into the repo root and a couple of working trees.
# They are data-engineering scratch, not product source (real catalogs live
# under data/catalog/, real parquets are handled elsewhere). Constraint #9:
# these must never reach the repo or a build. Root-anchored so they cannot
# shadow tracked files under data/, marketing-site/, backend/ or docs/.
/WORLD_COST_BASES/
/cn_regional_price_variants/
/_bug*_data_*/
# Country cost-base spreadsheets and CSV dumps are experiment outputs.
/*.xlsx
/*.csv
~$*.xlsx
# Internal country reports, plans, feasibility notes and indexes.
/*_REPORT.md
/*_PLAN.md
/*_INDEX.md
/*_FEASIBILITY.md
/TURKEY_*.md
/turkey_columns_answer.md
# Probe / debug dumps and one-off scratch scripts left at the repo root.
/_costs*.json
/_health.json
/_openapi.json
/_tok*.json
/atoe.bin
/nul
/translate_*.py
# Pre-redesign backups (the existing *.backup.* rule misses the .bak suffix).
*.pre-redesign.bak

# --- Provenance / watermark tooling: local only, never publish ---
# The watermark generator, its registry and the integrity verifier document
# the covert marker scheme, so they stay local and out of the public repo
# (constraint #9). The markers themselves remain planted in shipped source;
# only the tooling that explains them is withheld.
/tools/watermark/
/scripts/integrity_check.py

# --- Internal working notes: local only, never publish (constraint #9) ---
# Underscore-prefixed markdown / text files anywhere in the tree are scratch:
# agent handoffs, audit residue, a11y sweeps, planning notes, per-issue reply
# drafts. They must never be tracked or ship in a build. Kept out of git here;
# scripts/check_repo_hygiene.py and the wheel exclude enforce the same rule.
**/_*.md
**/_*.txt

# --- Public website: never in the product repository (constraint #9) ---
# marketing-site and the archived website-marketing tree are deployed on their
# own and the live host is the source of truth. Tracking them here produced a
# second copy that drifted from what visitors actually see.
/marketing-site/
/website-marketing/

# Documentation build helpers: internal tooling, not for readers of the repo.
/docs/expand_docs.py
/docs/expand_docs2.py

# Session working directory: translation intermediates, audit dumps and one-off
# scripts. Local only, and it holds source-language drafts we do not publish.
/scratchpad/
# The same material, written next to the directory rather than into it. A
# directory pattern does not cover a sibling file, and sixteen of these had
# accumulated in the root before anyone noticed, none of them ignored. They are
# key censuses, duplicate-key dumps and build logs, so the cost of one landing
# in a commit is an unreadable diff rather than a leak, but the reason they are
# untracked is that nothing reads them twice.
/scratchpad_*
# The same material again, under two names the patterns above do not reach: a
# leading underscore instead of a leading slash-word, and a dotted directory
# inside backend/. Both hold the `sitecustomize.py` shim that unwedges a local
# interpreter plus one-off key-insertion scripts, and both were sitting
# untracked and unignored, which is the state where a single `git add -A`
# commits them. Ignored rather than deleted: the shim is still load-bearing
# locally. The backend one, `.scratchpad/`, is ignored in backend/.gitignore,
# because a line written here as `backend/...` does nothing for the wheel build.
/_scratchpad_*
# Module inventory dump: regenerated on demand for the marketing honeycomb,
# not an input to anything in this repository.
/modules.json
# A build script's HEAD marker: one commit SHA, written so a later step can tell
# what it built. It says nothing a reader of this repository needs and it changes
# on every build, so a commit that picks it up is noise that conflicts with every
# other commit that picks it up.
/build_head.txt

# --- Personal data: never in this repository, which is public ---
# The marketing host captures signups and enquiries as JSONL under /root/clawd,
# and an export built for a mailing tool is a CSV of real people. A copy of one
# of those files, or an export from it, must not be committable even by
# accident. scripts/check_repo_hygiene.py blocks the same names, so a file that
# slips past this list still fails the gate. Keep the two in step.
demo-registrations*.jsonl
demo-tokens*.json
newsletter-subscribers*.jsonl
license-requests*.jsonl
partner-applications*.jsonl
contact-requests*.jsonl
email-delivery-failures*.jsonl
*subscribers*.csv
*newsletter*.csv
*email-export*.csv
*contacts-export*.csv
*leads-export*.csv
*audience*.csv

# Locale bootstrap batches, see scripts/i18n_new_locale.py
.i18n-work/

# SCALE vendor snapshot: preserve files tracked by the original repository.
/data/geo_hub/**
/frontend/qa-tests/**
!/.env.example
!/backend/.env.example
!/frontend/_screenshot_audit.mjs
!/frontend/_screenshot_dataflow.mjs
!/frontend/_screenshot_focus.mjs
!/frontend/_screenshot_marketing.mjs
!/scripts/translate_mn_pass2.py
!/scripts/translate_mn_pass3.py
!/scripts/translate_mn_pass5_long.py
!/scripts/translate_mn_pass6_more_long.py
!/scripts/translate_mn_pass7_fixes.py
!/scripts/translate_mn_pass8_final.py
!/scripts/translate_mn_pass9.py
!/data/geo_hub/
!/deploy/docker/.env.example
!/docs/screenshots/02-dashboard.png
!/docs/screenshots/03-projects.png
!/docs/screenshots/04-boq-list.png
!/docs/screenshots/05-costs.png
!/docs/screenshots/06-schedule.png
!/docs/screenshots/07-ai-estimate.png
!/docs/screenshots/08-settings.png
!/docs/screenshots/09-about.png
!/docs/screenshots/architecture-pipeline.jpg
!/docs/screenshots/banner.png
!/docs/screenshots/feature-accommodation.jpg
!/docs/screenshots/feature-boq.jpg
!/docs/screenshots/feature-daily-diary.jpg
!/docs/screenshots/feature-databases.jpg
!/docs/screenshots/feature-erp-chat.jpg
!/docs/screenshots/feature-geo-hub.jpg
!/docs/screenshots/feature-markups.jpg
!/docs/screenshots/feature-punch-list.jpg
!/docs/screenshots/feature-takeoff-ai.jpg
!/docs/screenshots/feature-validation.jpg
!/docs/screenshots/hero-overview.png
!/frontend/qa-tests/
!/frontend/qa-tests/ux-acceptance.mjs
!/assets/email/landshut-thumbs/75sjLEjXiBc.jpg
!/assets/email/landshut-thumbs/G0a5pEiXaS4.jpg
!/assets/email/landshut-thumbs/IM9hK6kCZCs.jpg
!/assets/email/landshut-thumbs/KI6e3s7XScY.jpg
!/assets/email/landshut-thumbs/LP-CZOhu6OA.jpg
!/assets/email/landshut-thumbs/OJ1FMzwY3FM.jpg
!/assets/email/landshut-thumbs/T3FBggAeFJ4.jpg
!/assets/email/landshut-thumbs/YEk8F3W28po.jpg
!/assets/email/landshut-thumbs/bGUpude30wc.jpg
!/assets/email/landshut-thumbs/qFGKRIXHM8w.jpg
!/assets/email/landshut-thumbs/tZEdPehNE6Q.jpg
!/assets/email/landshut-thumbs/uBhNqXw2dm0.jpg
!/data/geo_hub/overlays/
!/desktop/src-tauri/icons/128x128.png
!/desktop/src-tauri/icons/128x128@2x.png
!/desktop/src-tauri/icons/32x32.png
!/desktop/src-tauri/icons/64x64.png
!/desktop/src-tauri/icons/Square107x107Logo.png
!/desktop/src-tauri/icons/Square142x142Logo.png
!/desktop/src-tauri/icons/Square150x150Logo.png
!/desktop/src-tauri/icons/Square284x284Logo.png
!/desktop/src-tauri/icons/Square30x30Logo.png
!/desktop/src-tauri/icons/Square310x310Logo.png
!/desktop/src-tauri/icons/Square44x44Logo.png
!/desktop/src-tauri/icons/Square71x71Logo.png
!/desktop/src-tauri/icons/Square89x89Logo.png
!/desktop/src-tauri/icons/StoreLogo.png
!/desktop/src-tauri/icons/icon.png
!/docs/screenshots/gallery/ai-estimate.jpg
!/docs/screenshots/gallery/analytics.jpg
!/docs/screenshots/gallery/bim-3d-viewer.jpg
!/docs/screenshots/gallery/boq-editor.jpg
!/docs/screenshots/gallery/clash-detection.jpg
!/docs/screenshots/gallery/cost-database.jpg
!/docs/screenshots/gallery/finance.jpg
!/docs/screenshots/gallery/pdf-takeoff.jpg
!/docs/screenshots/gallery/portfolio-dashboard.jpg
!/docs/screenshots/gallery/projects.jpg
!/docs/screenshots/gallery/validation.jpg
!/frontend/public/brand/artem-boiko-avatar.png
!/frontend/public/brand/ddc-book.png
!/frontend/public/brand/ddc-logo.png
!/frontend/public/contributors/ChristianSantoro.png
!/frontend/public/contributors/DevpratikDevelopers.png
!/frontend/public/contributors/JORBDAAG.png
!/frontend/public/contributors/MeCode4.png
!/frontend/public/contributors/Mourdi59.png
!/frontend/public/contributors/Nebulasunrise-OG.png
!/frontend/public/contributors/Tigercatman.png
!/frontend/public/contributors/alikhalilx.png
!/frontend/public/contributors/arvildev.png
!/frontend/public/contributors/braedonsaunders.png
!/frontend/public/contributors/bvisible.png
!/frontend/public/contributors/candcconsulting.png
!/frontend/public/contributors/consigcody94.png
!/frontend/public/contributors/darkleono.png
!/frontend/public/contributors/expalex1507.png
!/frontend/public/contributors/gbatkhuyag.png
!/frontend/public/contributors/hanisedawy.png
!/frontend/public/contributors/hungdd84.png
!/frontend/public/contributors/j209.png
!/frontend/public/contributors/jehadbaniodeh.png
!/frontend/public/contributors/jyloveqq.png
!/frontend/public/contributors/leval907.png
!/frontend/public/contributors/maher00746.png
!/frontend/public/contributors/migfrazao2003.png
!/frontend/public/contributors/mkozjak.png
!/frontend/public/contributors/mohandshamada.png
!/frontend/public/contributors/online14230.png
!/frontend/public/contributors/rashidengg-arch.png
!/frontend/public/contributors/rjohny55.png
!/frontend/public/contributors/rrvizuete.png
!/frontend/public/contributors/sergeilapp.png
!/frontend/public/contributors/serviteur.png
!/frontend/public/contributors/skeltic-wq.png
!/frontend/public/contributors/skolodi.png
!/frontend/public/contributors/thiemotorres.png
!/data/geo_hub/overlays/0cefc29a-4e20-4287-be24-8ea0c2e4343b/
!/data/geo_hub/overlays/0cefc29a-4e20-4287-be24-8ea0c2e4343b/1b609f4d2144-source-sample-site-plan.pdf
!/data/geo_hub/overlays/0cefc29a-4e20-4287-be24-8ea0c2e4343b/8b540f8520c7-source-sample-site-plan.pdf
!/data/geo_hub/overlays/0cefc29a-4e20-4287-be24-8ea0c2e4343b/c475f29fabbf-source-sample-site-plan.pdf
!/desktop/src-tauri/icons/ios/AppIcon-20x20@1x.png
!/desktop/src-tauri/icons/ios/AppIcon-20x20@2x-1.png
!/desktop/src-tauri/icons/ios/AppIcon-20x20@2x.png
!/desktop/src-tauri/icons/ios/AppIcon-20x20@3x.png
!/desktop/src-tauri/icons/ios/AppIcon-29x29@1x.png
!/desktop/src-tauri/icons/ios/AppIcon-29x29@2x-1.png
!/desktop/src-tauri/icons/ios/AppIcon-29x29@2x.png
!/desktop/src-tauri/icons/ios/AppIcon-29x29@3x.png
!/desktop/src-tauri/icons/ios/AppIcon-40x40@1x.png
!/desktop/src-tauri/icons/ios/AppIcon-40x40@2x-1.png
!/desktop/src-tauri/icons/ios/AppIcon-40x40@2x.png
!/desktop/src-tauri/icons/ios/AppIcon-40x40@3x.png
!/desktop/src-tauri/icons/ios/AppIcon-512@2x.png
!/desktop/src-tauri/icons/ios/AppIcon-60x60@2x.png
!/desktop/src-tauri/icons/ios/AppIcon-60x60@3x.png
!/desktop/src-tauri/icons/ios/AppIcon-76x76@1x.png
!/desktop/src-tauri/icons/ios/AppIcon-76x76@2x.png
!/desktop/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png
!/packs/batimatech-ca/src/openconstructionerp_batimatech_ca/logo.png
!/packs/bimhessen-de/src/openconstructionerp_bimhessen_de/logo.png
!/packs/doker-formwork/src/openconstructionerp_doker_formwork/logo.png
!/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png
!/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png
!/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png
!/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png
!/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png
!/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png
!/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png
!/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png
!/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png
!/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png
!/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png
!/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png
!/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png
!/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png
!/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png
