cho.sh
Project Ganymede

Project Ganymede

import DisplayFlex from '@site/src/components/display-flex'

240612

240414

  • Added text placeholders. It was surprisingly hard to do it in UITextView and I'm surprised there's no easy way of doing this.
  • Tried to modify ProgressBar but failed
  • Completed Read View.

287818.jpeg

240319

Wrote a simple read view. Added timer for sending action. The send screen is done; all we need to do is the read screen.

Also, AI-gile could be another programming pattern. Gen Z does not know file directories. The gist is that we don't need to "organize" files as semantic search improves because whatever we search will pop up automatically. Just have a giant file-pile and semantic search when you need something. These searches have now become so smart that they search for synonyms and deeply nested contexts and text inside images.

240315

  • Added LogTail to Europa
  • Implemented Encryption and Attaching

240307

7681FE.gif

Rewriting Callisto with UIKit. Primarily because of the extensive jumble mess with SwiftUI.

240210

Restored server with FlightControl

240104

Server Crashed. migrating to Fly.io... Because I wanted a Vercel-like experience for backends. However migrating is a pain... because originally I wrote everything as CF workers functions. Such a stress, app is getting delayed and delayed

231224

9A391C.png 485E0B.png

231215

F47E19.gif

231122

  • There was a property in MSMessage of shouldExpire. The problem is that the recipient can override to keep the message, which we don't want.
  • Implemented Message Reading Functionality
  • I implemented proper loading view features, with fade-in and fade-out.

5D373F.gif

  • Refactored a lot of files
Callisto
├── Assets.xcassets
│   ├── Contents.json
│   └── iMessage App Icon.stickersiconset
│       └── Contents.json
├── Base.lproj
│   └── MainInterface.storyboard
├── Callisto.entitlements
├── CallistoLoadingView.swift
├── CallistoMessageReadingView.swift
├── CallistoMessageWritingView.swift
├── CallistoService.swift
├── CallistoView.swift
├── Info.plist
└── MessagesViewController.swift

231118

  • Linked the client side to
    • request server
    • pack it as MSMessage
    • send the message
    • dismiss the keyboard & request a compact presentation style
  • Pink Bubble?

CD9A62.jpg

231113

B9D4E6.png

When Test Fails

  • Refuses to Deploy

661CA2.png

When Test Passes

  • Deploys

92533C.png

231111

Used Prisma, Prisma Accelerate, PlanetScale, and Cloudflare Workers to create a simple server for the Ganymede Table Structure. Prisma layer makes three requests to the DB per 1 request to the server, albeit it probably would hit the Prisma Accelerate Layer, we can later optimize it with this document.

Composing Messages with 3 People Group Chat (Writer, Reader 1, Reader 2)

677F5A.png

When the Writer Tries to Read (Invalid)

3C6D29.png

When the Reader Tries to Read (Valid)

10F013.png

When the Reader Re-requests to Read (Invalid)

8CB950.png

When Another Reader Requests to Read (Valid)

A08F59.png

When an Unauthorized User Requests to Read (Invalid)

D54DB2.png

Also

231110

DF7DE6.gif

231108

  • It is possible to limit iMessage forwarding for iMessage Extensions
  • It is possible to mark the iMessage with LocalParticipantIdentifier
  • LocalParticipantIdentifier is different on all devices
  • The most straightforward way would be marking:
    • Set LocalParticipantIdentifier to true on reading (on the server)
    • Reject if LocalParticipantIdentifier is already true.
  • Problem: If the user deletes and reinstalls the app, LocalParticipantIdentifier changes. So the user can read unlimited times if the uninstall & reinstall
  • Mitigation: Assign UUID for each message. Each message will have LocalParticipantIdentifier + RemoteParticipantIdentifiers count as the maxRead. This will at least 'limit' the max read count.
  • Problem: on a Group Chat setting, a user can read unlimited times instead of another participant.
  • Solution: Sign in with Apple?!

231020

I can attach many images

A6A88D.png

231019

4A19CD.png 7637E1.png

231016

3185EF.png

231013

In iOS 17, Shortcuts can send messages without confirmation. Can we use this for Send Separately or Ganymede?

231012

  • Read notifications
  • Screenshot notifications
  • Broadcast
  • App Clip + Apple Login?
  • Therefore, we name it Project Ganymede. You can NEVER win Apple. It is the most massive system, just like Jupiter. Therefore, we choose to become a moon. The moon of Jupiter. And a moon can be bigger than planets. Ganymede is bigger than Mercury.

231009

I finished some working prototypes. Some concerns: It seems like the transcript MSMessage is an immutable object. We might consider server approaches, such as KV storage.

4425A0.gif

I don't want to store any encrypted or decrypted messages on the server. So we can consider something as:

  • When sending a message
  • When reading the message
    • extract UUID and encrypted message
    • read KV with UUID and delete the DecryptKey if any necessary condition is met
    • once it expires, the user cannot read the message again

Considerations

  • How do you store different strategies (After 5 seconds? 10 seconds? 15 seconds?)
  • Group chats
  • Photo / Video Payload
  • Screenshot detections and notifications

Prehistoric