diff --git a/public/assets/apps/documents/icon.webp b/public/assets/apps/documents/icon.webp new file mode 100644 index 0000000..a142561 Binary files /dev/null and b/public/assets/apps/documents/icon.webp differ diff --git a/public/assets/apps/documents/screenshot-1.webp b/public/assets/apps/documents/screenshot-1.webp new file mode 100644 index 0000000..ec087c8 Binary files /dev/null and b/public/assets/apps/documents/screenshot-1.webp differ diff --git a/public/assets/apps/documents/screenshot-2.webp b/public/assets/apps/documents/screenshot-2.webp new file mode 100644 index 0000000..f98e7f1 Binary files /dev/null and b/public/assets/apps/documents/screenshot-2.webp differ diff --git a/public/assets/apps/documents/screenshot-3.webp b/public/assets/apps/documents/screenshot-3.webp new file mode 100644 index 0000000..420d1ee Binary files /dev/null and b/public/assets/apps/documents/screenshot-3.webp differ diff --git a/scripts/audit-built-site.mjs b/scripts/audit-built-site.mjs index 4ea5519..20424c8 100644 --- a/scripts/audit-built-site.mjs +++ b/scripts/audit-built-site.mjs @@ -209,9 +209,12 @@ if (JSON.stringify(appDirectories) !== JSON.stringify(releaseSlugs)) { ); } for (const [slug, release] of Object.entries(releaseMetadata.apps)) { - if (!release.sourceVersion || !release.sourceReleaseUrl) { + if (!release.sourceReleaseUrl) { errors.push(`release metadata is incomplete for ${slug}`); } + if (release.sourceKind !== "repository" && !release.sourceVersion) { + errors.push(`release metadata has no version for ${slug}`); + } if (release.sourceKind === "release" && !release.publishedAt) { errors.push(`release metadata has no publication date for ${slug}`); } diff --git a/src/components/PolicyPage.astro b/src/components/PolicyPage.astro index 69e110c..6f08459 100644 --- a/src/components/PolicyPage.astro +++ b/src/components/PolicyPage.astro @@ -13,14 +13,12 @@ type Props = { const { policy, canonicalPath } = Astro.props; const relatedApp = apps.find((app) => app.links.policy === canonicalPath); const isUnlisted = "unlisted" in policy && policy.unlisted; -const policyDetails: PolicyDetails = relatedApp - ? { - privacy: relatedApp.privacy, - dataAccess: relatedApp.dataAccess, - permissionSummary: relatedApp.permissionSummary, - dataLeavingDevice: relatedApp.dataLeavingDevice, - } - : policy.details!; +const policyDetails: PolicyDetails = policy.details ?? { + privacy: relatedApp!.privacy, + dataAccess: relatedApp!.dataAccess, + permissionSummary: relatedApp!.permissionSummary, + dataLeavingDevice: relatedApp!.dataLeavingDevice, +}; --- The Fossify project

Fossify develops open-source Android apps for common phone tasks, - including photos, calendars, files, messages, calls, music, notes, - camera, keyboard, and utilities. + including photos, calendars, files, documents, messages, calls, music, + notes, camera, keyboard, and utilities.

Browse apps diff --git a/src/pages/apps/index.astro b/src/pages/apps/index.astro index dbf4aec..40c9f5c 100644 --- a/src/pages/apps/index.astro +++ b/src/pages/apps/index.astro @@ -6,7 +6,7 @@ import { appCategories, apps } from "../../data/apps"; const categoryCopy: Record = { Media: "Photos, video, recording, and local music playback.", Everyday: "Calendar, notes, typing, time, and home-screen tools.", - Utilities: "File management, calculations, and drawing.", + Utilities: "File and document management, calculations, and drawing.", Communication: "Phone, messages, and contacts for basic communication on the device.", Funding: "Project funding, customization, and shared app settings.", @@ -36,8 +36,8 @@ const grouped = appCategories.map((category) => ({

Apps

Fossify apps

- Android tools for photos, calendars, files, messages, calls, music, - notes, camera, keyboard, and other everyday tasks. + Android tools for photos, calendars, files, documents, messages, + calls, music, notes, camera, keyboard, and other everyday tasks.

{ diff --git a/src/pages/index.astro b/src/pages/index.astro index f98580a..0e7f4b8 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -68,7 +68,7 @@ const structuredData = [

Fossify

Open-source tools for everyday tasks: photos, calendars, files, - messages, calls, music, notes, camera, and more. + documents, messages, calls, music, notes, camera, and more.

Explore apps diff --git a/src/pages/press.astro b/src/pages/press.astro index 02224e3..b0ab65d 100644 --- a/src/pages/press.astro +++ b/src/pages/press.astro @@ -1,13 +1,17 @@ --- import BaseLayout from "../layouts/BaseLayout.astro"; import { apps } from "../data/apps"; +import { releaseEntries } from "../data/release-info"; import { site } from "../data/site"; const shortDescription = "Fossify develops open-source Android apps for common phone tasks. The apps contain no advertising, do not track users, work without a Fossify account, and have public source code and release history on GitHub."; const mediumDescription = - "Fossify is an open-source Android app project covering photos, calendars, files, messages, calls, contacts, music, notes, camera, keyboard, and utilities. The apps request only the permissions needed for their features, contain no advertising, and do not track users. Source code, issues, releases, translations, install links, and app-specific privacy policies are publicly available."; + "Fossify is an open-source Android app project covering photos, calendars, files, documents, messages, calls, contacts, music, notes, camera, keyboard, and utilities. The apps request only the permissions needed for their features, contain no advertising, and do not track users. Source code, issues, releases, translations, install links, and app-specific privacy policies are publicly available."; +const releasedAppCount = apps.filter( + (app) => releaseEntries[app.slug]?.sourceVersion, +).length; ---
-
Released apps
{apps.length}
+
Released apps
{releasedAppCount}
Platform
Android
Source
GitHub
diff --git a/src/styles/global.css b/src/styles/global.css index db8cf57..7884184 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -1155,6 +1155,7 @@ textarea { } .app-title-heading { + max-width: none; margin: 0; }