Profile banner
Profile picture

Chad

@chadtmiller.com

software engineer, atproto hacking,📍PDX Building @grain.social, a photo sharing platform for Bluesky grain profile: https://grain.social/profile/chadtmiller.com

created November 15, 2024

432 followers 307 following 178 posts

view profile on Bluesky

Posts

Profile picture Chad (@chadtmiller.com)

Stoked to spend some time in #ucluelet this week amongst the waves and the whistle buoy.

View of the harbor from downtown Ucluelet, British Columbia
2/9/2025, 7:36:27 PM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Great chatting, @bmann.ca! Excited to share more soon!

2/9/2025, 7:01:42 PM | 3 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

my favorite part of all the proxying stuff is when you eventually find this note in the OAuth docs > Proxying every call through the PDS is not recommended for performance reasons github.com/bluesky-soci...

1/9/2025, 4:02:09 PM | 7 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

The secret sauce. It’s been out for a few months now. I wouldn’t have launched @grain.social without it. Upcoming Slices appview builder uses this for backfill. My BFF library uses it as well but Slices is gonna be better. 🦀

31/8/2025, 8:07:38 PM | 6 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Stoked for scopes in AIP!

31/8/2025, 7:39:28 PM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

You can do it without AIP too. Just have your cli spin up a temporary server to catch the callback. Device code flow is better though. Your cli would poll a token endpoint until the code is authorized.

30/8/2025, 12:32:05 PM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

seeing an issue with the delete record dialog, it's way off to the right. everything else seems good so far!

image
29/8/2025, 6:46:58 PM | 1 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

So nice! I saw @bad-example.com was using it for slingshot and then went and checked it out!

29/8/2025, 12:09:34 AM | 3 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

Another thing I'm playing around with in Slices, auto-generated interactive Open API docs based on your lexicons. All collections get their own xrpc endpoints so you can interact with them via an http client. You can even export the Open API doc.

screen of the slices app showing open api docs with a panel open to modify and make a request
28/8/2025, 9:06:58 PM | 23 3 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Eventually, yes! I haven't tested any of the new scope stuff with the AIP flow. This is very POC getting this all working.

28/8/2025, 8:24:38 PM | 1 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Hope this works! 🤞 #atprotocol

28/8/2025, 5:36:49 PM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

tangled.sh/@chadtmiller...

28/8/2025, 5:36:49 PM | 1 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

Alright here we go! Statuspere the way it was meant to be statusphere.bigmoves.deno.net running as a fully synced AppView. Uses all new SDKs for running an AppView on Slices (a new appview service coming soon). Deployed with @deno.land deploy, uses Deno KV for session storage, OAuth with AIP ✨

28/8/2025, 5:36:49 PM | 14 1 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

The statusphere record is a true badge of honor in the atmosphere and should never be deleted

26/8/2025, 7:39:06 PM | 0 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Could also mean that people delete their statusphere records

26/8/2025, 7:37:16 PM | 1 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Yeah same. The metric means there are 350 unique repos where the statusphere record exists

26/8/2025, 7:35:19 PM | 0 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

I thought there would be more people trying out Statusphere honestly (unless my numbers are wrong). Maybe just confirms we need better appview tooling. Slices is coming to the rescue! #atprotocol

slices dashboard screen showing the statusphere slice with 3541 records synced, 1 collection, and 350 unique actors
26/8/2025, 7:12:49 PM | 7 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Yeah it’ll be open source

26/8/2025, 4:36:57 AM | 9 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Thanks, Boris!

26/8/2025, 2:56:09 AM | 0 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Yes, would be great to chat! Yeah Slices is not really intended to be IndieSky scale mostly focused on custom lexicons at the moment. I have a ko-fi setup ko-fi.com/bigmoves. Really appreciate the support!

26/8/2025, 2:41:09 AM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Working on a new OAuth client library as well to use directly with AIP jsr.io/@slices/oauth. Plugs into the Slices generated client.

26/8/2025, 1:12:30 AM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Hopefully launch soon or at least have something self-hostable to start playing around with.

25/8/2025, 11:59:25 PM | 11 1 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

If anyone is interested in funding/donating to this kinda thing let me know, there is still a lot of work to do. I don't currently work on this stuff full time but would love to. Making appviews more approachable is definitely something this community needs and happy to help. Anyways more soon ✌️

25/8/2025, 11:50:33 PM | 22 2 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Slices is a social app so a lot of things to explore!

25/8/2025, 11:50:33 PM | 15 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

I think Slices will be a great way for #atprotocol devs to share lexicons and allow others to build cool stuff on top of their data! Could even have a way to verify slices with their domin so @grain.social for example could have it's own verified index/lexicons to work with.

25/8/2025, 11:50:33 PM | 24 2 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Here's some example clients working against a @tangled.sh slice and a Statusphere slice. Slices frontend is also built on top of the same client using the Slices lexicon.

image image
25/8/2025, 11:50:33 PM | 21 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

I'm building all the codegen from the ground up and not connected to any of the existing node sdks for atproto. It also uses @graze.social 's AIP for authentication which unlocks a much better OAuth experience on atproto imo. Also using a lot of @ngerakines.me rust tools tangled.sh/@smokesignal...

25/8/2025, 11:50:33 PM | 29 1 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

Excited to share some new stuff I've been I've been working on. It's an appview for building appviews called Slices. A slice reads your lexicons, indexes your records from the Jetstream, does backfill and provides a typescript client to interact with your lexicon .listRecords, .searchRecords, etc

dashboard of slice showing how many records are indexed and links to other slice things like lexicons, record explorer, code gen, and sync. lexicon page showing an input to paste in a lexicon definition and press submit sync page showing collections from your lexicon ready to sync codegen page showing a generate client button, below the generated typescript for a slice which includes methods for interacting with your lexicon records
25/8/2025, 11:50:33 PM | 216 47 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

@grain.social runs on sqlite as well, single node shared instance lol

25/8/2025, 9:52:41 PM | 14 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

new @tangled.sh trending is rad ⚡️

25/8/2025, 6:52:53 PM | 9 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

For now, you could just tag as #ATProto_NYC in the gallery description and they will all show up on the hashtag page if everyone else does the same thing.

24/8/2025, 3:10:18 AM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Yes, it's something I want to support in the future! I was playing around with some ideas for that exact use case a while ago but got distracted by other stuff. I'll try to get back to it soon!

24/8/2025, 3:10:18 AM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Haha I thought that looked familiar!

23/8/2025, 4:14:05 AM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

Some pics off the 101 in Southern Oregon. Cape Blanco, Brookings, Boardman Corridor. Shot on the #ricohgrII grain.social/profile/chad...

23/8/2025, 2:43:32 AM | 6 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

#ATProto_NYC talks were awesome! I was on the live stream in spirit 🙌

23/8/2025, 1:08:25 AM | 7 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Atproto on Rails??

22/8/2025, 2:01:51 AM | 0 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

They are better than I expected! I fixed some bugs before launching that I thought for sure would show up again but it’s working great!

22/8/2025, 12:47:54 AM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

updated my pds and we're all good

18/8/2025, 6:46:38 PM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

views from the 101

image image image image
18/8/2025, 4:48:48 PM | 11 2 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

login doesn't seem to be working a self-hosted pds

18/8/2025, 4:15:50 PM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

perfect timing 👌

lighthouse at golden hour
17/8/2025, 2:58:36 AM | 5 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Yeah for sure, if possible or other people are interested that would be great!

15/8/2025, 2:42:55 PM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Grain could sync all of the @smokesignal.events events you've attended and show a dropdown on gallery create/edit.

15/8/2025, 2:38:51 PM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Wish I could make it! Anyone want to take some pics from the event and post to @grain.social? I've got some ideas for a @smokesignal.events collab where we could link a photo gallery to an event and render the embed!

15/8/2025, 2:31:42 PM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

looks great!

15/8/2025, 3:12:39 AM | 3 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

Ok did some hacking and I think I got it working. Here's a POC of the full OAuth 2.0 Device Authorization Grant (RFC 8628) flow in AIP! Authorize with #atproto using device codes. Opens up all kinds of things authorizing with #atproto like CLIs, TVs, IoT stuff, etc. github.com/graze-social....

screenshot of device authorization form page for the AIP library screenshot of device authorization success page for the AIP library
14/8/2025, 5:30:47 PM | 28 6 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Goal is to have the @grain.social web, flutter, and cli apps all talking to AIP to resolve atproto session data for the user/validate tokens. More on this soon and some reference implementations! Excited to finally get the auth piece out of the way and keep building new stuff for @grain.social 📸

13/8/2025, 6:44:59 PM | 3 1 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

I've got a working nix flake for the AIP sqlite build (excluding some env vars you need to set at runtime) deployed to auth.grainsocial.network. tangled.sh/strings/chad...

13/8/2025, 6:44:59 PM | 0 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

@ngerakines.me explains issues/solutions around this here: blog.smokesignal.events/posts/3lvtim.... AIP doesn't fully support DCR yet (some of the client metadata in the blog post isn't supported and needs device code handlers) but it's trivial to add the missing pieces based on the spec.

13/8/2025, 6:44:59 PM | 1 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

Working on a quite a large rewrite of @grain.social to work with AIP github.com/graze-social.... If you are looking to build an #atproto app for web, native, and cli definitely check it out. I was hitting a dead end with the official node atproto oauth library, as it doesn't currently support DCR.

13/8/2025, 6:44:59 PM | 19 5 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

www.goatcounter.com

10/8/2025, 11:17:21 PM | 1 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Something like calagator.org would be cool. Not overly flashy and gets the job done. Claude could probably do it.

8/8/2025, 4:08:18 PM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Rad, gonna look into moving all our stuff over. Really appreciate all your content and work on atproto things!

7/8/2025, 8:57:47 PM | 0 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Yes! I'm running into this issue with @grain.social having recently spun up a native mobile app and working on a cli in addition to the web experience. Currently working around around it by managing sessions per client type using the bff to delegate the redirect. Does AIP support multiple clients?

7/8/2025, 8:26:27 PM | 3 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

These are generated via a rust service tangled.sh/@grain.socia.... It renders the gallery in a headless browser and takes a snapshot. Thinking about using the same templates for embeds as well.

5/8/2025, 5:00:41 PM | 5 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

grain.social/profile/chad...

5/8/2025, 5:00:41 PM | 3 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

grain.social/profile/chad...

5/8/2025, 5:00:41 PM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

grain.social/profile/chad...

5/8/2025, 5:00:41 PM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

Giving @grain.social some flare ✨. The og:image by default will now display a preview of your gallery in a collage format. Probably have a way to customize this in the future. Still playing around with different ideas. Here's a few examples: grain.social/profile/chad...

5/8/2025, 5:00:41 PM | 23 5 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

Went down a rabbit hole getting a minimal nix flake setup with rust and a headless browser but now @grain.social can create these gallery composites for sharing. Inspired by retro.app. Hopefully have more on this soon!

grid of images from a grain gallery with the title and user information at the bottom
1/8/2025, 4:32:41 PM | 9 1 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Also caligator calagator.org

28/7/2025, 6:32:58 PM | 0 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Some inspiration, I frequent these a lot in Portland everout.com/portland/eve... and www.wweek.com/calendar/cal.... Also something like songkick could be cool www.songkick.com/artists/1335...

28/7/2025, 6:28:43 PM | 1 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Yeah! I just a need a burner android device to get it setup in the play store. I only have an iOS device. I’ll try to get it sorted out soon!

24/7/2025, 4:05:35 AM | 5 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

Excited to finally make this available. Started learning @flutter.dev only a few weeks so be gentle! Honestly flutter has been great so far.

23/7/2025, 9:22:36 PM | 6 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

Just published the code for the @grain.social iOS/android app to tangled.sh/@grain.socia... and github.com/grainsocial/.... Still working through a few things before releasing more widely but here’s a quick video of what it’s looking like so far.

16/7/2025, 5:02:17 AM | 21 4 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

Photos from an adventure this past weekend to escape all the noise. #adventure #photography #mountains Check out this gallery on @grain.social grain.social/profile/chad...

9/7/2025, 12:25:42 AM | 6 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

It's been an insane amount of work but hoping have a beta ready soon for @grain.social on iOS/Android. The goal is to have feature parity with the web app. Building with @flutter.dev. Will be open source. ✌️ #photography #atprotocol

image image image image
3/7/2025, 7:28:07 PM | 27 1 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

Meadow season

image image image image
30/6/2025, 2:06:01 AM | 3 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

for inspiration swag.htmx.org/en-usd

23/6/2025, 4:10:26 PM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

This is rad!

23/6/2025, 3:25:01 PM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

love that place

23/6/2025, 12:19:52 AM | 0 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

It would be cool though if bsky posts supported various record embeds or there was a more robust api for that. Then you could view a grain gallery fully in app.

21/6/2025, 6:49:12 PM | 1 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

You could definitely have a separate appview just for that experience. Photos on the #atprotocol. Blob refs have a mime type so could detect various image formats on the firehose.

21/6/2025, 6:43:24 PM | 1 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Grain galleries aren’t the same as posts so I’m not really sure how a cross integration work but maybe you could convert a flashes post for example into a grain gallery.

21/6/2025, 6:35:32 PM | 1 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

The intent of the integration of other networks on grain was just to show grain galleries of people of you follow on other atproto platforms or potentially bridged users from other networks.

21/6/2025, 6:35:32 PM | 1 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

Really stoked for this! @grain.social is built from the ground up (not a Bluesky client) rethinking what it means to share photos on the #atprotocol.

20/6/2025, 6:18:53 PM | 5 1 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

where do all the chads go?

18/6/2025, 10:49:20 PM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

This is awesome! Gonna have to checkout disco

18/6/2025, 8:00:01 PM | 2 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

*There is no React.js involved in this operation.

18/6/2025, 7:21:54 PM | 3 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

If you were like me, pulled down the statusphere repo when you first started getting into #atproto, and thought there's no way this barebones stack is going to make anything cool...it can and it has! @grain.social is essentially built on the same concepts: ssr + sqlite + some js sprinkled on top.

18/6/2025, 7:21:54 PM | 14 2 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Good news is that I updated BFF to support this and you can continue to use the index service queries as normal. There's also a new countRecords method with the same signature as getRecords. @grain.social timeline loads pretty fast now.

18/6/2025, 7:02:00 PM | 3 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

jk def need indexes. I added gallery favorites to the @grain.social timeline and query performance dropped significantly. Maybe this is a right of passage for building a social app. Index monster is waiting for you...

18/6/2025, 7:02:00 PM | 2 0 | View on Bluesky | view

Profile picture Teen Vogue (@teenvogue.com) reposted

A wave of legislation and executive actions have targeted transgender people, particularly teens, by stripping away gender-affirming care and other essential rights, but intersex people and anyone who doesn’t conform to strict sex binaries also stand to lose something as a result.

15/6/2025, 4:13:16 PM | 404 139 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Awesome list! Would be cool to see @grain.social on the next update! Flickr style photo sharing on the #atprotocol totally separate from Bluesky.

14/6/2025, 1:35:21 AM | 3 1 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

Dialog-driven Development? #ddd #htmx

screenshot of a bunch of route handlers that return dialog html
13/6/2025, 4:18:22 PM | 3 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

Really stoked for this. Bringing flickr style photo sharing to the #atprotocol but more hip and open source.

13/6/2025, 12:00:05 AM | 11 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Maybe there can be a way to get the diff and you could apply the changes back to your repo.

12/6/2025, 10:01:50 PM | 0 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Right now I'm thinking of simple apps where maybe you initially started out with deploy and want to make tweaks on the fly without having to jump back to your editor.

12/6/2025, 4:56:56 PM | 0 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Awesome! Enjoying the new deploy so far! Is there going to be a way to create a playground from an existing application?

12/6/2025, 3:36:22 PM | 0 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

It appears the new @deno.land deploy shuts down your app after a short period of inactivity so no live sync for now. But when your app boots back up it will sync all your records again. You could deploy to a different cloud provider to keep the jetstream connected.

11/6/2025, 9:50:01 PM | 0 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Working on getting BFF github.com/bigmoves/bff out of the current beta cycle. Hopefully have some more updates on that soon. Documentation is fairly light at the moment but the portfolio site and @grain.social are both open source as references.

11/6/2025, 9:50:01 PM | 0 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Not having proper indexes could bite in the long run, but at that point hopefully your app has some traction and funding and you can spend more time on performance. At least that's the idea I'm running with right now.

11/6/2025, 9:50:01 PM | 0 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

All of the records are stored in a simple "records" table so you don't have to worry about creating separate indexes. This honestly caused me a lot of headache when starting to build an appview. I don't want to think about indexes right now, I just wanna build something.

11/6/2025, 9:50:01 PM | 1 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

The idea with BFF is that you get all the data you need via an initial sync and then listen to the jetstream for updates. BFF has a built in query builder with support for various where and orderBy clauses so you don't have to write any custom sql queries.

11/6/2025, 9:50:01 PM | 5 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

This is cool because you don't have to wait for an #atprotocol app to build out xrpc apis to get at it's indexed data, you can just create a slice for what you need. You could also integrate other apps on the protocol. For example, you might want to show your @tangled.sh repos!

11/6/2025, 9:50:01 PM | 11 1 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com) reply parent

Code is here github.com/bigmoves/bff.... This is a functioning appview! It will watch for updates to your grain records on the firehose and update it's index with any changes. For example, you add some new photos to a gallery or change the sort order on grain, your portfolio stays in sync.

11/6/2025, 9:50:01 PM | 3 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

Created a tiny BFF app (an #atprotocol framework I'm working on that also runs @grain.social) you can use to display all your grain galleries on your own portfolio site. I deployed it with @deno.land's new deploy and it was pretty easy. bff-grain-portfolio-example.bigmoves.deno.net

11/6/2025, 9:50:01 PM | 8 0 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

Weekend adventure to Bainbridge shot on the Ricoh GRii. Check out this gallery on @grain.social grain.social/profile/chad...

9/6/2025, 10:23:59 PM | 1 1 | View on Bluesky | view

Profile picture zeu (@zeu.dev) reposted reply parent

we love oobs, all the homies love oobs

5/6/2025, 5:58:35 PM | 1 1 | View on Bluesky | view

Profile picture Chad (@chadtmiller.com)

@htmx.org oobs in the wild 📸🕵️ @grain.social #htmx #oob

5/6/2025, 4:20:15 PM | 5 1 | View on Bluesky | view