KashCal
kashcal.onekash.orgAndroidOffline-first Android calendar that syncs with iCloud, CalDAV and device calendars. No account, no telemetry; credentials are stored in the Android Keystore. Events are not end-to-end encrypted, so sync security depends on your provider.
- Homepage:kashcal.onekash.org
- GitHub:github.com/KashCal/KashCal
- Android App:play.google.com/.../org.onekash.kashcal
- Web info:web-check.xyz/check/kashcal.onekash.org
KashCal Source Code
Author
Description
All your calendars in one Android app. Sync iCloud, Nextcloud, Fastmail, and more CalDAV servers, plus your device's Google and Outlook calendars. Private by default: no ads, no trackers, no account.
Homepage
https://kashcal.onekash.orgRepository
- LicenseOther
- Created12 Jan 26
- Primary languageKotlin
- Size224,702 KB
- Stars425
- Forks31
- Watchers425
Top Contributors
@one-kash (191)
@langfeld (7)
@Agroqirax (1)
@az0ran (1)
@mariano-dagostino (1)
@Onxr (1)
@remi-espie (1)
Recent Commits
one-kash(27 Sept 26)
v2026.09.27 - Added calendar colors to the Insights day bars - Changed the app icon and store art to an aubergine background - Improved sync reliability: edits made elsewhere are merged, bad server replies and flaky networks no longer lose edits or calendars - Fixed edits, invite replies and reschedules on repeating and device-calendar events - Fixed reminders on very busy calendars and on Android 12 - Fixed Stalwart event handling, sync lookback narrowing, and the month widget on busy months (#373)
one-kash(20 Sept 26)
docs: add Device Calendar section for system-calendar interop (Google, Outlook, SilentSuite)
one-kash(20 Sept 26)
release: v2026.09.19 - New events open full-screen with the title focused and the keyboard ready to type - Added a setting to show multi-day timed events in the week-view all-day strip (#367) - Fixed the month home-screen widget showing "Can't show content" on dense months (#373) - Tightened the navigation-drawer calendar-list spacing
Agroqirax(19 Sept 26)
bug: Show multi-day timed events in the all-day strip (#367) Multi-day events render as a single spanning bar across the days they cover in the week-view all-day strip, matching the full-month view. Multi-day all-day events span unconditionally; multi-day timed events (at least 20h, crossing a day) move into the strip behind an opt-in setting that defaults off, showing the start time at the left cap and the end time at the right cap. Adds unit coverage for the span layout and the timed/all-day event partition.
one-kash(13 Sept 26)
docs: expand and tighten CONTRIBUTING and PR template - Link Code of Conduct and route security reports to SECURITY.md - Fix stale issue-template links (.md -> .yml) - Document the Conventional Commits convention - Align test commands to testDebugUnitTest, add -Pintegration note - Add PR scope and discuss-before-coding guidance - Add a translation-correction path - Copy-edit for concision; refresh AI-tool examples
one-kash(12 Sept 26)
release: v2026.09.12
one-kash(05 Sept 26)
release: v2026.09.05
one-kash(04 Sept 26)
release: v2026.09.04
one-kash(30 Aug 26)
release: v2026.08.29
one-kash(25 Aug 26)
release: v2026.08.25
one-kash(22 Aug 26)
Thank You for Supporting Us This release of KashCal has a name instead of a changelog: Thank You for Supporting Us. A look back at a year of your support: it now speaks to nearly every CalDAV server, sends and answers invitations, and turns a plain sentence into an event. To everyone who chipped in, reported a bug, asked for a feature, or sent a translation: thank you. https://kashcal.onekash.org/donate/
one-kash(20 Aug 26)
release: v2026.08.20
Kash(20 Aug 26)
Merge pull request #347 from langfeld/feature/month-widget-titles-polish Feature/month widget titles polish
langfeld(19 Aug 26)
Month widget: deep-link only the day's first event pill to its Quick View Wiring every event pill and span bar to ACTION_SHOW_EVENT blew the widget's shared view-ID pool: each Glance clickable wraps its target in an extra view, and one per pill across a fully-booked month (~126 extra views) pushed titles mode past the translation test's 400-view ceiling ("There are too many views"), the same failure the maintainer's per-event-tap comment warns about. Now only the FIRST event of each day column deep-links to its Quick View (single-day pill or the bar segment occupying that column); the rest keep their plain rendering and open the day on tap. That bounds the extra views to at most one per day cell (~42), keeping titles mode well under the pool while the day's top event stays one tap away.
langfeld(19 Aug 26)
Month widget: unit-test the event Quick View click wiring Extracts the ACTION_SHOW_EVENT payload into a testable eventActionParameters() helper (mirroring the upcoming widget's footerActionParameters pattern) and pins the deep link — action, event id, occurrence timestamp, and the device-event flag — in two unit tests, so the title-row / span-bar tap can't silently drift from the Quick View contract the other widgets rely on.
langfeld(19 Aug 26)
Month widget: stop week-number gutter from collapsing the grid to one row With week numbers enabled, the titles-mode week row collapsed the whole grid to a single visible week. The gutter cell used fillMaxHeight() inside a content-height week row: a fillMaxHeight child demands the row's full height, so the row measured itself against the gutter rather than its content — the first week expanded across the whole grid and squeezed every other week to nothing. Without week numbers there is no gutter, so the row sized to its content and the bug never showed. The gutter now sizes to its own content (top-aligned, fixed width), so the week row's height comes from the day numbers + event rows alone. Fixes the dots-mode gutter cell as well, which shared the same fillMaxHeight modifier.
langfeld(19 Aug 26)
Month widget titles: tap an event title to open its Quick View Single-day title rows and multi-day span bars now deep-link into the event's Quick View via ACTION_SHOW_EVENT (event id + occurrence start + device flag) — the same intent the agenda, week, and upcoming widgets already send, so MainActivity routes it to the existing ShowEventQuickView / ShowDeviceEventQuickView pending action. Day numbers, empty cells, and the "+n" overflow marker keep their go-to-date behavior.
langfeld(19 Aug 26)
Month widget titles: stretch week rows evenly again, keep content top-aligned The merged upstream change switched titles-mode week rows from defaultWeight() to content height, so a week with no events collapsed to its day-number height while event weeks grew — the "stacked from the top, cramped empty days" look. The dots rows still share the grid height evenly, which made the two modes visibly inconsistent. The titles week row now takes defaultWeight() like the dots rows, so every week fills its share of the grid; the day numbers and event rows stay top-aligned inside the stretched cell via the Column's verticalAlignment = Top, so the spare height pads each week's bottom rather than pulling the event rows apart. Respects the upstream content-height intent (no artificial event spacing) while restoring the even grid.
one-kash(19 Aug 26)
Release v2026.08.19
one-kash(17 Aug 26)
Release v2026.08.17
langfeld(16 Aug 26)
Month widget: show event titles instead of dots (#336) Adds a month-widget mode that renders event titles and connected multi-day bars (adapting row count to widget height via LocalSize) as an opt-in Appearance setting, plus a 10s bound on widget data fetches so a stalled query can't freeze nav actions. Author: langfeld
one-kash(14 Aug 26)
Release v2026.08.14
one-kash(09 Aug 26)
Release v2026.08.09 - Fixed a deleted event not disappearing from KashCal after another client removed it on the server; when the server echoes the event's address with the @ in its filename written as %40, the deletion is now matched and applied instead of silently skipped (#333) - Changed pull-to-refresh to sync CardDAV contacts as well as calendar events - Fixed contact sync skipping past a contact it could not read and never coming back to it
one-kash(08 Aug 26)
Release v2026.08.08
one-kash(08 Aug 26)
Enlarge week-view day-header letter and date number The 7-day week header rendered the day letter at 11sp and the date number at 12sp, noticeably smaller than the 3-day header's 14sp. Match both to bodyMedium so the two views read consistently. The cell is already pinned to a 48dp min height and the narrow columns hold only a single letter plus a 1-2 digit number, so the larger text neither wraps nor grows the header row.
one-kash(08 Aug 26)
Fix drill-in back-restore navigating to a stale week The day-header drill-in snapshotted uiState.selectedDate to restore on back press, but the week/3-day grid tracks its position in weekViewPagerPosition, not selectedDate. Only month-view taps write selectedDate, so after swiping the week pager a back press restored a stale date (jumping to an unrelated week) or, at cold start where selectedDate is still 0L, skipped the date restore and landed on today's week instead of the week the user drilled from. Derive the snapshot date from weekViewPagerPosition instead, mode-aware (WEEK uses week pages, 3-day uses day pages), so back returns to the exact week or 3-day span the user was viewing.
one-kash(08 Aug 26)
Shorten all-day overflow badge to +N with a larger tap target The all-day strip in Week and 3-Day view showed a '+N more' overflow badge, but the narrow day columns leave little room for the word. Show just '+N' instead, and wrap it in a min-sized clickable box so the tap target to open the overflow sheet stays comfortable even though the glyph is small. The count is still localized by the number formatter; only the template '+%1$d' has no words, so it needs no translation. The shared status_more_events string (month grid, week widget, timed overflow) is unchanged and still reads '+N more'. Co-authored-by: Wqrld <[email protected]>
one-kash(08 Aug 26)
Drill into Day view by tapping a day-column header Tapping a per-day header in Week or 3-Day view now opens that day in Day view. The switch is transient (persist=false on setViewMode) so drilling in never overwrites the configured startup default view. A back press after drilling in restores the Week/3-Day view and date the user came from, reusing the same snapshot mechanism as Jump to date (a single-shot BackHandler). Without it, back would have exited the app since Day view installs no back handler of its own. The header tap target is padded to the 48dp WCAG/Material minimum and exposes a Button role for screen readers, matching the all-day toggle in the same view. Co-authored-by: Wqrld <[email protected]>
one-kash(08 Aug 26)
Overlay the all-day strip so the timed grid keeps constant height The all-day strip used to be a sibling row above the timed grid, so a week with more all-day events grew the strip and pushed the grid down. Swiping between weeks with different all-day counts made the grid lurch vertically. Wrap the grid in a Box and overlay the strip (aligned to the top, with a shadow) instead: the grid keeps a constant height and scrolls beneath the opaque strip, matching the behavior of other calendar apps. Because the strip now floats over the grid's full-column tap targets, a tap on the strip's own empty areas would otherwise fall through and open event creation at the top-scrolled hour. A no-op tap consumer on the strip makes it touch-opaque so those taps are swallowed. Co-authored-by: Wqrld <[email protected]>
one-kash(08 Aug 26)
Use icons for Quick View action buttons Replace text labels on Edit, Delete, Duplicate, and Share with their Material icons (pencil, trash, copy, share). Reuses the existing action strings as content descriptions, so screen readers still announce the same words in every language and no new strings are introduced. Icons never wrap, unlike the text labels in longer locales. Co-authored-by: Wqrld <[email protected]>
KashCal Security
Security Advisories (1)
- highPatched
GHSA-53rw-qfc6-v32gTLS trust bypass: AIA chain completer installs the downloaded certificate as a trust anchor
KashCal Website
Website
A private calendar for Android with iCloud and CalDAV sync | KashCal
Free, open-source calendar for Android. Sync iCloud, CalDAV, holidays, and birthdays. Smart event add, Insights, widgets. Private by default, no account required.
Redirects
Does not redirect
Security Checks
All 65 security checks passed
Server Details
- IP Address185.199.109.153
- Hostnamecdn-185-199-109-153.github.com
- LocationFrancisco,Indiana,United States of America,NA
- ISPGitHub Inc.
- ASNAS54113
Associated Countries
US
Safety Score
Website marked as safe
100%
Blacklist Check
kashcal.onekash.org was found on 0 blacklists
- AntiSocial Blacklist
- Artists Against 419
- Badbitcoin
- Bambenek Consulting
- CERT Polska
- CoinBlockerLists
- CRDF
- CryptoScamDB
- EtherAddressLookup
- EtherScamDB
- Fake Website Buster
- MetaMask EthPhishing
- NABP Not Recommended Sites
- OpenPhish
- PetScams
- PhishFeed
- PhishFort
- Phishing.Database
- PhishStats
- PhishTank
- Phishunt
- RPiList Not Serious
- Scam.Directory
- SecureReload Phishing List
- Spam404
- StopGunScams
- Suspicious Hosting IP
- ThreatFox
- ThreatLog
- TweetFeed
- URLhaus
- ViriBack C2 Tracker
Website Preview
KashCal Android App
APK Info
- AppKashCal
- Creation Date23 Apr 26
- Last Updated23 Apr 26
- Current Version23.5.3
- Privacy ReportView on Exodus →
De-Googled Compatibility
Trackers
No trackers found
Permissions
- Access Network State
- Foreground Service
- Foreground Service Data Sync
- Internet
- Post Notifications
- Read Calendar
- Read Contacts
- Read Sync Settings
- Receive Boot Completed
- Use Exact Alarm
- Vibrate
- Wake Lock
- Write Calendar
- Write Sync Settings
- Dynamic Receiver Not Exported Permission
KashCal Reviews
More Calendar
Fossify Calendar from the family of forked FOSS apps from the discontinued SimpleMobileTools. Simple, customizable, includes widgets. Note that CalDAV support is currently limited (see #921
Calendar app for the self-hosted Nextcloud platform. Uses CalDAV for sync across devices. No E2E encryption support.
The calendar app from the Proton suite. End-to-end encrypted. Supports ICS (not encrypted), colours, recurring events, mail integration, notifications and multiple time zones.
About the Data: KashCal
Change History
- Added #754
Edit KashCal Data
You can edit KashCal's entry in this section of awesome-privacy.yml by submitting a PR to our GitHub repo.
Note that some of the information shown above has been aggregated from external
sources, a list of these can be found data documentation.
Origin Data
Modify Data
API
You can access KashCal's data programmatically via our API. Simply make a GET request to:
https://api.awesome-privacy.xyz/v1/services/kashcalThe REST API is free, no-auth and CORS-enabled. To learn more, view the API Docs or read the API Usage Guide.
Share KashCal
Help your friends compare Calendar, and pick privacy-respecting software and services.
Share KashCal and Awesome Privacy with your network!
