chore: prepare for release v0.2.0 - #59
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Coverage Report for CI Build 24208715153Coverage remained the same at 29.583%Details
Uncovered ChangesNo uncovered changes found. Coverage RegressionsNo coverage regressions found. Coverage Stats
💛 - Coveralls |
The retroactive changesets added in #58 were all committed in the same commit, so @changesets/changelog-github looked up that one commit and used its PR (#58) and SHA on every generated entry in the v0.2.0 release section. That's the generator behaving correctly for its model (one changeset = one originating commit = one originating PR) but it produces misleading "this change was shipped in #58" refs when in reality each described feature landed weeks earlier in a different PR. Replace each bogus prefix with links to the real introducing PR(s). Commit SHAs are dropped entirely because a feature that spans multiple commits can't be meaningfully linked to a single SHA, and the PR link already carries the useful context. Future (non-retroactive) changesets won't hit this — they'll be added in the same PR as the feature they describe, so the generator's single-commit lookup resolves to the right PR automatically. This fix is a one-off cleanup for the bootstrap release. PR → changeset mapping: #14 → Longer sign-in codes #13, #29, #33, #36 → Choose your own handle #3, #6 → Sign in faster from third-party apps #20, #23 → Fail-fast PDS_INTERNAL_URL validation #27 → Honour PORT env var
aspiers
force-pushed
the
changeset-release/main
branch
from
April 9, 2026 19:15
40b93ac to
2bab91b
Compare
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
epds@0.2.0
Who should read this release
PORTenvironment variable on both services, so Railway's automatic healthcheck succeeds without per-service configuration.Minor Changes
#58
905ad25Thanks @aspiers! - Longer sign-in codes, optionally mixing letters and numbers.Affects: End users, Operators
End users: depending on how the ePDS instance you sign in to
is configured, sign-in codes sent to your email may now be longer
(up to 12 characters) and may include uppercase letters as well as
digits. Codes of 8 or more characters are displayed grouped in the
email for readability (e.g.
1234 5678), but you can still pastethe whole code into the sign-in form as usual — the space is just
a visual aid.
Operators: two new environment variables on the auth service —
OTP_LENGTH(integer, range 4–12, default 8) andOTP_CHARSET(
numeric(default) oralphanumeric;alphanumericuses uppercaseA–Z plus 0–9). Values outside the range cause the service to fail on
startup. The OTP form fields (input width,
pattern,inputmode,autocapitalize) adapt automatically from the configured length andcharset; no template changes are required.
Operators running custom email templates: the shared email
helpers now format OTPs with visual grouping when the code is 8
characters or longer — e.g.
1234 5678in subject lines and plaintext, and
<span>1234</span><span>5678</span>with CSS spacing inHTML so that copy-paste still yields the flat code. If you render
OTPs yourself rather than going through
EmailSender.sendOtpCode(),import
formatOtpPlain()andformatOtpHtmlGrouped()from@certified-app/sharedinstead of interpolating the raw code.#58
905ad25Thanks @aspiers! - Choose your own handle when signing up, instead of being given a random one.Affects: End users, Client app developers, Operators
End users: the signup flow now shows a handle picker by default
instead of assigning a random handle. You can type a custom handle
and the picker will check availability as you type, or click the
random-handle button to take what the old flow would have given
you. The picker now accepts handles as short as 5 characters and
handles are validated more strictly so that some handles that used
to be accepted may now be rejected up-front with a clearer error.
The picker layout has been widened to accommodate long PDS domain
names without truncation.
Client app developers (building on top of ePDS): a new
epds_handle_modesetting controls which variant of the signuphandle picker is shown. Accepted case-sensitive values:
picker— always show the picker, no random option offered.random— always assign a random handle, no picker (thepre-0.2.0 behaviour).
picker-with-random(default) — show the picker but include a"generate random" option.
The setting is resolved with the following precedence (first
match wins), falling back to a built-in default:
epds_handle_modequery parameter on the/oauth/authorizerequest.
epds_handle_modefield in the OAuth client metadata JSONserved at the client's
client_idURL.EPDS_DEFAULT_HANDLE_MODEenvironment variable on the authservice.
picker-with-random.This precedence was previously wrong — the env var was consulted
before the client metadata, so clients could not override a server
default. If you relied on that bug, your env var setting will now
be overridden by whatever the client metadata says.
To force a specific handle mode for users of your app, add the
field to the client metadata JSON that your
client_idURLreturns, alongside the standard OAuth fields:
{ "client_id": "https://example.com/oauth/client-metadata.json", "client_name": "Example", "redirect_uris": ["https://example.com/oauth/callback"], "grant_types": ["authorization_code", "refresh_token"], "response_types": ["code"], "scope": "atproto transition:generic", "token_endpoint_auth_method": "none", "application_type": "web", "dpop_bound_access_tokens": true, "epds_handle_mode": "picker" }Unknown or invalid values are silently ignored and fall through to
the next source. If you need to override per-request (e.g. for a
specific signup campaign), append
?epds_handle_mode=pickertoyour
/oauth/authorizeURL.Operators: set
EPDS_DEFAULT_HANDLE_MODEon the auth serviceto change the default handle-picker variant for clients that don't
specify one in their client metadata. Accepted values are the same
as those listed in the Client app developers section above
(
picker,random,picker-with-random). See.env.examplefordocumentation.
Patch Changes
#58
905ad25Thanks @aspiers! - Sign in faster from third-party apps that already know who you are.Affects: End users
When you sign in to a third-party AT Protocol app (anything built
on top of the Bluesky account system, for example) that already
knows your handle or DID, ePDS now jumps straight to the "enter
your sign-in code" step. Previously you would have been asked to
retype your email address first, even though the app you were
using had already identified you — that extra step is gone.
This fixes two specific situations that didn't work before: apps
that identified you by handle or DID rather than email, and apps
that sent the identifier over a back channel rather than in the
sign-in URL.
#58
905ad25Thanks @aspiers! - Fail-fast validation of internal environment variables on the authservice.
Affects: Operators
A new
requireInternalEnv()helper runs at auth service startupand reports exactly which required internal variables are missing
or malformed, replacing cryptic downstream errors like
TypeError: Failed to parse URLon the first request.Checks performed:
PDS_INTERNAL_URL— must be set and must begin withhttp://or
https://(matched case-insensitively). Trailing slashes arestripped automatically.
EPDS_INTERNAL_SECRET— must be set to any non-empty string.If you previously set
PDS_INTERNAL_URLto a bare hostname likecore.railway.internalorcore:3000, the service will nowrefuse to start with this error:
Add the scheme and port explicitly. The canonical Docker Compose
default (shown in
.env.example) ishttp://core:3000; forRailway's private networking the equivalent is
http://<service>.railway.internal:<PDS_PORT>, substitutingwhichever service name you gave your pds-core deployment and the
PDS_PORTyou configured on it. Railway's internal network usesplain HTTP on explicit ports, not HTTPS. This previously "worked"
in the sense that the service started, but then failed on the
first internal request; the new behaviour surfaces the
misconfiguration immediately.
#58
905ad25Thanks @aspiers! - Honour the genericPORTenvironment variable on both services, soRailway's automatic healthcheck succeeds without per-service
configuration.
Affects: Operators
New port-resolution precedence (first set value wins):
AUTH_PORT→PORT→3001PDS_PORT→PORT→3000(pds-core readsPDS_PORT; whenPDS_PORTis unset,PORTis copied into itbefore
@atproto/pdsreads its environment)If you run ePDS on Docker Compose or another orchestrator where you
set
AUTH_PORT/PDS_PORTexplicitly: no change — your existingsettings take precedence over
PORT.If you run ePDS on Railway (or any platform that injects
PORTautomatically): you can now remove service-specific
AUTH_PORT/PDS_PORToverrides from your Railway variables. Each servicewill pick up Railway's injected
PORTand healthchecks will bindcorrectly. Previously these services bound to their hardcoded
defaults regardless of
PORT, causing Railway healthchecks tofail.