Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
f26f6c4
Add sync settings, sign in, creating and deleting user
Scriptbash Mar 18, 2026
87e5dd7
Improve login errors and add password reset
Scriptbash Mar 19, 2026
a234205
Add last sync time
Scriptbash Mar 20, 2026
525e3f0
Sync journals + background sync
Scriptbash Mar 20, 2026
b5bb2b8
Sync favorites and hidden publications + merge duplicates
Scriptbash Mar 21, 2026
2f27b2e
update tables.json
Scriptbash Mar 21, 2026
a40fdac
Sync favorites/hidden in background
Scriptbash Mar 21, 2026
8bace3b
improve sync info card design
Scriptbash Mar 22, 2026
693509e
Add missing feed filter columns on create + soft delete
Scriptbash Mar 22, 2026
61d3ef7
Sync feed filters
Scriptbash Mar 22, 2026
39f189b
Sync feed filters in background
Scriptbash Mar 22, 2026
7a4ab95
Add missing feed filter columns in pocketbase
Scriptbash Mar 22, 2026
3eb9571
Merge duplicate feed filter
Scriptbash Mar 22, 2026
07278ac
Sync known urls
Scriptbash Mar 22, 2026
e6c31d1
Update pb schema
Scriptbash Mar 22, 2026
85afe4a
Update hosted pocketbase url
Scriptbash Mar 22, 2026
ea2af5c
Use flutter_secure_storage
Scriptbash Mar 22, 2026
6f3129e
Force email verification
Scriptbash Mar 22, 2026
6247e75
Fix db migration
Scriptbash Mar 22, 2026
a8c0c7d
Fix local db creating duplicates + add cleanup in db migration
Scriptbash Mar 24, 2026
09ddbbb
Sync saved queries
Scriptbash Mar 24, 2026
15966dd
Use delta syncing for background syncs
Scriptbash Mar 25, 2026
6260f9c
Add background sync toggle option
Scriptbash Mar 25, 2026
671eb76
Merge branch 'main' into sync
Scriptbash Mar 25, 2026
d8436da
Update privacy policy
Scriptbash Mar 25, 2026
1c6f96c
Add cloud sync docs
Scriptbash Mar 25, 2026
97b164d
Update and cleanup readme
Scriptbash Mar 25, 2026
a50d959
Fix desktop badges
Scriptbash Mar 25, 2026
f18a496
bump version
Scriptbash Mar 25, 2026
a8881b4
Fix inno setup... maybe
Scriptbash Mar 25, 2026
a895bf1
Add missing keychain entitlements
Scriptbash Mar 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 40 additions & 6 deletions PRIVACY.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,45 @@
Wispar is an open-source mobile app that prioritizes user privacy. Our app does not collect any data or access personal information.
# Privacy policy

However, Wispar integrates with external services to enhance functionality. Users should be aware that these services could be collecting information such as IP addresses, device-related data and other data. We encourage users to review the privacy policies of each service for a comprehensive understanding of their data collection practices.
Wispar is an open-source mobile app that prioritizes user privacy. By default, our app does not collect any data or access personal information.

Third-party services used by Wispar:
Wispar does not include any third-party trackers, advertisements, or telemetry (e.g., Google Analytics or Firebase)

Core services:
## Wispar Sync (Optional)

Wispar offers an optional cloud sync feature called **Wispar Sync**. When this feature is enabled, the following data is collected solely for authentication and synchronization purposes:

- Email address
- App data necessary for syncing which includes:
- Article metadata for favorited and hidden publications
- Journal metadata for followed and other journals
- Custom feeds parameters
- Saved search queries
- EZproxy known URLs

This data is **not shared, sold, or used for any other purpose**.

The Wispar Sync server is hosted on a VPS provided by **Hetzner** in Germany.

Users retain full control over their data:

- You can permanently delete your data at any time using the delete cloud account button in the sync settings. While deletion is immediate, your data may persist for up to **7 days** within daily server backups before being permanently overwritten.
- You may also choose to self-host the sync backend, allowing you to keep full ownership and control of your data.

**If you do not enable Wispar Sync, no data is collected by Wispar.**


## Third-party services:

Wispar integrates with external services to enhance functionality. These services may collect information such as IP addresses, device-related data, and other usage data.

We encourage users to review the privacy policies of these services for a comprehensive understanding of their data collection practices.

**Core services:**

- Crossref: https://www.crossref.org/operations-and-sustainability/privacy
- OpenAlex: https://openalex.org/OpenAlex_privacy_policy.pdf

Optional services (used only when enabled and/or an API key is provided):
**Optional services** (used only when enabled and/or an API key is provided):

- Unpaywall (enabled by default): https://unpaywall.org/legal/privacy
- Zotero: https://www.zotero.org/support/privacy
Expand All @@ -19,4 +49,8 @@ Optional services (used only when enabled and/or an API key is provided):

Please review the privacy policies of these services to understand how they handle data. Wispar does not have control over the data collection practices of these external services.

Inquiries can be submitted to wispar-app@protonmail.com
## Contact
For any inquiries, please contact: support@wispar.app

---
Last Updated: March 2026
148 changes: 82 additions & 66 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,97 +1,113 @@
<p align="center">
<img alt="Wispar" src= "https://github.com/Scriptbash/Wispar/blob/main/assets/icon/icon.png?raw=true" width="100">
<img alt="Wispar" src="https://github.com/Scriptbash/Wispar/blob/main/assets/icon/icon.png?raw=true" width="100">
</p>

<h3 align="center">Stay up-to-date with academic journals and the latest research articles!</h3>

<p align="center">
<a href="https://github.com/Scriptbash/Wispar/actions/workflows/build.yml">
<a href="https://github.com/Scriptbash/Wispar/actions/workflows/build.yml">
<img alt="GitHub Workflow Status" src="https://github.com/Scriptbash/Wispar/actions/workflows/build.yml/badge.svg">
</a>
<a href="https://hosted.weblate.org/engage/wispar/">
<img src="https://hosted.weblate.org/widget/wispar/svg-badge.svg" alt="Translation status" />
</a>
<a href="https://doi.org/10.5281/zenodo.14901602"><img src="https://zenodo.org/badge/732206774.svg" alt="DOI"></a>
</br>
<a href="https://play.google.com/store/apps/details?id=app.wispar.wispar" target="_blank">
<img src="https://upload.wikimedia.org/wikipedia/commons/7/78/Google_Play_Store_badge_EN.svg" alt="Get it on Google Play" height="50"/>
</a>
<a href="https://apps.apple.com/us/app/wispar/id6741366984" target="_blank">
<img src="https://developer.apple.com/assets/elements/badges/download-on-the-app-store.svg" alt="Download on the App Store"width="150">
</a>
</br>
<a href="https://f-droid.org/packages/app.wispar.wispar">
<img src="https://f-droid.org/badge/get-it-on.png"
alt="Get it on F-Droid"
height="80">
</a>
</br></br>
<a href='https://ko-fi.com/A0A6ME7SJ' target='_blank'><img height='36' style='border:0px;height:36px;' src='https://storage.ko-fi.com/cdn/kofi5.png?v=6' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a>
</a>
<a href="https://hosted.weblate.org/engage/wispar/">
<img src="https://hosted.weblate.org/widget/wispar/svg-badge.svg" alt="Translation status" />
</a>
<a href="https://doi.org/10.5281/zenodo.14901602">
<img src="https://zenodo.org/badge/732206774.svg" alt="DOI">
</a>
</p>

<p align="center">
<a href="https://play.google.com/store/apps/details?id=app.wispar.wispar">
<img src="https://upload.wikimedia.org/wikipedia/commons/7/78/Google_Play_Store_badge_EN.svg" alt="Get it on Google Play" height="40">
</a>
<a href="https://apps.apple.com/us/app/wispar/id6741366984">
<img src="https://developer.apple.com/assets/elements/badges/download-on-the-app-store.svg" alt="Download on the App Store" height="40">
</a>
<a href="https://f-droid.org/packages/app.wispar.wispar">
<img src="https://upload.wikimedia.org/wikipedia/commons/9/96/%22Get_it_on_F-droid%22_Badge.png" alt="Get it on F-Droid" height="40">
</a>
<br>
<a href="https://github.com/Scriptbash/Wispar/releases/latest">
<img src="https://custom-icon-badges.demolab.com/badge/Windows-0078D6?logo=windows11&logoColor=white" width="140">
</a>
<a href="https://github.com/Scriptbash/Wispar/releases/latest">
<img src="https://img.shields.io/badge/macOS-000000?style=flat&logo=apple&logoColor=white" width="120">
</a>
<!--
<a href="https://github.com/Scriptbash/Wispar/releases/latest">
<img src="https://img.shields.io/badge/Flathub-000000?logo=flathub&logoColor=fff" width="125">
</a>-->
</p>

<p align="center">
<a href='https://ko-fi.com/A0A6ME7SJ' target='_blank'>
<img height='38' src='https://storage.ko-fi.com/cdn/kofi5.png?v=6' alt='Buy Me a Coffee at ko-fi.com' />
</a>
</p>

---

## Description
<p align="justify">
Wispar is a user-friendly and privacy-friendly Android/iOS app that seamlessly searches scientific journals and articles using the Crossref and OpenAlex APIs. Stay updated on your preferred journals by following them and receive new article abstracts in your main feed. No account required. The integration of Unpaywall ensures convenient access to open-access articles, while EZproxy helps overcome subscription barriers.
</p>

Wispar is a user-friendly and privacy-friendly app for Android, iOS, Windows, MacOS and Linux that seamlessly searches scientific journals and articles using the Crossref and OpenAlex APIs. Stay updated on your preferred journals by following them and receive new article abstracts in your main feed. No account required. The integration of Unpaywall ensures convenient access to open-access articles, while EZproxy helps overcome subscription barriers.

## Features overview
<ul>
<li> [x] Search and follow journals</li>
<li> [x] Search for articles and save the queries for easy access later. You can even include them in your feed!</li>
<li> [x] Download articles for offline reading</li>
<li> [x] EZproxy and Unpaywall integration</li>
<li> [x] Send articles to Zotero</li>
<li> [x] Share articles</li>
<li> [x] Scrape missing abstracts</li>
<li> [x] Scrape graphical abstracts</li>
<li> [x] Export/Import the local database</li>
<li> [x] Notifications and background journals updates</li>
<li> [x] Create custom feeds</li>
<li> [x] Customizable swipe gestures</li>
<li> [x] Translate title and abstracts (requires an AI API key)</li>
<li> [x] Chat with your papers using AI</li>
</ul>

- [x] Search and follow journals
- [x] Search for articles and save the queries for easy access later. You can even include them in your feed!
- [x] Sync your database across devices. You can also self-host the sync backend!
- [x] Download articles for offline reading
- [x] EZproxy and Unpaywall integration
- [x] Send articles to Zotero
- [x] Share articles
- [x] Scrape missing abstracts
- [x] Scrape graphical abstracts
- [x] Export/Import the local database
- [x] Notifications and background journals updates
- [x] Create custom feeds
- [x] Customizable swipe gestures
- [x] Translate title and abstracts (requires an AI API key)
- [x] Chat with your papers using AI


## Translations

<p align ="justify">
Wispar uses Weblate to manage translations. You can find the hosted instance at <a href="https://hosted.weblate.org/engage/wispar/">https://hosted.weblate.org/engage/wispar/</a>
Wispar uses Weblate to manage translations. You can find the hosted instance at [https://hosted.weblate.org/engage/wispar/](https://hosted.weblate.org/engage/wispar/)

A huge thank you to Weblate for hosting the translations for free :heart:.

Translation status:
</p>
<a href="https://hosted.weblate.org/engage/wispar/">
<img src="https://hosted.weblate.org/widget/wispar/multi-auto.svg" alt="Translation status" />
</a>

[![Translation status](https://hosted.weblate.org/widget/wispar/multi-auto.svg)](https://hosted.weblate.org/engage/wispar/)

## Contribute
<p align ="justify">
<ul>
<li>There are many ways you can contribute to improving Wispar—and it's not just about writing code!</li>
<li>You can help translate Wispar into your language by using our hosted Weblate instance.</li>
<li>Additionally, providing feedback and reporting bugs are invaluable ways to contribute!</li>
</ul>
<b>If you contribute to the project, feel free to add yourself to the .zenodo.json file to be credited!</b>
</p>

There are many ways you can contribute to improving Wispar, and it's not just about writing code!

* **Translations:** Help translate Wispar into your language using the [hosted Weblate instance](https://hosted.weblate.org/engage/wispar/).
* **Documentation:** Help me expand and finish the [official docs](https://wispar.app/docs/intro). It is currently a work in progress and any help is greatly appreciated!
* **Feedback:** Reporting bugs and suggesting features via [GitHub Issues](https://github.com/Scriptbash/Wispar/issues) is also an invaluable way to contribute!

**If you contribute to the project, feel free to add yourself to the `.zenodo.json` file to be credited!**


## Help
<p align ="justify">
If you run into any issue while using Wispar, have a question or want to share your feedback, please open an issue here : https://github.com/Scriptbash/Wispar/issues
</p>

If you run into any issue while using Wispar, have a question or want to share your feedback, please [open an issue here](https://github.com/Scriptbash/Wispar/issues).

If you have an issue with your Wispar Sync account, you can send an email at [support[at]wispar.app](mailto:support@wispar.app) and I will try to help as soon as possible.

## Credits
<ul>
<li>Thank you<a href="https://github.com/reds2401" target='_blank'> Sergio </a>for the original app icon and <a href="https://github.com/Meigane" target='_blank'> Lingling </a>for the updated app icon!</li>
<li><a href="https://libproxy-db.org/" target='_blank'>Library Proxy URL Database</a></li>
<li><a href="https://unpaywall.org/" target='_blank'>Unpaywall</a></li>
<li><a href="https://www.crossref.org/" target='_blank'>Crossref</a></li>
<li><a href="https://openalex.org/" target='_blank'>OpenAlex</a></li>
</ul>

## Screenshots
- Thank you [Sergio](https://github.com/reds2401) for the original app icon and [Lingling](https://github.com/Meigane) for the updated app icon!
- [Library Proxy URL Database](https://libproxy-db.org/)
- [Unpaywall](https://unpaywall.org/)
- [Crossref](https://www.crossref.org/)
- [OpenAlex](https://openalex.org/)
- [PocketBase](https://pocketbase.io/)


## Screenshots

| ![Feed](android/fastlane/metadata/android/en-US/images/phoneScreenshots/1_en-US.png) | ![Abstract](android/fastlane/metadata/android/en-US/images/phoneScreenshots/2_en-US.png) | ![Search](android/fastlane/metadata/android/en-US/images/phoneScreenshots/3_en-US.png) |
|---|---|---|
Expand Down
7 changes: 6 additions & 1 deletion ios/Runner/Runner.entitlements
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict/>
<dict>
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)app.wispar.wispar</string>
</array>
</dict>
</plist>
88 changes: 87 additions & 1 deletion lib/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -777,5 +777,91 @@
"downloadStarting": "Download starting.",
"downloadFoundPdf": "Download found PDF",
"downloadToApp": "Download in app",
"downloadToAppSubtitle": "Attempt to download and view PDF directly in Wispar for better integration."
"downloadToAppSubtitle": "Attempt to download and view PDF directly in Wispar for better integration.",
"loginToSyncDevices":"Login to sync across devices",
"@loginToSyncDevices":{},
"syncDisclaimer": "Disclaimer: This feature is experimental and provided as-is, with no guarantees of availability or reliability.",
"@syncDisclaimer":{},
"cloudSync": "Cloud sync",
"@cloudSync":{},
"selfHosted":"Self-Hosted",
"@selfHosted":{},
"syncNow": "Sync now",
"@syncNow":{},
"syncing":"Syncing...",
"@syncing":{},
"lastSync":"Last sync: {time}",
"@lastSync":{},
"backgroundSync": "Background syncing",
"@backgroundSync":{},
"backgroundSyncDescription": "If enabled, syncing will occur automatically while the app is in use.",
"@backgroundSyncDescription":{},
"authFailed":"Authentication failed: {error}",
"@authFailed":{},
"accountAlreadyExists":"This account already exists.",
"@accountAlreadyExists":{},
"pleaseEnterEmail":"Please enter your email.",
"@pleaseEnterEmail":{},
"pleaseEnterValidEmail":"Please enter a valid email address.",
"@pleaseEnterValidEmail":{},
"pleaseEnterPassword":"Please enter your password.",
"@pleaseEnterPassword":{},
"passwordTooShort":"Password must be at least 8 characters.",
"@passwordTooShort":{},
"checkdetailAndTryAgain":"Check your details and try again.",
"@checkdetailAndTryAgain":{},
"invalidEmailOrPassword":"Invalid email or password.",
"@invalidEmailOrPassword":{},
"cantConnectServer":"Could not connect to the server.",
"@cantConnectServer":{},
"forgotPassword":"Forgot password?",
"@forgotPassword":{},
"passwordResetSent": "Password reset email sent! Check your inbox and your spam folder.",
"@passwordResetSent":{},
"deleteAccountFailed":"Failed to delete account: {error}",
"@deleteAccountFailed":{},
"syncFailed":"Sync failed: {e}",
"@syncFailed":{},
"syncSuccess":"Sync completed successfully!",
"@syncSuccess":{},
"login":"Login",
"@login":{},
"logout":"Logout",
"@logout":{},
"user":"User: {name}",
"@user":{},
"syncServer":"Sync server: {address}",
"@syncServer":{},
"serverUrl": "Server URL",
"@serverUrl":{},
"checkEmail":"Check your email.",
"@checkEmail":{},
"checkEmailDescription":"A verification link has been sent. Please verify your account before logging in.",
"@checkEmailDescription":{},
"emailNotVerifiedError":"Please verify your email address before syncing.",
"@emailNotVerifiedError":{},
"waitResendEmail":"Wait {cooldown}s to resend the email.",
"@waitResendEmail":{},
"resendEmail":"Resend verification email",
"@resendEmail":{},
"close":"Close",
"@close":{},
"email":"Email",
"@email":{},
"password":"Password",
"@password":{},
"signUp":"Sign up",
"@signUp":{},
"haveAnAccount":"Have an account? Login",
"@haveAnAccount":{},
"needAnAccount":"Need an account? Sign up",
"@needAnAccount":{},
"deleteCloudAccount":"Delete cloud account",
"@deleteCloudAccount":{},
"deleteAccountQmark":"Permenantly delete account?",
"@deleteAccountQmark":{},
"deleteAccountExplanation": "This will permanently delete your account and cloud data. Your local data on this device will remain.",
"@deleteAccountExplanation":{},
"accountAndDataDeleted":"Account and cloud data deleted",
"@accountAndDataDeleted":{}
}
Loading