Family calendar and contacts service
Go to file
2026-01-23 14:49:52 -05:00
app Adds new green color palette, removes any requirement of a remote calendar description as validation, fixes language settings pane 2026-01-23 14:49:52 -05:00
bootstrap Refactors account and calendar settings pages; installs language localization files; new traits for HTMX and toast handling; solid icon variants added; modals improved 2026-01-21 15:59:17 -05:00
config Builds out individual calendar settings with views and save methods; solid icons added with updates to pagelink component; sync meta fields added to subscriptions table; new textarea component 2026-01-22 14:40:48 -05:00
database Adds new color picker component, updates calendar settings pane with calendar instance settings; fixes UTC/local TZ handling and updates seeder re same 2026-01-23 10:56:21 -05:00
docker Adds beginning docker support 2025-07-21 17:26:22 -04:00
lang Adds new green color palette, removes any requirement of a remote calendar description as validation, fixes language settings pane 2026-01-23 14:49:52 -05:00
public Initial commit with tons of files, but the custom auth plugin isn't working yet 2025-07-17 21:11:23 -04:00
resources Adds new green color palette, removes any requirement of a remote calendar description as validation, fixes language settings pane 2026-01-23 14:49:52 -05:00
routes Builds out individual calendar settings with views and save methods; solid icons added with updates to pagelink component; sync meta fields added to subscriptions table; new textarea component 2026-01-22 14:40:48 -05:00
storage Initial commit with tons of files, but the custom auth plugin isn't working yet 2025-07-17 21:11:23 -04:00
tests Initial commit with tons of files, but the custom auth plugin isn't working yet 2025-07-17 21:11:23 -04:00
.editorconfig Initial commit with tons of files, but the custom auth plugin isn't working yet 2025-07-17 21:11:23 -04:00
.env.example Long overdue changes to various components, migrations for address and location improvements, new address form and suggestion vies, profile components, and significant model cleanups 2026-01-15 16:14:00 -05:00
.gitattributes Initial commit with tons of files, but the custom auth plugin isn't working yet 2025-07-17 21:11:23 -04:00
.gitignore Initial commit with tons of files, but the custom auth plugin isn't working yet 2025-07-17 21:11:23 -04:00
artisan Initial commit with tons of files, but the custom auth plugin isn't working yet 2025-07-17 21:11:23 -04:00
composer.json Integrates ArcGIS for fetching detailed location data; sets up new job to pull locations for missing event locations; sets up Horizon for job monitoring; updates readme a bit; subtle animations and improvements to month view 2025-08-19 13:53:35 -04:00
composer.lock Integrates ArcGIS for fetching detailed location data; sets up new job to pull locations for missing event locations; sets up Horizon for job monitoring; updates readme a bit; subtle animations and improvements to month view 2025-08-19 13:53:35 -04:00
docker-compose.yml Adds beginning docker support 2025-07-21 17:26:22 -04:00
package-lock.json Long overdue changes to various components, migrations for address and location improvements, new address form and suggestion vies, profile components, and significant model cleanups 2026-01-15 16:14:00 -05:00
package.json Long overdue changes to various components, migrations for address and location improvements, new address form and suggestion vies, profile components, and significant model cleanups 2026-01-15 16:14:00 -05:00
phpunit.xml Initial commit with tons of files, but the custom auth plugin isn't working yet 2025-07-17 21:11:23 -04:00
postcss.config.js Calendar now grabs all events and formatted date ranges for display; calendar view shows mini calendar; more theme and brand updates for better glitz 2025-07-24 12:50:44 -04:00
README.md Integrates ArcGIS for fetching detailed location data; sets up new job to pull locations for missing event locations; sets up Horizon for job monitoring; updates readme a bit; subtle animations and improvements to month view 2025-08-19 13:53:35 -04:00
vite.config.js Initial commit with tons of files, but the custom auth plugin isn't working yet 2025-07-17 21:11:23 -04:00

Kithkin

Contacts and calendars for smart people.

Scheduled jobs

Jobs are located in app/Jobs and we use Laravel Horizon as an admin frontend.

Starting jobs

To start the jobs themselves, run php artisan schedule:work. This creates a running process that outputs job runs and other minimal data.

Production cron

On production, this should be setup via cron job like this:

* * * * * /usr/bin/php /path/to/artisan schedule:run >> /dev/null 2>&1

Monitoring jobs

Horizon is the monitoring app and frontend. Run php artisan horizon to start it. This will create a running process that outputs the results of the jobs in a better format than schedule:work.

The /horizon UI is just a normal route in Kithkin; the php artisan horizon process is what actually runs the workers and updates Redis for the dashboard.

Working with scheduled jobs

To see the list of scheduled jobs and their crons, run php artisan schedule:list.

Application flow notes for my own sanity

Local calendars

Local calendar creation

Creating a local calendar (not available in the UI yet) hits the Calendar.php controller. That store() method creates entries in the calendars, calendarinstances, and calendar_meta tables using model functions for each of them.

Local event creation

When the user creates a new event, it gets added to calendarobjects where the raw VEVENT data is stored. We have our own utility tables event_meta and locations for way more metadata and convenience fields so that we don't need to keep parsing the VEVENT blob.

The controller is EventController.php and it uses models Event.php (calendarobjects), EventMeta.php (event_meta), and Location.php (locations, not yet created).

Remote calendars

Remote calendars are calendars that a user "subscribes" to via .ics URL. These are also called subscription calendars in the app.

Remote calendar creation

The user adds a new remote calendar by entering the url in calendar settings, adding a display name, and picking a color.

When a new remote calendar is added, we create a row in calendarsubscriptions, calendars, and calendarinstances, and a corresponding meta data row in calendar_meta. This is so verbose because of the way SabreDAV handles remote subscriptions.

  • Normally, all Sabre does is add a row to calendarsubscriptions. It doesn't contemplate pulling the events down into the database locally--it assumes you're fetching the .ics file fresh and parsing out events every time the user loads the calendar.

  • Since we want to be able to search everything and do more, we need to pull the events down into our database. This requires creating corresponding rows in the local calendar tables. It's a little weird Sabre-wise since we have remote calendars populating their local calendar tables, but Sabre doesn't care that these are in there and it means the user can also share them out again.

The controller is SubscriptionController.php and it uses the additional model Subscription.php.

Remote events

When a user creates an event in a subscription calendar, we need to send that back up to the primary server. We also create the event locally as normal.