Sign in

Christopher Jr Riley

@cjrriley.ca
2.3K followers 299 following 5.9K posts

Resilient Autistic that loves solving problems with Swift. Make the world more accessible. 🇨🇦 Currently working on ATProtoKit. #atdev (Profile pic drawn by kaylee_acnh on Twitter.)

PostsRepliesMedia
Christopher Jr Riley @cjrriley.ca · 13/10/2026
I… what? They’re going to update an app for a service that’s going to be killed off in a few months. Absolutely insane. 💀
Partial screenshot of the iOS App Store, showing the update page. It displays the Tapas app icon and the Update button.

Text:
“Tapas — Comics and Novels
Today

- Updated to the new Liquid Glass design
- Minor bug fixes

Version 7.13.1 • 86.1 MB”
000
Christopher Jr Riley @cjrriley.ca · 29/09/2026
Before you say anything: I KNOW.
A screenshot of a Safari extension called "Tab Counter," listing the number of open tabs across six different browser windows. The first two windows are labeled "Start Page" with 249 and 32 tabs respectively, followed by "Window 3" with 56 tabs, "Window 4" with 402 tabs, "Window 5" with 515 tabs, and "Window 6" with 447 tabs. The final row shows a total of 1,701 tabs.
010
Christopher Jr Riley @cjrriley.ca · 25/08/2026
I've finally started basic work on the Swift package for the PDS (which will now be called "ATPDSServer." That's three files converted and (*checks notes*) ~290 files left to go. 😵‍💫 (This will probably take well over a year.)
Screenshot of Xcode, showing a Markdown file containing text that says a TypeScript method isn't needed and won't be converted to Swift. A navigation of the Swift package containing all of its files is shown on the left.
120
Christopher Jr Riley @cjrriley.ca · 18/08/2026
I'm happy to say that everything appears to be in order with respect to getting OAuth to work. The only thing I had to cut out was getting Apple Passwords to add the password to the text field. Other than that, this is happening in real-time. Hopefully you believe me with respect to this now.
111
Christopher Jr Riley @cjrriley.ca · 18/08/2026
Here's a sneak peak of what you can expect to see with respect to the OAuth walkthrough. I'm meticulously writing and reviewing everything to make sure things are accurate and understandable.
Screenshot showing part of a written tutorial for implementing OAuth with ATProtoKit, alongside code examples.
110
Christopher Jr Riley @cjrriley.ca · 10/08/2026
Getting there... ATProtoKit +ATIdentityTools + OAuthenticator + Jot (Context: made a tiny macOS app that can log into your account using OAuth.)
Screenshot of a macOS window, consisting of a text box for entering a handle, a "Sign in with AT Protocol" button, a green text that says "Signed In. ATProtoKit is ready.", a "Verify authenticated session" button , and a "Sign Out" button.
2261
Christopher Jr Riley @cjrriley.ca · 03/08/2026
"With regards to" is the term that haunts me, ever since I was... maybe 11 or 12, I don't remember. The worst part is that the grammar checker tells me this is a terrible term and makes me feel like an idiot...
Is this an error for 'With regard to'? Try 'Concerning' or 'About' instead.
220
Christopher Jr Riley @cjrriley.ca · 06/07/2026
What I have so far. Yes, I know that it looks confusing as hell. I'm going to try to solve that by inserting a crap ton of documentation for each declaration, as needed.
#Playground {
    let firstDeclaration = DeclarationContainer(isStatic: false, name: "name", type: .string, isOptional: true, defaultValue: DefaultValue.string("value"))
    let secondDeclaration = DeclarationContainer(isStatic: true, name: "age", type: .int, isOptional: false, defaultValue: DefaultValue.int(20))

    let declaration = StructContainer.initializer(declarations: [firstDeclaration, secondDeclaration], lexiconModelName: "testlexiconmodel")
    print(declaration)

    guard let tree = NSIDTree.build(nsid: "dev.atproto.repo") else { return }
    print(tree.component)                  // "repo"
    print(tree.parent?.component ?? "-")   // "atproto"
    print(tree.fullPath)                   // "dev.atproto.repo"

    print(TopLevelContainer.topLevelComments(fileName: "Test"))
    print(TopLevelContainer.import)

    let nsidTree = NSIDTree.build(nsid: "dev.atproto.repo")?.component
    print(nsidTree?.capitalized ?? "-")
}
100
Christopher Jr Riley @cjrriley.ca · 03/07/2026
This feels... very, very intimidating, don't you think?
Then use the createPostRecord(text:inlineFacets:locales:replyTo:embed:labels:tags:creationDate:replyControls:embeddingRules:recordKey:shouldValidate:swapCommit:) method. While this method is extremely extensive, we’re only going to focus on the text parameter.
130
Christopher Jr Riley @cjrriley.ca · 02/07/2026
I am going to scream. 🫠
A screenshot of a git commit message.

Text:

"Update REDME

Updated with new method signatures."

The word "Updated" has both the 'U' and 'P' capitalized.
110
Christopher Jr Riley @cjrriley.ca · 20/06/2026
The vast majority of bug fixes are thanks to community contributors like you. Thank you!
A list of contributors via their profile pictures, of which there are seven of them.

Bottom text: "aaronvegh, mvanhorn, and 5 other contributors".
020
Christopher Jr Riley @cjrriley.ca · 26/05/2026
I forgot to share the molecules. Sorry: here's what I've made.
An assortment of web elements for my personal website, which contains some textfields, a search bar, a checkbox + label, a radio button + label, a tooltip component, a segmented control, a reaction + label button, an inline code, and a code block + caption.
100
Christopher Jr Riley @cjrriley.ca · 20/05/2026
Well, this is what I have so far, but there's a lot more molecules to make. Such as: - Button groups (both the normal way and the groups for a navigation bar) - Social link group - Simple input field group - Tooltip - Breadcrumbs - Banners - Share Sheet (will need to add a Copy Link icon) ...
A screenshot of a number of web elements, including a single line and multi line input fields, a search field, a checkmark, a radio button, inline code, and a code block.
100
Christopher Jr Riley @cjrriley.ca · 19/05/2026
Okay, so... I've set the colour of the copy code button to one that I can live with for now (since I can feel the analysis paralysis kicking in). As for WCAG, it passed Level AAA. This is what it's going to look like for now. Obviously, I'll tweak it post-launch of the website. Next.
A screenshot of a code block. Several lines of Swift code are written here. On the left are the line numbers and the indentation indicators. On the top-right corner is a blue button for copying the code.A WCAG Compliance Results table. The table states that the two colours passes Level AA for small text, large text, and UI components. It states that it passes Level AAA for large text and UI components, but fails Level AAA for small text.
020
Christopher Jr Riley @cjrriley.ca · 19/05/2026
Ugh... I really don't know what exactly I want to have with respect to the button. Because the options I have are extremely limited due to my (admittedly, very stubborn mindset) boundary of making sure that I stay at WCAG Level AAA as much as possible. This doesn't even look like a button...
A screenshot of a code block. Several lines of Swift code is written in the block. There's a blue button for copying the code on the top-right corner. On the left side, there are the line numbers, as well as the indentation indicators.
220
Christopher Jr Riley @cjrriley.ca · 19/05/2026
Hmm... WCAG-wise, it generally passes Level AAA. Design-wise, the button itself feels out of place... I suppose I can make it where the icon itself is the button, but I'll put a highlight ring around it for accessibility purposes.
A screenshot of a code block. Several lines of Swift code is written in the block. To the left are the intention indicators and the line numbers. There is a blue button for copying the code on the top right corner.
021
Christopher Jr Riley @cjrriley.ca · 19/05/2026
Atoms are all done. The next thing now is to work on the molecules. I've (mostly) finished the code block molecule. ... yeah, the code block is very... um... uninspired. But I needed *something* and this was the best sample code I could come up with.
A screenshot of a code block. It has several lines of code written inside of it. To the left are the line number indicators, as well as several lines indicating the indentation of the code.
111
Christopher Jr Riley @cjrriley.ca · 18/05/2026
The new icons took me the whole night and I'm frustrated it didn't take a shorter timeframe...
Screenshot of various icons, as well as the logo for my personal brand, and a segmented control. The segmented control has three buttons: "Great UI," "Great UX," and "Research."
120
Christopher Jr Riley @cjrriley.ca · 17/05/2026
It's not much, but it's honest work. I'll make some more icons (like one for privacy, one for terms, one for downloads (maybe...), icons for a comment system, and a couple of other icons), but for right now, this works for me.
A screenshot of Penpot, consisting of a collection of buttons, textfields, checkboxes, radio buttons, and icons.
110
Christopher Jr Riley @cjrriley.ca · 16/05/2026
Although...
A screenshot of some of the HTML and CSS code for the date selector.
100
Christopher Jr Riley @cjrriley.ca · 16/05/2026
It would probably be a nightmare to recreate this in CSS.
A screenshot of a date selector.
100
Christopher Jr Riley @cjrriley.ca · 16/05/2026
This took five hours... 😑 I'm such a slow person. I wish I wasn't. Just want to clarify: the last two are icon buttons. I *could* make one with the icon and word, but... I don't expect to use that sort of thing for now (in my personal website).
A group of blue buttons.
200
Christopher Jr Riley @cjrriley.ca · 16/05/2026
For example, if you look at a forest, most people will see the whole forest, then will see the trees. I... will try to look at the individual freaking leaves before realizing there's a forest. 😑
A forest with hills.
100
Christopher Jr Riley @cjrriley.ca · 16/05/2026
I've started to deal with the Atomic Design stuff, and I'm adding and modifying the Design Tokens as I go on.
A screenshot of Penpot workspace, displaying various buttons.
100
Christopher Jr Riley @cjrriley.ca · 15/05/2026
Design Token time!
A group of design tokens, consisting of radius numbers and groups of colours.
110
Christopher Jr Riley @cjrriley.ca · 14/05/2026
... meh. Close enough to what I wanted. Kind of getting the hang of making CSS animations and transitions, but *man*... I wish there an application that would let me do things more cleanly and easily.
100
Christopher Jr Riley @cjrriley.ca · 13/05/2026
I do want to point out that I've adjusted the spacing of the characters. I did consider just typing things out and leaving it as-is. However, as you can see here, it's fairly awkward for a logo. The spacing is perfectly fine for normal text, but I paid extra attention to it for my logo.
A screenshot of "C. Jr. Riley" written twice. The first one is spaced out normally from Atkinson Hyperlegible Mono. The second version lacks periods, and the spacing is customized in-between each character.
200
Christopher Jr Riley @cjrriley.ca · 13/05/2026
My logo for my personal brand. Text is from Atkinson Hyperlegible Mono. There's still some tweaks that I'll be making overtime (especially the optical balance), but for now, this what I'm going to use. I'll be making an animation for it at some point in the future.
Logo of my personal website. The logo consists of an infinity symbol, with an opening on the left side and two leaves at the end of the opening. On the right side is the text "C Jr Riley" written in Atkinson Hyperlegible Mono in its Extra Bold thickness. The "Jr" text is smaller and on top of a black square.
230
Christopher Jr Riley @cjrriley.ca · 04/05/2026
Oh, so THAT'S why the sun's rays are on the moon on an icon like this. I get it now. Lesson learned. (I should re-do some graphic design lessons; I'm so damn rusty...)
An icon of a crescent moon and a sun overlapping, with the sun's rays awkwardly attached to the sun portion. The icon is inside of a black circle, which the circle itself is inside of a dark grey background.
000
Christopher Jr Riley @cjrriley.ca · 04/05/2026
So... Pixel-wise, they're fine. Optically-wise, they SUCK. Also, I completely forgotten that the sun is on the right side, which means the rays should be on the... right side (for the last icon).
A set of icons in a vertical format. Each icon is inside of a black circle, which each of those circles are inside of a dark grey square.

The icons include (from top to bottom):
1) Two overlapping hollow circles, with the left one made out of dashed lines.
2) A hollow circle with three lines on the left.
3) A hollow computer.
4) A hollow sun.
5) A hollow crescent moon.
6) A combination of the sun and the moon, with the sun's rays not appearing on the right side.
100
Christopher Jr Riley @cjrriley.ca · 27/04/2026
Okay: I got the mobile navigation bar fully working. And the desktop version is okay as well. Design is not final. Colours aren't final, either (obviously).
131
Christopher Jr Riley @cjrriley.ca · 27/04/2026
"You're so indecisive!" "I know. 🫠" Yes, this is the colour palette I've chosen. Now I *hope* that my brain doesn't look at this and thinks this is amateur-ish...
A collection of shades of blues, neutrals, oranges, and reds for the purpose of a colour palette.
100
Christopher Jr Riley @cjrriley.ca · 25/04/2026
*sigh... I couldn't help myself. I looked at my previous colour scheme and I felt like I'm being an amateur graphic designer for just leaving it like it is now, so I went ahead and created a better colour palette (+ added orange to the mix). NOW I feel comfortable.
A palette of blues, oranges, and reds + a pure white colour.
100
Christopher Jr Riley @cjrriley.ca · 23/04/2026
Okay: this looks *much* better now. I *might* do a slight tweak in the navigation, but overall, I think this is the colour contrast that I want.
A screenshot of a dark mode, mobile version of my work in progress website. The header and footer navigation are both coloured a light shade of blue, while the background is a darker shade of blue.
010
Christopher Jr Riley @cjrriley.ca · 23/04/2026
Oh, cool! This combination is Level AAA compliant. I suspect that the even darker variant will also be compliant. Nice!
Interface showing an accessibility contrast checker with a AAA rating and a score of 9.09 for the color pair light blue (#E7EFFD) and dark blue (#003B8B).
000
Christopher Jr Riley @cjrriley.ca · 23/04/2026
I... can live with this. I think it represents me enough. And I think having a red version should be simple enough to have as well. I suppose I still got it when it comes to choosing brand colours, though it's been a while since my last brand design client, so you can be the judge of that.
Screenshot of five shades of blue.

Text:
Glitter: hsl(218, 85%, 95%)
Hawkes Blue: hsl(215, 81%, 89%)
Cornflower Blue: hsl(215, 82%, 67%)
Air Force Blue: hsl(215, 100%, 27%)
Midnight: hsl(216, 96%, 9%)
100
Christopher Jr Riley @cjrriley.ca · 23/04/2026
I... suppose this explains why I'm not 100% rejecting it, and only 80% rejecting it.
The colours of a light shade of blue, light shade of orange, and light shade of lime green.
000
Christopher Jr Riley @cjrriley.ca · 23/04/2026
Okay, I admit that this is... better... than expected. But I still hate the tomato colour. It's cringe and I hate the colour. I love red, but this shade of red (looks more "orange" than "red") sucks and I feel it doesn't fit me at all.
A screenshot of the dark mode mobile version of my work in progress website. The background is a dark shade of blue. The header and footer navigation is coloured in a "tomato"-like shade of red-orange.
100
Christopher Jr Riley @cjrriley.ca · 22/04/2026
Yes, I'm aware it looks like an absolute dumpster fire by the looks of the tomato-colour alone, but I promise it will go away eventually. It's just temporary so that I can figure out where those damn containers are located.
Screenshot of a mobile version of my work in progress website. The background is blue with the exception of the header and footer navigation links, which are red. So sample text is in the middle.
110
Christopher Jr Riley @cjrriley.ca · 04/04/2026
Alright, time for me to convert the OpenAPI stuff to Swiiiii... ... ohhhhhhhhhhhh. ... ohhhhh. ... oh. (I'm cooked, aren't I? Yep: I'm cooked. I am *so* cooked. 💀)
200
Christopher Jr Riley @cjrriley.ca · 03/04/2026
Per tradition, Swift Package Index is saying that some Darwin platform and/or Linux fails to build, this time, with ATLexiconTools. ... is what I would have said if it actually happened, but it seems like I actually got it right the first time. Woohoo!
A screenshot of the Swift Package Index entry for ATLexiconTools, specifically showing the compatibility matrix. The screenshot shows that the Swift package is building successfully on iOS, macOS, visionOS, watchOS, tvOS, Linux, WebAssembly, and Android on Swift 6.0, 6.1, and 6.2.
010
Christopher Jr Riley @cjrriley.ca · 03/04/2026
This took a little over a year to complete. 😭
ATLexiconTools
Folder - 381.4 MB

Information
Created March 28, 2025 at 1:38 PM
020
Christopher Jr Riley @cjrriley.ca · 03/04/2026
With this icon, I'm... still not 100% happy with it, but it works for now. Obviously, changes will be made overtime, but overall, this is okay.
An icon for ATLexiconTools, which contains three stacks of rounded rectangles in an isometric top view. At the top stack, there's an at symbol in a thick weight, with a pointed arrow at the tip. The at symbol is inside of an orange puzzle piece, which is on top of a red background. The three stacks are, from top to bottom, red, orange, and blue.
020
Christopher Jr Riley @cjrriley.ca · 28/03/2026
Done. I've finally completed the dang unit tests. I powered through, but I did it. Now for the other stuff: - DocC - Swift Package Index metadata - creating the logo - Creating the README - GitHub backend (such as actions) - Adding the licence ... so yeah: not done, but the hard part's over. 😌
A long list of unit tests for ATLexiconTools.

Beside their names are green diamonds with checkmarks inside them, signifying that the unit tests have passed.
131
Christopher Jr Riley @cjrriley.ca · 21/03/2026
Here's all of the tests I've worked on for ATLexiconTools. I am... a quarter of the way there (and I haven't even completed the last one).
Screenshot of Xcode's Test Navigator, with a list of tests for ATLexiconTools.
The following tests are as follows:
- Validates records correctly
- Validates objects correctly
- Fails when a required property is missing
- Allows unknown fields to be present
- Fails lexicon parsing when URI is invalid
- Fails validation when 'ref' URI has multiple hash segments
- Union handles both implicit and explicit #main
- Registry rejects duplicate lexicons
- Correctly references all definitions
- Passes valid schemas
- Fails invalid input types
- Fails incorrect $type
- Fails missing 'required' fields
- Fails incorrect types
130
Christopher Jr Riley @cjrriley.ca · 25/01/2026
The OpenAPI generator documentation says that "allOf" is supported. And "components/schemas/UpdateDMRequestPartial" exists. However, when generating... it doesn't exist? Either I'm going crazy, or I'm fundamentally misreading something...
      "patch": {
        "operationId": "update_channel",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/UpdateDMRequestPartial"
                  },
                  {
                    "$ref": "#/components/schemas/UpdateGroupDMRequestPartial"
                  },
                  {
                    "$ref": "#/components/schemas/UpdateGuildChannelRequestPartial"
                  },
                  {
                    "$ref": "#/components/schemas/UpdateThreadRequestPartial"
                  }
                ],
                "x-discord-union": "oneOf"
              }
            }
          },
          "required": true
        },- allOf
  - a wrapper struct is generated, children can be any schema
- oneOf
  - if a discriminator is specified, each child must be a reference to an object schema
  - if no discriminator is specified, children can be any schema
- anyOf
  - a wrapper struct is generated, children can be any schema      "UpdateDMRequestPartial": {
        "type": "object",
        "properties": {
          "name": {
            "type": [
              "string",
              "null"
            ],
            "minLength": 0,
            "maxLength": 100
          }
        }
      },
100
Christopher Jr Riley @cjrriley.ca · 24/01/2026
With that said, oh dear...
Screenshot of the build results for a Swift package. The text contains multiple warnings related to OpenAPI incompatibilities with the Swift OpenAPI Generator.
100
Christopher Jr Riley @cjrriley.ca · 18/01/2026
According to WKStats, I've learned the vast majority of Kanji that a first grader would have learned (the pink is still "Apprentice," but I expect it to be tuned to a different colour soon). I'm wondering what first grader things I can read to get used to the Kanji more.
Screenshot of WKStats, displaying a grid of Kanji that are learned throughout Grade 1.

Kanji that have been unlocked but not learned yet: 学,林,校,森,空,草,金,雨,青,音
Kanji at Apprentice level: 名,休,先,村,糸,花,虫,見,貝,赤,足,車
Kanji at Guru level: 早,正,気,町,百,石,竹,耳,下,字,年,手,月,木,本,火,生,男
Kanji at Master level: 一,七,三,上,中,九,二,五,人,入,八,六,円,出,力,十,千,口,右,四,土,夕,大,天,女,子,小,山,川,左,文,日,水,犬,玉,王,田,白,目,立
120
Christopher Jr Riley @cjrriley.ca · 12/01/2026
Wait, this might be a problem... That is, I have no idea if it will work still, or if it'll break because of underlying changes in Vapor's code.
3.1.2
Latest Released
"Released over 1 year ago" has been highlighted.
000
Christopher Jr Riley @cjrriley.ca · 08/01/2026
I feel like WaniKani is flipping the bird at me. I'm a bad person for thinking this... (I swear, I didn't do this on purpose! 😭)
Screenshot of the "Review Forecast" widget in WaniKani.

Top text: "Next 24 Hours: +72 Items". Bar chart by day shows Wednesday +19 (total 19), Thursday +65 (total 84), Friday +18 (total 102), Saturday +19 (total 121), and Sunday +11 (total 132).
000