Below the tech line is already too far down. Someone who has just read what the
app is wants the app next, not the toolkit it is written in.
One line now, as a heading so it reads as a button rather than prose, with the
facts that decide whether to tap it beside it — Android version, size, older
releases, checksum — and the install warning under it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The APK has been in releases/ all along, but nothing on the front page said so,
and the first thing most people want from an app's repository is the app.
A Download section above the fold: the current build as a relative link that
works on any forge, the raw URL spelled out for anywhere the relative one does
not resolve, the checksum to verify it, and a pointer to releases/ for every
earlier version.
It also says plainly that Android will call the developer unknown and ask to
install anyway. That warning is what Android says about every app installed
outside a store, and read cold it looks like the app is unsafe rather than
merely unlisted — better to say so first than to let someone find out and
assume the worst.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The signing key is on this machine now, so 0.4.0 is signed and archived like
every release before it. The certificate is the same one:
CN=Ganjoor for Android, O=anas-rashid, C=PK
SHA-256 d3b5a144b600dd6d9ae8236f0a1bd630767e88d7eaa1573edaadbf8e651fe494
verified against 0.3.0's before archiving, which is the point of checking: a
different key would have forced every existing install to be removed first, and
releases/README.md promises that never happens.
The 0.3.0 row also gets its real commit; it still said HEAD, which stops meaning
anything the moment another release lands on top of it.
metadata/com.ganjoor.android.yml is the recipe F-Droid's build server uses,
kept with the source it describes rather than only in a fork of fdroiddata.
UpdateCheckMode is Tags, so each new tag is picked up without editing it again.
F-Droid signs with their own key, which is why the release build has to succeed
with no keystore present.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Gitea and GitHub each made their own merge commit for the 0.4.0 release branch.
Both have the same tree — the same release, merged twice — so this reconciles
the history and leaves one main again.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Twenty commits since v0.3.0, and the tag still pointed at the old one: nothing
could be published while main declared a version that was already taken.
0.4.0 rather than 0.3.1 — this is not a patch. Tablets and unfolded foldables
read in columns now, the dictionary and the reading settings moved beside the
poem instead of over it, couplets sit in cards and share a line where there is
room, pages fill in where they load, and the design system that describes all of
it lives in design/.
Changelog 6 in all three languages, as F-Droid reads them from fastlane/.
The release APK is not archived in releases/ yet: the signing key is not on this
machine, and every release so far shares one key so that each upgrades the last
in place. Signing and archiving wait for it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The guard added in #3 decides whether the dictionary opens beside the poem or as
a sheet over it, and until now nothing proved it. I tried four times to verify it
by hand and failed every time: reaching it needs a tap landing on the glyphs of
one Persian word inside a SelectionContainer, and adb's synthetic taps either
became a long press and opened the selection menu, or landed between words and
opened the couplet's actions instead. The verses are not exposed to uiautomator
either, so there is nothing to aim at.
The arithmetic behind the rule can be tested even though the gesture cannot, so
it moves into a pure function and gets four cases: a tablet keeps the panel, a
foldable open in portrait does not, a phone never gets it however wide the page
is measured, and the boundary sits exactly at the panel plus the minimum measure
(616dp passes, 615dp does not).
No behaviour changes — this is the same expression, named and covered.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
main has moved on since this branch opened, and most of what it carried has been
answered better there:
- the reading settings no longer need a fallback to the sheet, because they fold
the columns away and take the room that frees (aab8b2e);
- the two panels no longer share a width, because the dictionary is now 216dp
against the settings' 360dp.
Both were dropped: the conflicting files are taken from main as they stand.
What survives is the reason this branch exists. Which container the dictionary
uses is still decided by the width of the *window*, and that is the wrong
question — what matters is what is left of the page once the columns have taken
theirs. On a 700dp foldable that is about 450dp, and a panel beside it leaves
the verse a couple of characters a line. It now opens beside the poem only while
the page keeps 400dp, and falls back to the sheet below that, which covers the
foot of the poem but leaves every line whole.
Recalculated for the narrower panel: a tablet keeps the panel (~900dp page less
216dp leaves 684dp), a foldable in portrait does not (236dp).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Two fixes to the left of the reader.
The dictionary and the reading settings both want that side of the screen, and
opening the second put two panels there at once — or, where there was no longer
room for two, left the dictionary as a sheet in the middle of the page while the
settings sat beside it. Either way the reader is asked to look in two places.
The settings now replace the dictionary; closing them leaves the poem, which is
where the reader was.
The dictionary also no longer takes the settings' full 360dp. It is read against
the line it came from, so the verse should keep the width: 216dp, a little over
half. The settings keep 360dp, which costs nothing — they fold the columns away
and take the room that frees.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
On a book-style foldable held open in portrait — 700dp, inside the 600–839dp
band — tapping a word made the poem unreadable. The panel is a fixed 360dp and
the columns keep their widths, so the page was left about 75dp: the verse broke
to one or two characters a line, and the breadcrumbs and the metre shattered the
same way.
The panel was chosen from the width of the window. That is the wrong question.
What matters is what is left of the page once the columns have taken their room,
so both panels now ask that instead:
- the dictionary opens beside the poem only while the page keeps 400dp;
- reading settings open beside the browser only while it keeps its own 600dp,
below which the panel would squeeze the columns and the poem into less than
the layout is built for.
Where they do not fit, the bottom sheet is used, exactly as on a phone: it
covers the foot of the poem but leaves every line whole. A tablet is unaffected
— verified at 2560x1600 that the panel still opens and the poem still reads.
The two panels now share one width, and the design notes record the rule.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-10-07 18:04:39 +02:00
12 changed files with 200 additions and 7 deletions
@@ -12,7 +12,8 @@ from source and signs with its own key, so these are for direct installation onl
| 0.2.0 | 2 | `d92445f` | Share a poem, couplet or selection; look a word up from any app's selection menu; the optional AI assistant. |
| 0.2.1 | 3 | `ec05989` | Assistant answers in the page rather than over it, a visible chevron for each couplet's actions, and answers remembered so scrolling doesn't re-ask. |
| 0.2.2 | 4 | `d7568d1` | Credits Material Symbols for the glyphs, and states the terms around the optional assistant. |
| 0.3.0 | 5 | `HEAD` | Pin poets to the home screen: three views (pinned, Ganjoor's order, alphabetical), as cards or a list, with a download control on each row. |
| 0.3.0 | 5 | `5d12a1c` | Pin poets to the home screen: three views (pinned, Ganjoor's order, alphabetical), as cards or a list, with a download control on each row. |
| 0.4.0 | 6 | `270c28c` | Columns on tablets and unfolded foldables; the dictionary and reading settings beside the poem rather than over it; couplets in cards, two hemistichs to a line where there is room; skeletons while pages load; a seek bar on recitations. |
## Checksums
@@ -22,6 +23,7 @@ from source and signs with its own key, so these are for direct installation onl
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.