Commits
Feeling a big saturated with tailwind classes but it's ok I guess
Ticked off some milestones too. Tons left to do but it's shaping up nicely I think
This commit is way too big. It is a very nice milestone though, with a full integrated site adding flow/wizard.
You can now add sites, get RSS feed, validate well-known, and everything up to creating a publication. Still can use a lot of polish but it's working.
Also includes TID generation and lots of other improvements I bumped into while I was pulling everything together.
Feed discovery is limited to link rel=alternate, which is probably plenty? It could be extended with some "guessing", checking if `/rss.xml` returns a valid feed, but that can be a future thing.
Probably going to want to make it possible to enable/disable feed polling, which might live on site, but we'll figure that out when we get to it
Includes a Saxy parser based on gluttony, some feed "discovery" logic, and some random fixes
Yeah, it's just a letter but it looks ok and that's the extent of my Figma skills.
and added some random meta tags while I was at it, it's nice.
Ran `mix phx.gen.release --docker` to get a release and dockerfile and added some docs on how to set up the env vars
Will want to iterate on this but it matches the design aesthetic and it's a decent starting point. Not sure about the stats cards.
Also styles the login page
I experimented a bit with prototypes and this is just lifting the design into the Phoenix app. Could probably extract some things into components.
Hooks it all up and I've verified it works end 2 end. Sick.
Adds some basic stuff to the Accounts context, including the session upsert
Covers Discovery, PAR, session, etc.
```
iex(8)> {:ok, server} = AnnotAt.Atproto.OAuth.Discovery.discover(id.pds_endpoint)
{:ok,
%AnnotAt.Atproto.OAuth.ServerMetadata{
issuer: "https://bsky.social",
authorization_endpoint: "https://bsky.social/oauth/authorize",
token_endpoint: "https://bsky.social/oauth/token",
par_endpoint: "https://bsky.social/oauth/par",
scopes_supported: ["atproto", "transition:email", "transition:generic",
"transition:chat.bsky"],
revocation_endpoint: "https://bsky.social/oauth/revoke"
}}
```
Might've diverged a bit from my original plan. Verified in IEx
```
iex(2)> AnnotAt.Atproto.Identity.resolve_handle("atproto.com")
{:ok,
%AnnotAt.Atproto.Identity{
did: "did:plc:ewvi7nxzyoun6zhxrhs64oiz",
handle: "atproto.com",
pds_endpoint: "https://enoki.us-east.host.bsky.network"
}}
iex(3)> AnnotAt.Atproto.Identity.resolve_handle("jola.dev")
{:ok,
%AnnotAt.Atproto.Identity{
did: "did:plc:bvraa6gajy4tfr3eh2sisdkr",
handle: "jola.dev",
pds_endpoint: "https://shaggymane.us-west.host.bsky.network"
}}
```
Avoided using Ecto.Changeset to make it easier to move this out at a later point
First batch of atproto related code. Roughly inspired by `atex` and lots of digging. Going to want to go over this code again properly cause it's all scary crypto stuff. Wouldn't normally want that kind of code "handrolled" but it's all fairly standard and eg assent doesn't support atproto, so here we are.
This commit is way too big. It is a very nice milestone though, with a full integrated site adding flow/wizard.
You can now add sites, get RSS feed, validate well-known, and everything up to creating a publication. Still can use a lot of polish but it's working.
Also includes TID generation and lots of other improvements I bumped into while I was pulling everything together.
Feed discovery is limited to link rel=alternate, which is probably plenty? It could be extended with some "guessing", checking if `/rss.xml` returns a valid feed, but that can be a future thing.
Probably going to want to make it possible to enable/disable feed polling, which might live on site, but we'll figure that out when we get to it
Covers Discovery, PAR, session, etc.
```
iex(8)> {:ok, server} = AnnotAt.Atproto.OAuth.Discovery.discover(id.pds_endpoint)
{:ok,
%AnnotAt.Atproto.OAuth.ServerMetadata{
issuer: "https://bsky.social",
authorization_endpoint: "https://bsky.social/oauth/authorize",
token_endpoint: "https://bsky.social/oauth/token",
par_endpoint: "https://bsky.social/oauth/par",
scopes_supported: ["atproto", "transition:email", "transition:generic",
"transition:chat.bsky"],
revocation_endpoint: "https://bsky.social/oauth/revoke"
}}
```
Might've diverged a bit from my original plan. Verified in IEx
```
iex(2)> AnnotAt.Atproto.Identity.resolve_handle("atproto.com")
{:ok,
%AnnotAt.Atproto.Identity{
did: "did:plc:ewvi7nxzyoun6zhxrhs64oiz",
handle: "atproto.com",
pds_endpoint: "https://enoki.us-east.host.bsky.network"
}}
iex(3)> AnnotAt.Atproto.Identity.resolve_handle("jola.dev")
{:ok,
%AnnotAt.Atproto.Identity{
did: "did:plc:bvraa6gajy4tfr3eh2sisdkr",
handle: "jola.dev",
pds_endpoint: "https://shaggymane.us-west.host.bsky.network"
}}
```
First batch of atproto related code. Roughly inspired by `atex` and lots of digging. Going to want to go over this code again properly cause it's all scary crypto stuff. Wouldn't normally want that kind of code "handrolled" but it's all fairly standard and eg assent doesn't support atproto, so here we are.