Skip to content

Commit f687248

Browse files
bitardevclaude
andcommitted
feat: initial public release of Miqāt v1.0
Local-first desktop Athan and prayer-time app for Windows. Worldwide prayer times via the adhan library, beautiful Athan player with custom MP3 upload, Qibla direction, Friday companion (Surah Al-Kahf reminder, Salawat counter, hour of acceptance), Hijri calendar, and a kinetic brand identity. EN/FR/AR with full RTL. No tracking, no account, no ads. MIT licensed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
0 parents  commit f687248

213 files changed

Lines changed: 49742 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env.example

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Miqāt — example environment variables.
2+
#
3+
# The desktop app itself runs entirely from the bundled config (DB path
4+
# is derived at runtime from `app.getPath('userData')`, server port is
5+
# auto-discovered between 3001-3010). There are no secrets the app
6+
# needs to function locally, so an empty .env is fine for development.
7+
#
8+
# Variables below are only relevant for specific test/build flows.
9+
10+
# --- Server tests ---
11+
# Some Jest specs hit the live Aladhan API to verify prayer-time parity.
12+
# They're skipped by default; set this to enable them.
13+
# ONLINE=1
14+
15+
# --- Electron / electron-builder packaging ---
16+
# Required when running `npm run release` to publish to GitHub Releases.
17+
# Personal access token with `repo` scope. NEVER commit a real value.
18+
# GH_TOKEN=
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
name: 🐛 Bug report
2+
description: Something's broken in the desktop app
3+
title: "[Bug] "
4+
labels: ["bug"]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
Thanks for taking the time to report a bug. To help us reproduce, please include the **diagnostic snapshot** from the app (Settings → Diagnostics → "Copy diagnostic snapshot") and paste it below — it captures your settings, location, prayer-time cache state, and version info, all without any personal data leaving your machine until you paste it.
10+
11+
- type: input
12+
id: version
13+
attributes:
14+
label: Miqāt version
15+
description: Find it in Help dialog or About menu.
16+
placeholder: "1.0.0"
17+
validations:
18+
required: true
19+
20+
- type: input
21+
id: os
22+
attributes:
23+
label: Operating system + version
24+
placeholder: "Windows 11 23H2"
25+
validations:
26+
required: true
27+
28+
- type: textarea
29+
id: description
30+
attributes:
31+
label: What happened?
32+
description: A clear, short description of the bug.
33+
placeholder: "The Athan didn't fire at Maghrib on 2026-04-29."
34+
validations:
35+
required: true
36+
37+
- type: textarea
38+
id: steps
39+
attributes:
40+
label: Steps to reproduce
41+
placeholder: |
42+
1. Set location to ...
43+
2. Open the calendar dialog
44+
3. Notice that ...
45+
validations:
46+
required: true
47+
48+
- type: textarea
49+
id: expected
50+
attributes:
51+
label: What did you expect?
52+
placeholder: "The Athan should have played at the displayed Maghrib time."
53+
validations:
54+
required: true
55+
56+
- type: textarea
57+
id: snapshot
58+
attributes:
59+
label: Diagnostic snapshot
60+
description: Settings → Diagnostics → "Copy diagnostic snapshot", then paste here.
61+
render: json
62+
63+
- type: textarea
64+
id: logs
65+
attributes:
66+
label: Relevant log lines
67+
description: From `%APPDATA%/Miqāt/logs/main.log` (Windows). The last 50 lines around the issue are usually enough.
68+
render: text
69+
70+
- type: checkboxes
71+
id: confirm
72+
attributes:
73+
label: Confirmations
74+
options:
75+
- label: I searched [existing issues](https://github.com/bdevgroup/miqaat/issues) for this bug.
76+
required: true
77+
- label: I'm running the latest version (or the bug is reproducible on the latest).
78+
required: false
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
name: 💡 Feature request
2+
description: Suggest something Miqāt should do
3+
title: "[Feature] "
4+
labels: ["enhancement"]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
Thanks for the suggestion. The clearest feature requests describe the **user problem** first — once that's understood, the right solution often differs from what was originally proposed.
10+
11+
- type: textarea
12+
id: problem
13+
attributes:
14+
label: What problem are you trying to solve?
15+
placeholder: "I keep missing Fajr because the alarm sound is too soft."
16+
validations:
17+
required: true
18+
19+
- type: textarea
20+
id: proposal
21+
attributes:
22+
label: Proposed solution (optional)
23+
description: How you'd imagine the fix. Skip if you're unsure — that's fine.
24+
25+
- type: textarea
26+
id: context
27+
attributes:
28+
label: Context
29+
description: Anything else relevant — your environment, related features, links to similar implementations elsewhere.
30+
31+
- type: checkboxes
32+
id: confirm
33+
attributes:
34+
label: Confirmations
35+
options:
36+
- label: I searched [existing issues](https://github.com/bdevgroup/miqaat/issues?q=is%3Aissue+label%3Aenhancement) and the [roadmap](https://github.com/bdevgroup/miqaat/blob/main/ROADMAP.md).
37+
required: true

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<!--
2+
Thanks for the PR! A few things that help land it faster:
3+
4+
- Small, focused PRs ship faster than big ones.
5+
- Visual changes — please attach a screenshot.
6+
- Translation PRs — confirm you've added every key (English fallback hides missing translations).
7+
- AI-assisted? That's fine — please mention it in the description.
8+
-->
9+
10+
## What does this change?
11+
12+
<!-- One or two sentences. Match the level of a good commit message. -->
13+
14+
## Why?
15+
16+
<!-- The problem this solves. Link to an issue if there is one (closes #123). -->
17+
18+
## How to verify
19+
20+
<!-- Steps a reviewer can run to convince themselves the change works. -->
21+
22+
1.
23+
2.
24+
3.
25+
26+
## Screenshots (visual changes only)
27+
28+
<!-- Drag-and-drop into the editor. Before/after side-by-side is ideal. -->
29+
30+
## Checklist
31+
32+
- [ ] CI is green (lint, test, build)
33+
- [ ] Tested locally end-to-end (not just compiled)
34+
- [ ] Updated docs if behaviour or API changed
35+
- [ ] Added tests if a new code path is non-trivial
36+
- [ ] Translation: keys added to **all** locales in `client/src/i18n/dict.ts` (if applicable)
37+
- [ ] AI assistance disclosed in this description (if applicable)

.github/workflows/ci.yml

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# CI for Miqāt — runs on every PR + every push to main.
2+
# Verifies: install, lint, offline tests, full TS build of all 3
3+
# workspaces (server, client, electron). Does NOT run electron-builder
4+
# (no packaging in CI yet — would need code-signing infrastructure).
5+
#
6+
# Online tests (the 250-case Aladhan parity sweep) are skipped here
7+
# to keep CI deterministic + fast. Run them locally before a release
8+
# with `npm run test:online`.
9+
10+
name: CI
11+
12+
on:
13+
pull_request:
14+
branches: [main]
15+
push:
16+
branches: [main]
17+
18+
# Cancel older runs on the same ref when a new one fires — saves GA minutes.
19+
concurrency:
20+
group: ${{ github.workflow }}-${{ github.ref }}
21+
cancel-in-progress: true
22+
23+
jobs:
24+
build:
25+
name: Lint · Test · Build
26+
runs-on: ubuntu-latest
27+
timeout-minutes: 15
28+
29+
steps:
30+
- name: Checkout
31+
uses: actions/checkout@v4
32+
33+
- name: Setup Node 22
34+
uses: actions/setup-node@v4
35+
with:
36+
node-version: 22
37+
cache: npm
38+
39+
- name: Install dependencies
40+
# `--no-audit --no-fund` keeps logs short; `npm ci` is reproducible
41+
# and respects the committed package-lock.json.
42+
run: npm ci --no-audit --no-fund
43+
44+
- name: Lint
45+
run: npm run lint
46+
47+
- name: Test (offline)
48+
# `npm test` already excludes the online prayer-parity suite via
49+
# --testPathIgnorePatterns. Aladhan isn't reachable from CI without
50+
# network egress allowlisting we don't want to manage.
51+
run: npm test
52+
53+
- name: Build all workspaces
54+
# Server (nest build) → client (vite build) → electron (tsc).
55+
# Electron-builder packaging happens at release time, not here.
56+
run: npm run build

.gitignore

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
node_modules/
2+
dist/
3+
build/
4+
out/
5+
.vite/
6+
*.log
7+
*.tsbuildinfo
8+
.DS_Store
9+
Thumbs.db
10+
.env
11+
.env.local
12+
*.db
13+
*.db-journal
14+
*.db-wal
15+
*.db-shm
16+
electron/dist/
17+
electron/dist-build/
18+
client/dist/
19+
server/dist/
20+
coverage/
21+
.cache/
22+
test-results/
23+
playwright-report/
24+
25+
# Downloaded audio assets — fetched via `npm run fetch:audio`.
26+
# Licenses live in client/public/audio/LICENSES.md (tracked).
27+
client/public/audio/*.mp3
28+
29+
# Server dev artifacts — uploaded custom-reciter MP3s land here when
30+
# running the server outside Electron (the app uses %APPDATA%/Miqāt/
31+
# in production). Always per-user, never tracked.
32+
server/custom-athans/
33+
34+
# Pre-rebrand SQLite leftovers (mothern-athan.*). The active DB is
35+
# miqaat.db, which is also covered by the global *.db rule. Both
36+
# stay local-only.
37+
server/mothern-athan.*
38+
39+
# Private working folder — design exploration HTMLs, raw concept notes,
40+
# original spec markdowns, sample audio fixtures, etc. Anything that
41+
# helps me work locally but doesn't belong in the public repo.
42+
_private/
43+
44+
# Local-only orphan from the landing-site separation. The site lives
45+
# in its own repo now; if a stray landing/ shows up locally, ignore it.
46+
landing/

0 commit comments

Comments
 (0)