Skip to main content

max / goingson

Email credential split, plugin runtime updates, new themes, OTA and sync fixes Migration 033: email credential split. JMAP/IMAP client improvements. Plugin runtime API and registry updates. 7 new themes added. Sync service and OAuth credential hardening. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Author: Max J. <87768334+MaxJMath@users.noreply.github.com> · 2026-03-18 20:51 UTC
Commit: 8ac7c486832734d1580df95caa0361a7b8224777
Parent: b93a8f0
31 files changed, +946 insertions, -376 deletions
M Cargo.lock +70 -175
@@ -416,20 +416,11 @@ dependencies = [
416 416
417 417 [[package]]
418 418 name = "block2"
419 - version = "0.5.1"
420 - source = "registry+https://github.com/rust-lang/crates.io-index"
421 - checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f"
422 - dependencies = [
423 - "objc2 0.5.2",
424 - ]
425 -
426 - [[package]]
427 - name = "block2"
428 419 version = "0.6.2"
429 420 source = "registry+https://github.com/rust-lang/crates.io-index"
430 421 checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5"
431 422 dependencies = [
432 - "objc2 0.6.3",
423 + "objc2",
433 424 ]
434 425
435 426 [[package]]
@@ -1082,9 +1073,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1082 1073 checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec"
1083 1074 dependencies = [
1084 1075 "bitflags 2.10.0",
1085 - "block2 0.6.2",
1076 + "block2",
1086 1077 "libc",
1087 - "objc2 0.6.3",
1078 + "objc2",
1088 1079 ]
1089 1080
1090 1081 [[package]]
@@ -1867,9 +1858,6 @@ dependencies = [
1867 1858 "mailparse",
1868 1859 "notify",
1869 1860 "notify-debouncer-mini",
1870 - "objc2 0.5.2",
1871 - "objc2-app-kit 0.2.2",
1872 - "objc2-foundation 0.2.2",
1873 1861 "open",
1874 1862 "rand 0.8.5",
1875 1863 "reqwest 0.12.28",
@@ -2808,8 +2796,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
2808 2796 checksum = "65fd3f75411f4725061682ed91f131946e912859d0044d39c4ec0aac818d7621"
2809 2797 dependencies = [
2810 2798 "cc",
2811 - "objc2 0.6.3",
2812 - "objc2-foundation 0.3.2",
2799 + "objc2",
2800 + "objc2-foundation",
2813 2801 "time",
2814 2802 ]
2815 2803
@@ -2988,10 +2976,10 @@ dependencies = [
2988 2976 "dpi",
2989 2977 "gtk",
2990 2978 "keyboard-types",
2991 - "objc2 0.6.3",
2992 - "objc2-app-kit 0.3.2",
2979 + "objc2",
2980 + "objc2-app-kit",
2993 2981 "objc2-core-foundation",
2994 - "objc2-foundation 0.3.2",
2982 + "objc2-foundation",
2995 2983 "once_cell",
2996 2984 "png 0.17.16",
2997 2985 "serde",
@@ -3223,22 +3211,6 @@ dependencies = [
3223 3211 ]
3224 3212
3225 3213 [[package]]
3226 - name = "objc-sys"
3227 - version = "0.3.5"
3228 - source = "registry+https://github.com/rust-lang/crates.io-index"
3229 - checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310"
3230 -
3231 - [[package]]
3232 - name = "objc2"
3233 - version = "0.5.2"
3234 - source = "registry+https://github.com/rust-lang/crates.io-index"
3235 - checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804"
3236 - dependencies = [
3237 - "objc-sys",
3238 - "objc2-encode",
3239 - ]
3240 -
3241 - [[package]]
3242 3214 name = "objc2"
3243 3215 version = "0.6.3"
3244 3216 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3250,39 +3222,23 @@ dependencies = [
3250 3222
3251 3223 [[package]]
3252 3224 name = "objc2-app-kit"
3253 - version = "0.2.2"
3254 - source = "registry+https://github.com/rust-lang/crates.io-index"
3255 - checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff"
3256 - dependencies = [
3257 - "bitflags 2.10.0",
3258 - "block2 0.5.1",
3259 - "libc",
3260 - "objc2 0.5.2",
3261 - "objc2-core-data 0.2.2",
3262 - "objc2-core-image 0.2.2",
3263 - "objc2-foundation 0.2.2",
3264 - "objc2-quartz-core 0.2.2",
3265 - ]
3266 -
3267 - [[package]]
3268 - name = "objc2-app-kit"
3269 3225 version = "0.3.2"
3270 3226 source = "registry+https://github.com/rust-lang/crates.io-index"
3271 3227 checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c"
3272 3228 dependencies = [
3273 3229 "bitflags 2.10.0",
3274 - "block2 0.6.2",
3230 + "block2",
3275 3231 "libc",
3276 - "objc2 0.6.3",
3232 + "objc2",
3277 3233 "objc2-cloud-kit",
3278 - "objc2-core-data 0.3.2",
3234 + "objc2-core-data",
3279 3235 "objc2-core-foundation",
3280 3236 "objc2-core-graphics",
3281 - "objc2-core-image 0.3.2",
3237 + "objc2-core-image",
3282 3238 "objc2-core-text",
3283 3239 "objc2-core-video",
3284 - "objc2-foundation 0.3.2",
3285 - "objc2-quartz-core 0.3.2",
3240 + "objc2-foundation",
3241 + "objc2-quartz-core",
3286 3242 ]
3287 3243
3288 3244 [[package]]
@@ -3292,20 +3248,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
3292 3248 checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c"
3293 3249 dependencies = [
3294 3250 "bitflags 2.10.0",
3295 - "objc2 0.6.3",
3296 - "objc2-foundation 0.3.2",
3297 - ]
3298 -
3299 - [[package]]
3300 - name = "objc2-core-data"
3301 - version = "0.2.2"
3302 - source = "registry+https://github.com/rust-lang/crates.io-index"
3303 - checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef"
3304 - dependencies = [
3305 - "bitflags 2.10.0",
3306 - "block2 0.5.1",
3307 - "objc2 0.5.2",
3308 - "objc2-foundation 0.2.2",
3251 + "objc2",
3252 + "objc2-foundation",
3309 3253 ]
3310 3254
3311 3255 [[package]]
@@ -3315,8 +3259,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
3315 3259 checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa"
3316 3260 dependencies = [
3317 3261 "bitflags 2.10.0",
3318 - "objc2 0.6.3",
3319 - "objc2-foundation 0.3.2",
3262 + "objc2",
3263 + "objc2-foundation",
3320 3264 ]
3321 3265
3322 3266 [[package]]
@@ -3327,7 +3271,7 @@ checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
3327 3271 dependencies = [
3328 3272 "bitflags 2.10.0",
3329 3273 "dispatch2",
3330 - "objc2 0.6.3",
3274 + "objc2",
3331 3275 ]
3332 3276
3333 3277 [[package]]
@@ -3338,31 +3282,19 @@ checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807"
3338 3282 dependencies = [
3339 3283 "bitflags 2.10.0",
3340 3284 "dispatch2",
3341 - "objc2 0.6.3",
3285 + "objc2",
3342 3286 "objc2-core-foundation",
3343 3287 "objc2-io-surface",
3344 3288 ]
3345 3289
3346 3290 [[package]]
3347 3291 name = "objc2-core-image"
3348 - version = "0.2.2"
3349 - source = "registry+https://github.com/rust-lang/crates.io-index"
3350 - checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80"
3351 - dependencies = [
3352 - "block2 0.5.1",
3353 - "objc2 0.5.2",
3354 - "objc2-foundation 0.2.2",
3355 - "objc2-metal",
3356 - ]
3357 -
3358 - [[package]]
3359 - name = "objc2-core-image"
3360 3292 version = "0.3.2"
3361 3293 source = "registry+https://github.com/rust-lang/crates.io-index"
3362 3294 checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006"
3363 3295 dependencies = [
3364 - "objc2 0.6.3",
3365 - "objc2-foundation 0.3.2",
3296 + "objc2",
3297 + "objc2-foundation",
3366 3298 ]
3367 3299
3368 3300 [[package]]
@@ -3372,7 +3304,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
3372 3304 checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d"
3373 3305 dependencies = [
3374 3306 "bitflags 2.10.0",
3375 - "objc2 0.6.3",
3307 + "objc2",
3376 3308 "objc2-core-foundation",
3377 3309 "objc2-core-graphics",
3378 3310 ]
@@ -3384,7 +3316,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
3384 3316 checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6"
3385 3317 dependencies = [
3386 3318 "bitflags 2.10.0",
3387 - "objc2 0.6.3",
3319 + "objc2",
3388 3320 "objc2-core-foundation",
3389 3321 "objc2-core-graphics",
3390 3322 "objc2-io-surface",
@@ -3407,26 +3339,14 @@ dependencies = [
3407 3339
3408 3340 [[package]]
3409 3341 name = "objc2-foundation"
3410 - version = "0.2.2"
3411 - source = "registry+https://github.com/rust-lang/crates.io-index"
3412 - checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8"
3413 - dependencies = [
3414 - "bitflags 2.10.0",
3415 - "block2 0.5.1",
3416 - "libc",
3417 - "objc2 0.5.2",
3418 - ]
3419 -
3420 - [[package]]
3421 - name = "objc2-foundation"
3422 3342 version = "0.3.2"
3423 3343 source = "registry+https://github.com/rust-lang/crates.io-index"
3424 3344 checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272"
3425 3345 dependencies = [
3426 3346 "bitflags 2.10.0",
3427 - "block2 0.6.2",
3347 + "block2",
3428 3348 "libc",
3429 - "objc2 0.6.3",
3349 + "objc2",
3430 3350 "objc2-core-foundation",
3431 3351 ]
3432 3352
@@ -3437,7 +3357,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
3437 3357 checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d"
3438 3358 dependencies = [
3439 3359 "bitflags 2.10.0",
3440 - "objc2 0.6.3",
3360 + "objc2",
3441 3361 "objc2-core-foundation",
3442 3362 ]
3443 3363
@@ -3447,45 +3367,20 @@ version = "0.3.2"
3447 3367 source = "registry+https://github.com/rust-lang/crates.io-index"
3448 3368 checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586"
3449 3369 dependencies = [
3450 - "objc2 0.6.3",
3370 + "objc2",
3451 3371 "objc2-core-foundation",
3452 3372 ]
3453 3373
3454 3374 [[package]]
3455 - name = "objc2-metal"
3456 - version = "0.2.2"
3457 - source = "registry+https://github.com/rust-lang/crates.io-index"
3458 - checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6"
3459 - dependencies = [
3460 - "bitflags 2.10.0",
3461 - "block2 0.5.1",
3462 - "objc2 0.5.2",
3463 - "objc2-foundation 0.2.2",
3464 - ]
3465 -
3466 - [[package]]
3467 3375 name = "objc2-osa-kit"
3468 3376 version = "0.3.2"
3469 3377 source = "registry+https://github.com/rust-lang/crates.io-index"
3470 3378 checksum = "f112d1746737b0da274ef79a23aac283376f335f4095a083a267a082f21db0c0"
3471 3379 dependencies = [
3472 3380 "bitflags 2.10.0",
3473 - "objc2 0.6.3",
3474 - "objc2-app-kit 0.3.2",
3475 - "objc2-foundation 0.3.2",
3476 - ]
3477 -
3478 - [[package]]
3479 - name = "objc2-quartz-core"
3480 - version = "0.2.2"
3481 - source = "registry+https://github.com/rust-lang/crates.io-index"
3482 - checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a"
3483 - dependencies = [
3484 - "bitflags 2.10.0",
3485 - "block2 0.5.1",
3486 - "objc2 0.5.2",
3487 - "objc2-foundation 0.2.2",
3488 - "objc2-metal",
3381 + "objc2",
3382 + "objc2-app-kit",
3383 + "objc2-foundation",
3489 3384 ]
3490 3385
3491 3386 [[package]]
@@ -3495,9 +3390,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
3495 3390 checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f"
3496 3391 dependencies = [
3497 3392 "bitflags 2.10.0",
3498 - "objc2 0.6.3",
3393 + "objc2",
3499 3394 "objc2-core-foundation",
3500 - "objc2-foundation 0.3.2",
3395 + "objc2-foundation",
3501 3396 ]
3502 3397
3503 3398 [[package]]
@@ -3507,7 +3402,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
3507 3402 checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a"
3508 3403 dependencies = [
3509 3404 "bitflags 2.10.0",
3510 - "objc2 0.6.3",
3405 + "objc2",
3511 3406 "objc2-core-foundation",
3512 3407 ]
3513 3408
@@ -3518,9 +3413,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
3518 3413 checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22"
3519 3414 dependencies = [
3520 3415 "bitflags 2.10.0",
3521 - "objc2 0.6.3",
3416 + "objc2",
3522 3417 "objc2-core-foundation",
3523 - "objc2-foundation 0.3.2",
3418 + "objc2-foundation",
3524 3419 ]
3525 3420
3526 3421 [[package]]
@@ -3530,11 +3425,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
3530 3425 checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f"
3531 3426 dependencies = [
3532 3427 "bitflags 2.10.0",
3533 - "block2 0.6.2",
3534 - "objc2 0.6.3",
3535 - "objc2-app-kit 0.3.2",
3428 + "block2",
3429 + "objc2",
3430 + "objc2-app-kit",
3536 3431 "objc2-core-foundation",
3537 - "objc2-foundation 0.3.2",
3432 + "objc2-foundation",
3538 3433 "objc2-javascript-core",
3539 3434 "objc2-security",
3540 3435 ]
@@ -3657,8 +3552,8 @@ version = "0.3.1"
3657 3552 source = "registry+https://github.com/rust-lang/crates.io-index"
3658 3553 checksum = "732c71caeaa72c065bb69d7ea08717bd3f4863a4f451402fc9513e29dbd5261b"
3659 3554 dependencies = [
3660 - "objc2 0.6.3",
3661 - "objc2-foundation 0.3.2",
3555 + "objc2",
3556 + "objc2-foundation",
3662 3557 "objc2-osa-kit",
3663 3558 "serde",
3664 3559 "serde_json",
@@ -4466,17 +4361,17 @@ version = "0.16.0"
4466 4361 source = "registry+https://github.com/rust-lang/crates.io-index"
4467 4362 checksum = "a15ad77d9e70a92437d8f74c35d99b4e4691128df018833e99f90bcd36152672"
4468 4363 dependencies = [
4469 - "block2 0.6.2",
4364 + "block2",
4470 4365 "dispatch2",
4471 4366 "glib-sys",
4472 4367 "gobject-sys",
4473 4368 "gtk-sys",
4474 4369 "js-sys",
4475 4370 "log",
4476 - "objc2 0.6.3",
4477 - "objc2-app-kit 0.3.2",
4371 + "objc2",
4372 + "objc2-app-kit",
4478 4373 "objc2-core-foundation",
4479 - "objc2-foundation 0.3.2",
4374 + "objc2-foundation",
4480 4375 "raw-window-handle",
4481 4376 "wasm-bindgen",
4482 4377 "wasm-bindgen-futures",
@@ -5161,11 +5056,11 @@ dependencies = [
5161 5056 "bytemuck",
5162 5057 "js-sys",
5163 5058 "ndk",
5164 - "objc2 0.6.3",
5059 + "objc2",
5165 5060 "objc2-core-foundation",
5166 5061 "objc2-core-graphics",
5167 - "objc2-foundation 0.3.2",
5168 - "objc2-quartz-core 0.3.2",
5062 + "objc2-foundation",
5063 + "objc2-quartz-core",
5169 5064 "raw-window-handle",
5170 5065 "redox_syscall 0.5.18",
5171 5066 "tracing",
@@ -5643,7 +5538,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
5643 5538 checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7"
5644 5539 dependencies = [
5645 5540 "bitflags 2.10.0",
5646 - "block2 0.6.2",
5541 + "block2",
5647 5542 "core-foundation 0.10.1",
5648 5543 "core-graphics",
5649 5544 "crossbeam-channel",
@@ -5660,9 +5555,9 @@ dependencies = [
5660 5555 "ndk",
5661 5556 "ndk-context",
5662 5557 "ndk-sys",
5663 - "objc2 0.6.3",
5664 - "objc2-app-kit 0.3.2",
5665 - "objc2-foundation 0.3.2",
5558 + "objc2",
5559 + "objc2-app-kit",
5560 + "objc2-foundation",
5666 5561 "once_cell",
5667 5562 "parking_lot",
5668 5563 "raw-window-handle",
@@ -5727,9 +5622,9 @@ dependencies = [
5727 5622 "log",
5728 5623 "mime",
5729 5624 "muda",
5730 - "objc2 0.6.3",
5731 - "objc2-app-kit 0.3.2",
5732 - "objc2-foundation 0.3.2",
5625 + "objc2",
5626 + "objc2-app-kit",
5627 + "objc2-foundation",
5733 5628 "objc2-ui-kit",
5734 5629 "objc2-web-kit",
5735 5630 "percent-encoding",
@@ -5975,7 +5870,7 @@ dependencies = [
5975 5870 "gtk",
5976 5871 "http",
5977 5872 "jni",
5978 - "objc2 0.6.3",
5873 + "objc2",
5979 5874 "objc2-ui-kit",
5980 5875 "objc2-web-kit",
5981 5876 "raw-window-handle",
@@ -5999,9 +5894,9 @@ dependencies = [
5999 5894 "http",
6000 5895 "jni",
6001 5896 "log",
6002 - "objc2 0.6.3",
6003 - "objc2-app-kit 0.3.2",
6004 - "objc2-foundation 0.3.2",
5897 + "objc2",
5898 + "objc2-app-kit",
5899 + "objc2-foundation",
6005 5900 "once_cell",
6006 5901 "percent-encoding",
6007 5902 "raw-window-handle",
@@ -6161,9 +6056,9 @@ dependencies = [
6161 6056
6162 6057 [[package]]
6163 6058 name = "time"
6164 - version = "0.3.46"
6059 + version = "0.3.47"
6165 6060 source = "registry+https://github.com/rust-lang/crates.io-index"
6166 - checksum = "9da98b7d9b7dad93488a84b8248efc35352b0b2657397d4167e7ad67e5d535e5"
6061 + checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c"
6167 6062 dependencies = [
6168 6063 "deranged",
6169 6064 "itoa",
@@ -6182,9 +6077,9 @@ checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca"
6182 6077
6183 6078 [[package]]
6184 6079 name = "time-macros"
6185 - version = "0.2.26"
6080 + version = "0.2.27"
6186 6081 source = "registry+https://github.com/rust-lang/crates.io-index"
6187 - checksum = "78cc610bac2dcee56805c99642447d4c5dbde4d01f752ffea0199aee1f601dc4"
6082 + checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215"
6188 6083 dependencies = [
6189 6084 "num-conv",
6190 6085 "time-core",
@@ -6508,11 +6403,11 @@ dependencies = [
6508 6403 "dirs",
6509 6404 "libappindicator",
6510 6405 "muda",
6511 - "objc2 0.6.3",
6512 - "objc2-app-kit 0.3.2",
6406 + "objc2",
6407 + "objc2-app-kit",
6513 6408 "objc2-core-foundation",
6514 6409 "objc2-core-graphics",
6515 - "objc2-foundation 0.3.2",
6410 + "objc2-foundation",
6516 6411 "once_cell",
6517 6412 "png 0.17.16",
6518 6413 "serde",
@@ -7025,10 +6920,10 @@ version = "0.6.0"
7025 6920 source = "registry+https://github.com/rust-lang/crates.io-index"
7026 6921 checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c"
7027 6922 dependencies = [
7028 - "objc2 0.6.3",
7029 - "objc2-app-kit 0.3.2",
6923 + "objc2",
6924 + "objc2-app-kit",
7030 6925 "objc2-core-foundation",
7031 - "objc2-foundation 0.3.2",
6926 + "objc2-foundation",
7032 6927 "raw-window-handle",
7033 6928 "windows-sys 0.59.0",
7034 6929 "windows-version",
@@ -7546,7 +7441,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
7546 7441 checksum = "5ed1a195b0375491dd15a7066a10251be217ce743cf4bbbbdcf5391d6473bee0"
7547 7442 dependencies = [
7548 7443 "base64 0.22.1",
Lines truncated
@@ -886,9 +886,9 @@ mod tests {
886 886 #[test]
887 887 fn json_to_dynamic_primitives() {
888 888 assert_eq!(json_to_dynamic(serde_json::Value::Null).type_name(), "()");
889 - assert_eq!(json_to_dynamic(serde_json::Value::Bool(true)).as_bool().unwrap(), true);
889 + assert!(json_to_dynamic(serde_json::Value::Bool(true)).as_bool().unwrap());
890 890 assert_eq!(json_to_dynamic(serde_json::json!(42)).as_int().unwrap(), 42);
891 - assert_eq!(json_to_dynamic(serde_json::json!(3.14)).as_float().unwrap(), 3.14);
891 + assert_eq!(json_to_dynamic(serde_json::json!(2.72)).as_float().unwrap(), 2.72);
892 892 assert_eq!(
893 893 json_to_dynamic(serde_json::json!("hello")).into_string().unwrap(),
894 894 "hello"
@@ -903,7 +903,7 @@ mod tests {
903 903 assert_eq!(arr.len(), 3);
904 904 assert_eq!(arr[0].as_int().unwrap(), 1);
905 905 assert_eq!(arr[1].clone().into_string().unwrap(), "two");
906 - assert_eq!(arr[2].as_bool().unwrap(), true);
906 + assert!(arr[2].as_bool().unwrap());
907 907 }
908 908
909 909 #[test]
@@ -820,9 +820,9 @@ fn describe() {
820 820
821 821 // ImportOptions derives Default, so has_header is false (the
822 822 // serde default_true function only applies during deserialization).
823 - assert_eq!(map.get("has_header").unwrap().as_bool().unwrap(), false);
824 - assert!(map.get("delimiter").is_none());
825 - assert!(map.get("date_format").is_none());
823 + assert!(!map.get("has_header").unwrap().as_bool().unwrap());
824 + assert!(!map.contains_key("delimiter"));
825 + assert!(!map.contains_key("date_format"));
826 826 }
827 827
828 828 #[test]
@@ -840,7 +840,7 @@ fn describe() {
840 840
841 841 let map = options_to_rhai_map(&options);
842 842
843 - assert_eq!(map.get("has_header").unwrap().as_bool().unwrap(), false);
843 + assert!(!map.get("has_header").unwrap().as_bool().unwrap());
844 844 assert_eq!(
845 845 map.get("delimiter").unwrap().clone().into_string().unwrap(),
846 846 "\t"
@@ -0,0 +1,68 @@
1 + -- Split email_accounts sync: credentials stay per-device, config syncs.
2 + -- Drops the 3 existing triggers (migration 032) and recreates them
3 + -- capturing only 16 columns — excludes password, oauth2_access_token,
4 + -- oauth2_refresh_token, oauth2_token_expires_at (and last_sync_at as before).
5 +
6 + DROP TRIGGER IF EXISTS sync_trg_email_accounts_insert;
7 + DROP TRIGGER IF EXISTS sync_trg_email_accounts_update;
8 + DROP TRIGGER IF EXISTS sync_trg_email_accounts_delete;
9 +
10 + -- ── email_accounts (16 cols: config only, no credentials) ──
11 +
12 + CREATE TRIGGER IF NOT EXISTS sync_trg_email_accounts_insert
13 + AFTER INSERT ON email_accounts
14 + WHEN (SELECT value FROM sync_state WHERE key = 'applying_remote') != '1'
15 + BEGIN
16 + INSERT INTO sync_changelog (table_name, op, row_id, data)
17 + VALUES ('email_accounts', 'INSERT', NEW.id, json_object(
18 + 'id', NEW.id,
19 + 'user_id', NEW.user_id,
20 + 'account_name', NEW.account_name,
21 + 'email_address', NEW.email_address,
22 + 'imap_server', NEW.imap_server,
23 + 'imap_port', NEW.imap_port,
24 + 'smtp_server', NEW.smtp_server,
25 + 'smtp_port', NEW.smtp_port,
26 + 'username', NEW.username,
27 + 'use_tls', NEW.use_tls,
28 + 'created_at', NEW.created_at,
29 + 'archive_folder_name', NEW.archive_folder_name,
30 + 'auth_type', NEW.auth_type,
31 + 'jmap_session_url', NEW.jmap_session_url,
32 + 'jmap_account_id', NEW.jmap_account_id,
33 + 'sync_interval_minutes', NEW.sync_interval_minutes
34 + ));
35 + END;
36 +
37 + CREATE TRIGGER IF NOT EXISTS sync_trg_email_accounts_update
38 + AFTER UPDATE ON email_accounts
39 + WHEN (SELECT value FROM sync_state WHERE key = 'applying_remote') != '1'
40 + BEGIN
41 + INSERT INTO sync_changelog (table_name, op, row_id, data)
42 + VALUES ('email_accounts', 'UPDATE', NEW.id, json_object(
43 + 'id', NEW.id,
44 + 'user_id', NEW.user_id,
45 + 'account_name', NEW.account_name,
46 + 'email_address', NEW.email_address,
47 + 'imap_server', NEW.imap_server,
48 + 'imap_port', NEW.imap_port,
49 + 'smtp_server', NEW.smtp_server,
50 + 'smtp_port', NEW.smtp_port,
51 + 'username', NEW.username,
52 + 'use_tls', NEW.use_tls,
53 + 'created_at', NEW.created_at,
54 + 'archive_folder_name', NEW.archive_folder_name,
55 + 'auth_type', NEW.auth_type,
56 + 'jmap_session_url', NEW.jmap_session_url,
57 + 'jmap_account_id', NEW.jmap_account_id,
58 + 'sync_interval_minutes', NEW.sync_interval_minutes
59 + ));
60 + END;
61 +
62 + CREATE TRIGGER IF NOT EXISTS sync_trg_email_accounts_delete
63 + AFTER DELETE ON email_accounts
64 + WHEN (SELECT value FROM sync_state WHERE key = 'applying_remote') != '1'
65 + BEGIN
66 + INSERT INTO sync_changelog (table_name, op, row_id, data)
67 + VALUES ('email_accounts', 'DELETE', OLD.id, NULL);
68 + END;
@@ -81,12 +81,6 @@ keyring = { workspace = true }
81 81
82 82 # === Desktop-only dependencies (not available on iOS/Android) ===
83 83
84 - # macOS-only: dock icon
85 - [target.'cfg(target_os = "macos")'.dependencies]
86 - objc2 = "0.5"
87 - objc2-app-kit = { version = "0.2", features = ["NSApplication", "NSImage", "NSResponder"] }
88 - objc2-foundation = { version = "0.2", features = ["NSData", "NSThread"] }
89 -
90 84 # Desktop-only: plugins that require desktop window management
91 85 [target.'cfg(not(any(target_os = "ios", target_os = "android")))'.dependencies]
92 86 tauri-plugin-shell = { workspace = true }
@@ -7,12 +7,7 @@
7 7 <key>teamID</key>
8 8 <string>93C54W92UP</string>
9 9 <key>signingStyle</key>
10 - <string>manual</string>
11 - <key>provisioningProfiles</key>
12 - <dict>
13 - <key>com.goingson.app</key>
14 - <string>GoingsOn App Store</string>
15 - </dict>
10 + <string>automatic</string>
16 11 <key>signingCertificate</key>
17 12 <string>Apple Distribution</string>
18 13 </dict>
@@ -1,17 +1,20 @@
1 + # Based on Ayu by Konstantin Pschera — MIT License
2 + # https://github.com/ayu-theme
3 +
1 4 [meta]
2 5 name = "Ayu Light"
3 6 variant = "light"
4 7
5 8 [background]
6 9 primary = "#e7eaed"
7 - secondary = "#e7eaed"
8 - tertiary = "#d8d8d7"
9 - surface = "#fafafa"
10 + secondary = "#dde1e5"
11 + tertiary = "#d0d4d8"
12 + surface = "#f2f4f6"
10 13
11 14 [foreground]
12 15 primary = "#5c6166"
13 16 secondary = "#6b7580"
14 - muted = "#6b7580"
17 + muted = "#8b9199"
15 18
16 19 [accent]
17 20 red = "#f07171"
@@ -1,3 +1,6 @@
1 + # Based on Catppuccin by Catppuccin Org — MIT License
2 + # https://github.com/catppuccin/catppuccin
3 +
1 4 [meta]
2 5 name = "Catppuccin Latte"
3 6 variant = "light"
@@ -1,3 +1,6 @@
1 + # Based on Catppuccin by Catppuccin Org — MIT License
2 + # https://github.com/catppuccin/catppuccin
3 +
1 4 [meta]
2 5 name = "Catppuccin Mocha"
3 6 variant = "dark"
@@ -1,3 +1,6 @@
1 + # Based on Dracula by Dracula Theme — MIT License
2 + # https://github.com/dracula/dracula-theme
3 +
1 4 [meta]
2 5 name = "Dracula"
3 6 variant = "dark"
@@ -0,0 +1,28 @@
1 + # Based on Everforest by sainnhe — MIT License
2 + # https://github.com/sainnhe/everforest
3 +
4 + [meta]
5 + name = "Everforest"
6 + variant = "dark"
7 +
8 + [background]
9 + primary = "#2d353b"
10 + secondary = "#272e33"
11 + tertiary = "#3d484d"
12 + surface = "#343f44"
13 +
14 + [foreground]
15 + primary = "#d3c6aa"
16 + secondary = "#9da9a0"
17 + muted = "#7a8478"
18 +
19 + [accent]
20 + red = "#e67e80"
21 + green = "#a7c080"
22 + blue = "#7fbbb3"
23 + yellow = "#dbbc7f"
24 + purple = "#d699b6"
25 + cyan = "#83c092"
26 +
27 + [border]
28 + default = "#3d484d"
@@ -1,3 +1,6 @@
1 + # Based on Flatwhite by biletskyy — MIT License
2 + # https://github.com/biletskyy/flatwhite-syntax
3 +
1 4 [meta]
2 5 name = "Flatwhite"
3 6 variant = "light"
@@ -10,8 +13,8 @@ surface = "#f7f3ee"
10 13
11 14 [foreground]
12 15 primary = "#605a52"
13 - secondary = "#93836c"
14 - muted = "#8a7b68"
16 + secondary = "#786d5e"
17 + muted = "#9a8b78"
15 18
16 19 [accent]
17 20 red = "#ff1414"
@@ -0,0 +1,28 @@
1 + # Based on Gruvbox by Pavel Pertsev (morhetz) — MIT License
2 + # https://github.com/morhetz/gruvbox
3 +
4 + [meta]
5 + name = "Gruvbox Dark"
6 + variant = "dark"
7 +
8 + [background]
9 + primary = "#282828"
10 + secondary = "#1d2021"
11 + tertiary = "#504945"
12 + surface = "#3c3836"
13 +
14 + [foreground]
15 + primary = "#ebdbb2"
16 + secondary = "#d5c4a1"
17 + muted = "#a89984"
18 +
19 + [accent]
20 + red = "#fb4934"
21 + green = "#b8bb26"
22 + blue = "#83a598"
23 + yellow = "#fabd2f"
24 + purple = "#d3869b"
25 + cyan = "#8ec07c"
26 +
27 + [border]
28 + default = "#504945"
@@ -0,0 +1,28 @@
1 + # Based on Gruvbox by Pavel Pertsev (morhetz) — MIT License
2 + # https://github.com/morhetz/gruvbox
3 +
4 + [meta]
5 + name = "Gruvbox Light"
6 + variant = "light"
7 +
8 + [background]
9 + primary = "#fbf1c7"
10 + secondary = "#f2e5bc"
11 + tertiary = "#d5c4a1"
12 + surface = "#f9f5d7"
13 +
14 + [foreground]
15 + primary = "#3c3836"
16 + secondary = "#504945"
17 + muted = "#7c6f64"
18 +
19 + [accent]
20 + red = "#9d0006"
21 + green = "#79740e"
22 + blue = "#076678"
23 + yellow = "#b57614"
24 + purple = "#8f3f71"
25 + cyan = "#427b58"
26 +
27 + [border]
28 + default = "#d5c4a1"
@@ -1,12 +1,14 @@
1 + # Original GoingsOn theme
2 +
1 3 [meta]
2 4 name = "High Contrast"
3 5 variant = "high-contrast"
4 6
5 7 [background]
6 8 primary = "#000000"
7 - secondary = "#0a0a0a"
8 - tertiary = "#1a1a1a"
9 - surface = "#0d0d0d"
9 + secondary = "#141414"
10 + tertiary = "#262626"
11 + surface = "#0a0a0a"
10 12
11 13 [foreground]
12 14 primary = "#ffffff"
@@ -0,0 +1,28 @@
1 + # Based on Kanagawa by Tommaso Laurenzi (rebelot) — MIT License
2 + # https://github.com/rebelot/kanagawa.nvim
3 +
4 + [meta]
5 + name = "Kanagawa"
6 + variant = "dark"
7 +
8 + [background]
9 + primary = "#1F1F28"
10 + secondary = "#16161D"
11 + tertiary = "#2A2A37"
12 + surface = "#363646"
13 +
14 + [foreground]
15 + primary = "#DCD7BA"
16 + secondary = "#C8C093"
17 + muted = "#727169"
18 +
19 + [accent]
20 + red = "#E46876"
21 + green = "#98BB6C"
22 + blue = "#7E9CD8"
23 + yellow = "#E6C384"
24 + purple = "#957FB8"
25 + cyan = "#7FB4CA"
26 +
27 + [border]
28 + default = "#54546D"
@@ -1,3 +1,5 @@
1 + # Original GoingsOn theme
2 +
1 3 [meta]
2 4 name = "Neobrute"
3 5 variant = "light"
@@ -1,3 +1,6 @@
1 + # Based on Nord by Sven Greb — MIT License
2 + # https://github.com/nordtheme/nord
3 +
1 4 [meta]
2 5 name = "Nord"
3 6 variant = "dark"
@@ -0,0 +1,28 @@
1 + # Based on Rose Pine by mvllow — MIT License
2 + # https://github.com/rose-pine/rose-pine-theme
3 +
4 + [meta]
5 + name = "Rose Pine Dawn"
6 + variant = "light"
7 +
8 + [background]
9 + primary = "#faf4ed"
10 + secondary = "#f2e9e1"
11 + tertiary = "#dfdad9"
12 + surface = "#fffaf3"
13 +
14 + [foreground]
15 + primary = "#575279"
16 + secondary = "#797593"
17 + muted = "#9893a5"
18 +
19 + [accent]
20 + red = "#b4637a"
21 + green = "#286983"
22 + blue = "#56949f"
23 + yellow = "#ea9d34"
24 + purple = "#907aa9"
25 + cyan = "#d7827e"
26 +
27 + [border]
28 + default = "#dfdad9"
@@ -0,0 +1,28 @@
1 + # Based on Rose Pine by mvllow — MIT License
2 + # https://github.com/rose-pine/rose-pine-theme
3 +
4 + [meta]
5 + name = "Rose Pine"
6 + variant = "dark"
7 +
8 + [background]
9 + primary = "#191724"
10 + secondary = "#1f1d2e"
11 + tertiary = "#26233a"
12 + surface = "#1f1d2e"
13 +
14 + [foreground]
15 + primary = "#e0def4"
16 + secondary = "#908caa"
17 + muted = "#6e6a86"
18 +
19 + [accent]
20 + red = "#eb6f92"
21 + green = "#31748f"
22 + blue = "#9ccfd8"
23 + yellow = "#f6c177"
24 + purple = "#c4a7e7"
25 + cyan = "#ebbcba"
26 +
27 + [border]
28 + default = "#403d52"