diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000..118c3d4
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,27 @@
+# AGENTS.md
+
+## Cursor Cloud specific instructions
+
+This is a **Next.js 16 static marketing/docs website** for Memos (usememos.com). No external services, databases, or environment variables are required.
+
+### Services
+
+| Service | Command | Port | Notes |
+|---------|---------|------|-------|
+| Dev server | `pnpm dev` | 3000 | Uses Turbopack; hot-reloads on file changes |
+
+### Key commands
+
+Refer to `CLAUDE.md` and `package.json` scripts for the full list. Quick reference:
+
+- **Lint**: `pnpm lint` (runs Biome)
+- **Format**: `pnpm format` (runs Biome format with `--write`)
+- **Build**: `pnpm build` (full production build, generates 300+ static pages)
+- **Dev**: `pnpm dev` (starts on port 3000 with Turbopack)
+
+### Gotchas
+
+- The `postinstall` script downloads OpenAPI specs from GitHub (`raw.githubusercontent.com`) and generates MDX + Fumadocs source files. If the network fetch fails during `pnpm install`, the generated API docs will be missing. Rerun `pnpm install` to retry.
+- pnpm may warn about ignored build scripts for `esbuild` and `sharp`. This warning is cosmetic and does not block development or builds.
+- There are no automated test suites (no `test` script in `package.json`). Verification is done via `pnpm lint` and `pnpm build`.
+- The `.source/` directory is auto-generated by `fumadocs-mdx` during `postinstall`. Do not edit files in it directly.
diff --git a/content/docs/api/latest/attachmentservice/BatchDeleteAttachments.mdx b/content/docs/api/latest/attachmentservice/BatchDeleteAttachments.mdx
new file mode 100644
index 0000000..374aac0
--- /dev/null
+++ b/content/docs/api/latest/attachmentservice/BatchDeleteAttachments.mdx
@@ -0,0 +1,15 @@
+---
+title: Batch Delete Attachments
+description: BatchDeleteAttachments deletes multiple attachments in one request.
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: BatchDeleteAttachments deletes multiple attachments in one request.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+
\ No newline at end of file
diff --git a/content/docs/api/latest/attachmentservice/meta.json b/content/docs/api/latest/attachmentservice/meta.json
index 88131c5..ab8873a 100644
--- a/content/docs/api/latest/attachmentservice/meta.json
+++ b/content/docs/api/latest/attachmentservice/meta.json
@@ -1,4 +1,4 @@
{
"title": "Attachment Service",
- "pages": ["CreateAttachment", "DeleteAttachment", "GetAttachment", "ListAttachments", "UpdateAttachment"]
+ "pages": ["BatchDeleteAttachments", "CreateAttachment", "DeleteAttachment", "GetAttachment", "ListAttachments", "UpdateAttachment"]
}
diff --git a/content/docs/api/latest/userservice/BatchGetUsers.mdx b/content/docs/api/latest/userservice/BatchGetUsers.mdx
new file mode 100644
index 0000000..30a7c98
--- /dev/null
+++ b/content/docs/api/latest/userservice/BatchGetUsers.mdx
@@ -0,0 +1,15 @@
+---
+title: Batch Get Users
+description: BatchGetUsers returns active users by usernames.
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: BatchGetUsers returns active users by usernames.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+
\ No newline at end of file
diff --git a/content/docs/api/latest/userservice/meta.json b/content/docs/api/latest/userservice/meta.json
index 693f4d2..3d669c1 100644
--- a/content/docs/api/latest/userservice/meta.json
+++ b/content/docs/api/latest/userservice/meta.json
@@ -1,6 +1,7 @@
{
"title": "User Service",
"pages": [
+ "BatchGetUsers",
"CreatePersonalAccessToken",
"CreateUser",
"CreateUserWebhook",
diff --git a/openapi/latest.yaml b/openapi/latest.yaml
index c516046..6c72cda 100644
--- a/openapi/latest.yaml
+++ b/openapi/latest.yaml
@@ -176,6 +176,28 @@ paths:
application/json:
schema:
$ref: '#/components/schemas/Status'
+ /api/v1/attachments:batchDelete:
+ post:
+ tags:
+ - AttachmentService
+ description: BatchDeleteAttachments deletes multiple attachments in one request.
+ operationId: AttachmentService_BatchDeleteAttachments
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/BatchDeleteAttachmentsRequest'
+ required: true
+ responses:
+ "200":
+ description: OK
+ content: {}
+ default:
+ description: Default error response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Status'
/api/v1/auth/me:
get:
tags:
@@ -1955,6 +1977,31 @@ paths:
application/json:
schema:
$ref: '#/components/schemas/Status'
+ /api/v1/users:batchGet:
+ post:
+ tags:
+ - UserService
+ description: BatchGetUsers returns active users by usernames.
+ operationId: UserService_BatchGetUsers
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/BatchGetUsersRequest'
+ required: true
+ responses:
+ "200":
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/BatchGetUsersResponse'
+ default:
+ description: Default error response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Status'
/api/v1/users:stats:
get:
tags:
@@ -2015,6 +2062,33 @@ components:
description: |-
Optional. The related memo. Refer to `Memo.name`.
Format: memos/{memo}
+ motionMedia:
+ allOf:
+ - $ref: '#/components/schemas/MotionMedia'
+ description: Optional. Motion media metadata.
+ BatchDeleteAttachmentsRequest:
+ required:
+ - names
+ type: object
+ properties:
+ names:
+ type: array
+ items:
+ type: string
+ BatchGetUsersRequest:
+ type: object
+ properties:
+ usernames:
+ type: array
+ items:
+ type: string
+ BatchGetUsersResponse:
+ type: object
+ properties:
+ users:
+ type: array
+ items:
+ $ref: '#/components/schemas/User'
Color:
type: object
properties:
@@ -2781,6 +2855,30 @@ components:
type: string
description: The title extracted from the first H1 heading, if present.
description: Computed properties of a memo.
+ MotionMedia:
+ type: object
+ properties:
+ family:
+ enum:
+ - MOTION_MEDIA_FAMILY_UNSPECIFIED
+ - APPLE_LIVE_PHOTO
+ - ANDROID_MOTION_PHOTO
+ type: string
+ format: enum
+ role:
+ enum:
+ - MOTION_MEDIA_ROLE_UNSPECIFIED
+ - STILL
+ - VIDEO
+ - CONTAINER
+ type: string
+ format: enum
+ groupId:
+ type: string
+ presentationTimestampUs:
+ type: string
+ hasEmbeddedVideo:
+ type: boolean
NotificationSetting_EmailSetting:
type: object
properties:
@@ -3133,6 +3231,11 @@ components:
description: |-
The sender of the notification.
Format: users/{user}
+ senderUser:
+ readOnly: true
+ allOf:
+ - $ref: '#/components/schemas/User'
+ description: The sender user details.
status:
enum:
- STATUS_UNSPECIFIED
@@ -3151,6 +3254,7 @@ components:
enum:
- TYPE_UNSPECIFIED
- MEMO_COMMENT
+ - MEMO_MENTION
type: string
description: The type of the notification.
format: enum
@@ -3158,6 +3262,10 @@ components:
readOnly: true
allOf:
- $ref: '#/components/schemas/UserNotification_MemoCommentPayload'
+ memoMention:
+ readOnly: true
+ allOf:
+ - $ref: '#/components/schemas/UserNotification_MemoMentionPayload'
UserNotification_MemoCommentPayload:
type: object
properties:
@@ -3171,6 +3279,31 @@ components:
description: |-
The name of related memo.
Format: memos/{memo}
+ memoSnippet:
+ type: string
+ description: Preview text of the comment memo.
+ relatedMemoSnippet:
+ type: string
+ description: Preview text of the related memo.
+ UserNotification_MemoMentionPayload:
+ type: object
+ properties:
+ memo:
+ type: string
+ description: |-
+ The memo that contains the mention.
+ Format: memos/{memo}
+ relatedMemo:
+ type: string
+ description: |-
+ The related parent memo when the mention was created in a comment.
+ Format: memos/{memo}
+ memoSnippet:
+ type: string
+ description: Preview text of the memo that contains the mention.
+ relatedMemoSnippet:
+ type: string
+ description: Preview text of the related parent memo.
UserSetting:
type: object
properties: