diff --git a/src/activitypub/routes/user.ts b/src/activitypub/routes/user.ts
new file mode 100644
index 00000000..838d14b7
--- /dev/null
+++ b/src/activitypub/routes/user.ts
@@ -0,0 +1,36 @@
+import { route } from "@spacebar/api";
+import { Config, User } from "@spacebar/util";
+import { Request, Response, Router } from "express";
+
+const router = Router();
+export default router;
+
+router.get("/:id", route({}), async (req: Request, res: Response) => {
+ const id = req.params.name;
+
+ const user = await User.findOneOrFail({ where: { id } });
+
+ const { webDomain } = Config.get().federation;
+
+ return res.json({
+ "@context": "https://www.w3.org/ns/activitystreams",
+ type: "Person",
+ id: `https://${webDomain}/fed/user/${user.id}`,
+ name: user.username,
+ preferredUsername: user.username,
+ summary: user.bio,
+ icon: user.avatar
+ ? [
+ `${Config.get().cdn.endpointPublic}/avatars/${user.id}/${
+ user.avatar
+ }`,
+ ]
+ : undefined,
+
+ inbox: `https://${webDomain}/fed/user/${user.id}/inbox`,
+ outbox: `https://${webDomain}/fed/user/${user.id}/outbox`,
+ followers: `https://${webDomain}/fed/user/${user.id}/followers`,
+ following: `https://${webDomain}/fed/user/${user.id}/following`,
+ linked: `https://${webDomain}/fed/user/${user.id}/likeds`,
+ });
+});
|