Small Grant: SiCal

Introduction

Project Name: SiCal

Name of the organization or individual submitting the proposal: mjmay08 (discord)

I am a previous Sia Foundation grantee and previously delivered SiaShare, a Wormhole-like sharing service built on renterd: https://github.com/mjmay08/SiaShare.

Describe your project.

SiCal is a decentralized calendar app built with Flutter and Rust, using the sia_storage sdk to save all data to Sia. The app provides core calendar functionality (event creation/editing, recurring events with exceptions, notifications, and multi-device sync) while keeping users in control of their data rather than relying on centralized calendar backends.
The architecture stores data locally in SQLite first, then syncs to Sia. Packed uploads are used as calendar events are very small.
This grant will support a two-month push to complete all basic calendar functionality, publish to the app stores, and address community feedback.

Working POC demo: https://drive.google.com/file/d/1MzB_m5EhiOhFjdIKXYJXamLjRDsL5G5Y/view?usp=sharing

How does the projected outcome serve the Foundation’s mission of user-owned data? What problem does your project solve?

Calendar data is highly personal, yet most calendar products are centralized and vendor-controlled. SiCal provides a user-owned alternative where users keep control over their schedule data while still getting a familiar modern app experience.

We cannot provide grants to residents of jurisdictions under increased FATF monitoring, those that have active OFAC sanctions, or those that fail our bank compliance tests. We also cannot provide grants if your payment bank account is located in those same locations. Please review the following list.

Are you a resident of any jurisdiction on that list? No

Will your payment bank account be located in any jurisdiction on that list? No

Grant Specifics

Amount of money requested and justification with a reasonable breakdown of expenses: $8000

  • 2 months of developer fees for @mjmay08

What is the high-level architecture overview for the grant? What security best practices are you following? Please review our Development Guide for further details.

High-level architecture: Flutter app UI + local SQLite database + Rust bridge to Sia SDK. Calendar events are stored locally first, packed into chunks, uploaded as Sia objects, and synchronized via object-event cursors and manifest metadata updates.
Security best practices: AppKey is stored using FlutterSecureStorage.

What are the goals of this small grant? Please provide a general timeline for completion.
Month 1 (ending May 25th):

  • Onboarding flow with indexer
  • Basic calendar event creation
  • Recurring events and exceptions (“just this event”, “this and following events”)
  • Import events from .ics files

Month 2 (ending June 25th):

  • Notifications
  • Multiple calendar support
  • Publish to Google Play and the App Store
  • Address community feedback

Who is the target user for your project?
Users who want a privacy-focused calendar without vendor lock-in, and developers who want a practical reference for building flutter apps with indexd.

What are your plans for this project following the grant?
If there is interest I would be happy to continue maintaining the app. If there are bigger feature requests I would be happy to do a follow-up grant with more functionality (e.g. browser-based app).

Potential risks that will affect the outcome of the project:

  • App store approval (not too concerned about this as I have published several apps in the past)
  • Sync is quite slow. Users might not be ok with the fact that it takes more than several seconds to sync the calendar because of the decentralized nature and slab size.
  • Not necessarily a risk but a limitation. I don’t see a way to implement shared calendars with other users. The existing share object functionality really only works with immutable data, not a calendar that is being constantly updated.

Development Information

Will all of your project’s code be open-source?

Yes

Leave a link where code will be accessible for review.

https://github.com/mjmay08/SiaCal

Do you agree to submit monthly progress reports?

Yes

Contact info

Any other preferred contact methods: mjmay08 (on discord)

Hi @mjmay08 - welcome back and thank you for this proposal. This will be presented to the Committee next week.

Thanks for your proposal to The Sia Foundation Grants Program.

After review, the Committee has decided to approve your proposal. Congratulations! They’re excited to see what you can accomplish with this grant.

Please provide an email address for onboarding either by emailing [email protected], or by direct messaging me here on the Forum or over on Discord (@mecsbecs). Bear in mind you may need to adjust your timelines depending on the time onboarding will take.

Monthly Grant Report — May 2026

What progress was made on your grant this month?

This month the project went from initial commit to a fully functional app, completing many core features: a Rust/Flutter bridge for Sia storage operations, a local SQLite cache, full CRUD for calendar events (including recurring event support), ICS file import (single and bulk), onboarding with embedded browser auth, timezone-aware event display, and a robust sync engine. The app is now buildable and testable end-to-end.

I was able to export 1800+ events from my google calendar and import them all at once into SiCal and sync them to Sia in a matter of minutes.

Detail tasks worked on this month per milestone

Milestone Task Pull Request(s) Additional Notes
1: Onboarding flow with indexer Create basic Flutter app scaffold (Android/iOS targets) #1
1: Onboarding flow with indexer Add Rust bridge integration; Rust crate communicates with Sia Storage API for upload/download/list of calendar data #2
1: Onboarding flow with indexer Add SiaStorageService, SyncEngine, CalendarRepository, and AuthService #5
1: Onboarding flow with indexer Onboarding screen and startup auth gate #6
1: Onboarding flow with indexer App icon, splash screen, and logo metadata #9, #12, #14, #10
1: Onboarding flow with indexer Embedded browser auth via Flutter Custom Tabs; better handling of backgrounded network calls #11 Eliminates app-switching during auth flow
2: Basic calendar event creation Add domain models (CalendarEvent, Chunk, Manifest, RecurrenceRule) #3
2: Basic calendar event creation Add SQLite database layer for local event cache and offline access #4
2: Basic calendar event creation Calendar main screen, event detail screen, event form (create/edit), and settings screen #7
2: Basic calendar event creation Sync improvements: live sync status display, immediate sync on calendar restore, handle remotely-deleted events, pagination for large event sets #17
3: Recurring events and exceptions Recurrence rule picker in event form; edit/delete dialogs with “This event”, “This and following events”, and “All events” options; full exception and virtual instance support in CalendarRepository #7
4: Import events from .ics files ICS import: Android intent handler, iOS file association, IcsImportService parser, single-event import from .ics file #8
4: Import events from .ics files Timezone handling: store timezone on events, convert to device timezone for display, parse VTIMEZONE blocks in ICS import #13
4: Import events from .ics files Bulk import: support .ics files containing multiple VEVENT blocks #15
4: Import events from .ics files Fix timezone display edge cases (wall-clock fallback, offset display) #16

Were there any problems encountered this month?

  • When I first started the sia_storage | Dart package package with dart bindings for Sia Storage SDK was not yet available so I created my own. Once I realized that it did exist, I attempted to switch but realized it seems to be missing some functionality such as upload packing?
  • Network calls initiated during onboarding could result in errors when the app was backgrounded (like when we switch to the browser for app approval flow); this was addressed in PR #11 with proper async cancellation and error surfacing.

What will you be working on next month?

  • Notifications
  • Multiple calendar support
  • Publish to Google Play and the App Store
  • Address community feedback
1 Like

Hi @mjmay08 - This month’s review was successful and there is no actionable feedback.

Your reviewer did add this comment:

Great job on making your own Dart bindings. We will try to get packed uploads into our official Dart port soon.

The team is looking forward to seeing what you do over the next month!

Hi again @mjmay08 - an update on the above:

we added packed upload support to the Dart SDK (in https://github.com/SiaFoundation/sia\_storage\_dart/releases/tag/v0.2.0) and that we would prefer our bindings be used instead

Please incorporate the above ASAP

Monthly Grant Final Report — June 2026

What progress was made on your grant this month?

This month’s progress included background sync improvements, configurable event notifications, multiple-calendar support, migration to the official sia_storage dart package, extensive sync reliability fixes, recurring event fixes, many UI/UX improvements, and release/publishing build fixes. SiCal has been submitted to both app stores. The iOS app was just approved as I write this and android should hopefully be approved soon.

Detail tasks worked on this month per milestone with the appropriate Pull Request(s) links as outlined in the guide:

Milestone Task Pull Request(s) Notes
Notifications Added configurable event notifications Configurable event notifications by mjmay08 · Pull Request #22 · mjmay08/SiCal · GitHub
Multiple calendar support Added support for multiple calendars Multiple calendar support by mjmay08 · Pull Request #21 · mjmay08/SiCal · GitHub
Multiple calendar support Calendar visibility and assignment improvements Bugfix/minor enhancements by mjmay08 · Pull Request #35 · mjmay08/SiCal · GitHub
Publish to Google Play / App Store Release build fixes Use correct keystore for release builds by mjmay08 · Pull Request #37 · mjmay08/SiCal · GitHub iOS build changes by mjmay08 · Pull Request #25 · mjmay08/SiCal · GitHub Most of this was non-code work.
Other non-milestone specific Background sync on android by mjmay08 · Pull Request #19 · mjmay08/SiCal · GitHub iOS background sync by mjmay08 · Pull Request #20 · mjmay08/SiCal · GitHub Switch to sia_storage package by mjmay08 · Pull Request #23 · mjmay08/SiCal · GitHub Minor bugfixes v0.0.2+2 by mjmay08 · Pull Request #24 · mjmay08/SiCal · GitHub Several calendar view display fixes by mjmay08 · Pull Request #26 · mjmay08/SiCal · GitHub Quickly navigate to month/year by mjmay08 · Pull Request #27 · mjmay08/SiCal · GitHub v0.0.3+3 by mjmay08 · Pull Request #28 · mjmay08/SiCal · GitHub Add logging and timeouts to sync by mjmay08 · Pull Request #29 · mjmay08/SiCal · GitHub v0.0.4+4 by mjmay08 · Pull Request #30 · mjmay08/SiCal · GitHub Add sync logging and fix hang by mjmay08 · Pull Request #31 · mjmay08/SiCal · GitHub v0.0.5+5 by mjmay08 · Pull Request #32 · mjmay08/SiCal · GitHub Fix monthly events by mjmay08 · Pull Request #33 · mjmay08/SiCal · GitHub v0.0.6+6 by mjmay08 · Pull Request #34 · mjmay08/SiCal · GitHub Bugfix/minor enhancements by mjmay08 · Pull Request #35 · mjmay08/SiCal · GitHub v0.0.7+7 by mjmay08 · Pull Request #36 · mjmay08/SiCal · GitHub

Link to an easy to test version or a demo video.

iOS app: ‎SiCal App - App Store

Android: Coming Soon (Waiting for approval)

Demo Video: https://drive.google.com/file/d/1qtG4LerW6kmt50yyYMX5MvNPzyFV3Hwp/view?usp=sharing

Provide an overall summary of everything achieved during this grant.

Over the full grant period, SiCal progressed from initial scaffold to a full decentralized mobile calendar app with core calendar functionality and Sia-backed sync. Achievements include onboarding/auth flow, robust sync engine, event CRUD, recurring event support, ICS import (single and bulk), timezone-aware behavior, configurable notifications, multi-calendar support, platform background sync work, and publishing to both Google Play and Apple App Store.

If there were challenges you experienced and/or any work you weren’t able to complete, list it here.

  • Still waiting on Android app store approval. Has been in review for several days.
  • Because sync takes longer than a traditional cloud service, background sync is important in case the user leaves the app. This works well on Android, but iOS is trickier.
  • Sia.storage had some issues where I couldn’t approve a new app connection for a couple days.
  • There are many improvements/enhancements that could still be made that weren’t a part of the original grant scope (a big one being shared calendars, ability to switch indexers, exporting events as ICS file).
  • Due to how long it took the app to get approved I wasn’t able to address any community feedback yet.

What lessons have you learned as a result of this grant?

  • Integrating with sia storage was actually pretty painless. There are some limitations due to minimum slab sizes and sync times, but this really opens up possibilities for apps being built on Sia.

What are you most proud of about your work on this grant?

I’m most proud that SiCal became a practical, end-to-end example of a user-owned mobile calendar on Sia: full calendar functionality, decentralized sync architecture, all achieved in a short grant window. As far as I know this is the second published app to use sia.storage other than the official Sia Storage app.

Hi @mjmay08 - thank you for your final report.

Your reviewer noted the following items/questions which will need to be addressed before we can consider this milestone approved and this grant complete:

  • The project recognizes that handleDeletedEvent is not done, mentions its an MVP, and says this is mitigated by a re-download of the manifest, but, in a cross sync, what happens to things that were deleted? It appears nothing removes events. Does an event deleted on calendar A disappear on calendar B or does it persist? Re-check this handleDeletedEvent’s manifest assumption.

  • Re-review the database side of multiple calendars re: sync_state and its 1 primary key. Are you really keeping two+ calendars or is everything overwriting the same one?

    • There is very likely a primary key collision bug here where the calendar you’re using writes over the same primary key. Check sync_state: id INTEGER PRIMARY KEY DEFAULT 1 and then updateSyncCursor only ever does VALUES (1, …). INSERT OR REPLACE. In other words, is there a bug here where the user is only ever editing one SQL row and therefore the same logical calendar?
  • Check about remote deletion events. If you delete something on device A, does device B recognize that or persist that event that it should delete?

  • Would like more explanation in the PR bodies as many were empty. There were titles to go on, and they were descriptive, but more explanation could have been more helpful to the review.

  • PR #35 was a smidge unfocused–handling 5ish unrelated things altogether. It’s an almost 3K line diff. Some better commit scoping would make for a more coherent history.

Hi @mjmay08 - checking in on the above required edits and request for more information. Without this addressed we cannot consider this grant complete and the final payment will be delayed.

SiCal is now available on Google Play: https://play.google.com/store/apps/details?id=dev.mmay.sical

I have also addressed the previous comments.
Multiple calendars now sync correctly including any calendar metadata changes such as name, color, and timezone. (#42, #44, #46, #48)
Event deletion is now handled completely. Remotely deleted events are deleted locally as well on sync. (#38, #40)

The latest version with these updates (v0.1.3) is still pending approval on both Google Play and the App Store.

Hi @mjmay08 - thank you for this reply. Please note a response from your reviewer will be forthcoming at the beginning of next week given the time difference and the fact we have a company holiday tomorrow.

Hi @mjmay08 - your technical review is a success and this grant can now be marked as complete. Congratulations!