← back to posts
                   ,»»»»»»»»»»≡»≡≡»»«≡≡≡╔╔╔╔╔╔╔╔╔╔╔╔╔,
                   !░│¡░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▒
                   !░!)φ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒╠╠
                   ]░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓]
                   ]░░╬╬╬╬╬╬╬╬╬╬╬╬╬╬▓▓]
                   ]░░╬╬╬╬╬╬╬╬╬╬╬╣╣▓▓▓▓▒╡
                   ]░░╬╬╬╬╬╬╬╬╬╬╬╬╣▓▓▓▓▓▓▒╡
                   ]╬╬╬╬╬╣╬╣╣╣╣╣▓▓▓▓▓▓╠╡
                   [▓╣╣╣╣╣▓╣▓▓▓▓▓▓▓▓▓▓██╠╡
                   [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓██╠╡
                   ]▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓████╠╡
                   [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█████╠╡
                   [░░└└└└└╙╙╙╙╙╙╙╙╙╙╙╙╙╙╙╙╙╙╙ ╠╡
                   [░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒╡
                   [░░░░░░░░░░░░░░░░░░░░░░▒▒▒░▒▒▒▒▒▒╡
                   [░░░░░░░░░░░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒╠╡
                   Γ░ΓΓΓΓ░╚╚░╚╚╚╚╚╚▀▀▀▀▀▀▀▀▀▀▀▀▀╠╠Γ
                   [░░░░░░░░░░░░░░░░░░░░░▒▒▒▒▒▒▒▒╠╠╡
                   φ░░░░░░░░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒╠╠
                   ░░░░░░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒╠Γ
                   ]╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
              _____]╣╣▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓____
       _ƒⁿ╙]M░ƒ∩░%∩░╔╔∩⌐ƒMƒƒM5²MδƒMΘφM░j∩>%^^(φƒ╕░ƒƒp░░Q
       .7DDφ≥▒5≥▒φ≥▒δUΓφ7ΓêÜê5Üφ5Üδ≤Üê5▒φ╠▒φ⌂Då5_"S"S"""Å"ⁿ-.,
╚╚╚δ╚╚δδδ╚╚╚╚╚╚╚╚╚╚╚╚╚╚╚╚╚╚╚╚╚W╚╚⌐╚╚W╚╚⌐╚╚Ü.-W╚╚╚╚╚ë╚╚ë╚╚Θ░      __`-
     =Q░░░░░░░░░░░░░░░░░░░░░░▒▒░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒

Chad or Soy

My latest project is now live at chadorsoy.com.

Download on the App Store

Chad or Soy is a social workout-tracking app built to help you flex on your friend group and promote consistency through social shaming/praising. IOS users get a push notification every day at 5PM with the question: did you work out today? Your answer is displayed in any group you've joined for the other members to either shame or praise.

My main motivation for this app was to learn more about SwiftUI and native IOS development. I started out using CloudKit and Apple's sharing/sync apis, but then some of my friends without IPhones wanted to join the groups. So I made a web version and moved as much of the logic as I could to the lambda functions on AWS. Then I migrated the ios app to use the same backend functions as the web app.

Chad or Soy web app demo
Chad or Soy group view
Chad or Soy home screen
Chad or Soy group log
Chad or Soy group status
Chad or Soy leaderboard

the app on iOS

The web version at chadorsoy.com offers the same features:

Chad or Soy web home post workout log
home and post-workout log
Chad or Soy web group list
group list
Chad or Soy web group view
group view
Chad or Soy web leaderboard
leaderboard
Chad or Soy web settings
settings
Chad or Soy web groups on mobile
Chad or Soy web join group on mobile
Chad or Soy web group view on mobile
Chad or Soy web group log on mobile
Chad or Soy web leaderboard on mobile
the web app on mobile

Groups

Groups use invite codes and deep links—share chadorsoy://group/ABC123 or chadorsoy.com/invite/ABC123 and recipients can join with one tap.


Serverless Backend

The app runs on native iOS (Swift/SwiftUI) and Next.js, backed by a shared AWS serverless stack. Both clients talk to API Gateway, which routes through a Lambda Authorizer for auth and a single Lambda handler for the API. Data lives in DynamoDB (Groups, GroupMembers, WorkoutEntries, Reactions, Notifications, UserProfiles, etc.); avatars go to S3.

    iOS (Swift)   Web (Next.js)
                │
          HTTPS + Bearer
                ▼
            API Gateway
                │
                ▼
   Lambda Authorizer → api.ts
                │
                ▼
        DynamoDB, S3, SNS