Files
PreMiD/apps/schema-server/schemas/metadata/1.3.json
Florian Metz e6526a3666 feat: monorepo (#1098)
* chore: release v1.1.0

* chore: pd stuff

* chore: release v1.1.1

* feat: add ratelimit environment variables

* chore: release v1.1.2

* chore: improve memory usage

* chore: release v1.1.3

* feat: use sentinels

* chore: release v1.1.4

* chore: update name

* chore: release v1.1.5

* fix(pd): use correct env variable

* chore: release v1.1.6

* wip: docs

* wip: docs

* wip: api

* wip: website

* wip: website

* wip: website

* wip: website

* chore: cleanup

* chore: add lib folder to .gitignore

* chore: remove blank

* wip: csp

* wip: csp

* fix(ci): use correct context

* wip: cd

* wip: cd

* wip: cd

* wip: cd

* wip: cd

* wip: cd

* chore: use correct port

* wip: csp

* wip: csp

* wip: csp

* wip: csp

* chore: update security headers in nuxt.config.ts

* chore: update security headers in nuxt.config.ts

* chore: remove comments

* chore: update npm dependencies

* chore: bump dependencies & add missing

* fix: broken lockfile

* chore: set client host

* chore: update depencies

* style: small layout fixes

* ci: testing

* chore: update CI workflow to trigger on 'monorepo' branch

* chore: use full build image

* chore: test (#1048)

* chore: setup qemu

* chore: remove docs prefix from scripts (#1046)

* style: fix centering (#1050)

* style: render 3 columns (#1049)

* ci: use alpine base (#1051)

* style: make footer follow max width (#1052)

* feat: Add Crowdin configuration for website localization. (#1054)

* chore: change dest in crowdin

* chore: improve crowdin pr

* chore: improve crowdin pr

* chore: lint

* chore: update language folder

* chore: update crowdin configuration to skip untranslated strings and files

* chore: add crowdin badge

* chore: release v1.0.1

* chore: release v1.1.7

* chore: fix build

* chore: release v1.1.8

* chore: release v1.0.2

* chore: fix docker

* chore: release v1.1.9

* chore: release v1.0.3

* feat: add more api endpoints (#1059)

* chore: worked on the api and lint

* chore: small fixes

* chore: uhm I think this sort is broken

* chore: worked on the api and lint

* chore: small fixes

* chore: uhm I think this sort is broken

* feat: heartbeat

* chore: add prettier ignore

* feat: websocket

* chore: update tsconfig

* chore: lint

* chore: dont require unused fields

* chore: use djs rest

* fix: websocket

* chore: v5

* chore: fix build

---------

Co-authored-by: Florian Metz <me@timeraa.dev>

* chore: wip api

* chore: wip api

* chore: release v0.0.1

* chore: deploy on tag

* chore: release v0.0.1

* chore(api): remove old sentry tracing

* chore: release v0.0.2

* chore: release v0.0.2

* feat(api-master): add logs

* chore: release v0.0.3

* chore: bump dep

* feat: add feature flags

* chore: release v0.0.3

* feat: metrics?

* chore: release v0.0.4

* chore: update npm dependencies

* feat: add session-keep-alive

* chore: fix build

* chore: release v0.0.5

* chore: release v0.0.4

* chore: update arktype

* chore: release v0.0.6

* chore: hash the key

* chore: release v0.0.7

* chore: release v0.0.5

* chore: revert redis stuff

* chore: release v0.0.6

* chore: release v0.0.8

* feat(api-master): add metrics

* chore: release v0.0.7

* chore: update lockfile

* chore: release v0.0.8

* chore: idk kek

* chore: iodk

* chore: release v0.0.8

* feat: use scan

* chore: release v0.0.9

* chore: skip clearOldSesssions if another in progress

* chore: release v0.0.10

* chore: optimize session cleanup with batch deletion

* chore: release v0.0.11

* chore: move some code

* chore: release v0.0.12

* chore: add timeout to headless session deletion

* chore: release v0.0.13

* chore: add p-limit dependency for session cleanup

* chore: release v0.0.14

* chore: always return the key

* chore: release v0.0.15

* chore: add p-limit dependency for session cleanup

* chore: release v0.0.16

* chore: why does it not abort

* chore: release v0.0.17

* chore: fix time

* chore: release v0.0.18

* chore: add reason

* chore: release v0.0.19

* feat: use scienceId

* chore: release v0.0.20

* chore: release v0.0.9

* chore: update log

* chore: release v0.0.20

* chore: use ky

* chore: release v0.0.21

* chore: 202 on disabled flag

* chore: release v0.0.10

* chore: test

* chore: release v0.0.22

* chore: release v0.0.11

* chore: test

* chore: test

* chore: release v0.0.12

* chore: test

* chore: release v0.0.23

* chore: update hash

* chore: release v0.0.24

* chore: release v0.0.13

* feat: update tracing (#1067)

* chore: release v0.0.14

* chore: release v0.0.25

* fix: store ip data in postgres

* chore: lint

* chore: release v0.0.26

* chore: reduce batch size

* chore: release v0.0.27

* chore: disable ip stuff for now

* chore: release v0.0.28

* chore: reduce memory

* chore: release v0.0.29

* chore: release v0.0.29

* chore: release v0.0.29

* chore: small updates

* chore: release v0.0.30

* chore: optimize active presence gauge update with concurrency limit

* chore: release v0.0.31

* chore: some improvements

* chore: forgot to save

* chore: release v0.0.32

* chore: some testing

* chore: release v0.0.33

* chore: scan count config

* chore: release v0.0.34

* feat: schema v1.11

* chore: release v1.0.4

* feat: use prom-client

* chore: release v0.0.35

* chore: scan keys instead

* chore: release v0.0.36

* feat: ip data

* chore: release v0.0.37

* feat: discord-bot (#1069)

* feat: discord-bot

* feat: final things

* chore: add to matrix

* feat: add sentry

* chore: move some things

* chore: update version

* chore: release v1.0.0

* fix(discord-bot): fixes credits

* chore: release v1.0.1

* feat(discord-bot): add beta command

* chore: release v1.0.2

* chore: un-ingore config files

* chore: lint

* fix(discord-bot): update developer roles constant (#1070)

* chore: disable commitlint

* fix(discord-bot): update developer roles constant

* Update commit-msg

* chore: release v1.0.3

* Update presence.ts (#1072)

* fix: get presence list correctly

* chore: release v1.0.4

* chore: change info message

* chore: release v1.0.5

* fix(api): metadata types

* chore: release v0.0.15

* chore: fix type

* chore: release v0.0.16

* fix: add dbName

* chore: release v0.0.17

* feat: fix presence endpoints

* chore: release v0.0.18

* fix: show displayName

* chore: release v1.0.6

* feat: extension version gauge (#1074)

* feat: extension version gauge

* chore: lint

* feat: new schema version

* chore: release v1.0.5

* chore: release v0.0.38

* chore: remove ip lookup

* chore: lint

* chore: release v0.0.39

* chore: add environment variable to disable

* chore: release v0.0.19

* chore(bot): rename presence to activity (#1077)

* chore: release v1.0.7

* feat(schema-server): add v1.13

* chore: release v1.0.6

* chore: add mobile and update descriptions

* chore: release v1.0.7

* chore: lint

* chore: release v1.0.8

* chore: add Social Media Manager role and color to constants (#1084)

* chore: add Social Media Manager role and color to constants

* chore: bump version

* feat: v1.14 of schema

* chore: release v1.0.9

* feat: schema 1.15

* chore: release v1.0.10

* feat: add file extension

* chore: release v1.2.0

* fix: return image directly

* chore: release v1.2.1

* chore: remove cache headers

* chore: release v1.2.2

* chore: set more headers

* chore: release v1.2.3

* fix: ttl

* chore: release v1.2.4

* chore: strip monorepo down to pd and schema-server only

Remove all apps except pd and schema-server to create a minimal repository.
Deleted apps: api-master, api-worker, discord-bot, docs, website
Deleted packages directory and all monorepo configuration files
Removed unnecessary config files: eslint, prettier, commitlint, vitest, etc.

* docs: update README to be more user-friendly and generic

- Rewritten to focus on what PreMiD is rather than repository structure
- Added friendly introduction to PreMiD's features and capabilities
- Highlighted the open source Presences repository at github.com/PreMiD/Presences
- Removed monorepo-specific content and development instructions
- Added community section with helpful links
- Overall more welcoming tone for users and contributors

* chore: restore TypeScript build configuration and update dependencies

- Added back tsconfig.base.json and tsconfig.app.json needed for builds
- Updated both pd and schema-server tsconfig files to exclude test files
- Installed TypeScript and @types/node dependencies for both apps
- Updated README to include feedback.premid.app link
- Verified both apps build successfully

The apps can now be built with: npx tsc -b tsconfig.app.json

* docs: update README to use Activities terminology

- Changed "Presences" to "Activities" throughout
- Updated repository link to github.com/PreMiD/Activities
- Updated examples: YouTube, Disney+, Netflix, Twitch
- Noted that Spotify has native Discord support

* docs: clarify open source status and installation process

- Added Contributing section explaining that Activities are open source but the main app is not
- Clarified this helps the small team manage maintenance burden
- Updated "install PreMiD" to "add the browser extension" for accuracy
- Provided clear ways to contribute: Activities, translations, feedback

* docs: clarify extension-only model and development speed

- Changed "application and extension" to just "extension"
- Updated reasoning: allows team to move fast and iterate quickly
- No separate application exists, only the browser extension

* docs: add Discord server link

* docs: add banner image to README

* docs: move logo inline with heading

---------

Co-authored-by: Bas950 <me@bas950.com>
Co-authored-by: veryCrunchy <verycrunchydev@gmail.com>
Co-authored-by: veryCrunchy <me@verycrunchy.dev>
Co-authored-by: Claude <noreply@anthropic.com>
2025-12-02 18:26:18 +01:00

258 lines
6.8 KiB
JSON

{
"$schema": "http://json-schema.org/draft-07/schema",
"$id": "https://schemas.premid.app/metadata/1.3",
"title": "Metadata",
"type": "object",
"description": "Metadata that describes a presence.",
"definitions": {
"user": {
"type": "object",
"description": "User information.",
"properties": {
"name": {
"type": "string",
"description": "The name of the user."
},
"id": {
"type": "string",
"description": "The Discord snowflake of the user.",
"pattern": "^\\d+$"
}
},
"additionalProperties": false,
"required": ["name", "id"]
}
},
"properties": {
"$schema": {
"$comment": "This is required otherwise the schema will fail itself when it is applied to a document via $schema. This is optional so that validators that use this schema don't fail if the metadata doesn't have the $schema property.",
"type": "string",
"description": "The metadata schema URL."
},
"author": {
"$ref": "#/definitions/user",
"description": "The author of this presence."
},
"contributors": {
"type": "array",
"description": "Any extra contributors to this presence.",
"items": {
"$ref": "#/definitions/user"
}
},
"service": {
"type": "string",
"description": "The service this presence is for."
},
"altnames": {
"type": "array",
"description": "Alternative names for the service.",
"items": {
"type": "string",
"description": "An alternative name."
},
"minItems": 1
},
"description": {
"type": "object",
"description": "A description of the presence in multiple languages.",
"propertyNames": {
"type": "string",
"description": "The language key. The key must be languagecode(_REGIONCODE).",
"pattern": "^[a-z]{2}(_[A-Z]{2})?$"
},
"patternProperties": {
"^[a-z]{2}(_[A-Z]{2})?$": {
"type": "string",
"description": "The description of the presence in the key's language."
}
},
"additionalProperties": false,
"required": ["en"]
},
"url": {
"type": ["string", "array"],
"description": "The service's website URL, or an array of URLs. Protocols should not be added.",
"pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$",
"items": {
"type": "string",
"description": "One of the service's website URLs.",
"pattern": "^(([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+|(\\d{1,3}\\.){3}\\d{1,3}|localhost)$"
},
"minItems": 2
},
"version": {
"type": "string",
"description": "The SemVer version of the presence. Must just be major.minor.patch.",
"pattern": "^\\d+\\.\\d+\\.\\d+$"
},
"logo": {
"type": "string",
"description": "The logo of the service this presence is for.",
"pattern": "^https?:\\/\\/?(?:[a-z0-9-]+\\.)*[0-9a-z_-]+(?:\\.[a-z]+)+\\/.*$"
},
"thumbnail": {
"type": "string",
"description": "A thumbnail of the service this presence is for.",
"pattern": "^https?:\\/\\/?([a-z0-9-]+\\.)*[0-9a-z_-]+(\\.[a-z]+)+\\/.*$"
},
"color": {
"type": "string",
"description": "The theme color of the service this presence is for. Must be either a 6 digit or a 3 digit hex code.",
"pattern": "^#([A-Fa-f0-9]{3}){1,2}$"
},
"tags": {
"type": ["array"],
"description": "The tags for the presence.",
"items": {
"type": "string",
"description": "A tag.",
"pattern": "^[^A-Z\\s!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^_`{|}~]+$"
},
"minItems": 1
},
"category": {
"type": "string",
"description": "The category the presence falls under.",
"enum": ["anime", "games", "music", "socials", "videos", "other"]
},
"iframe": {
"type": "boolean",
"description": "Whether or not the presence should run in IFrames."
},
"readLogs": {
"type": "boolean",
"description": "Whether or not the extension should be reading logs."
},
"regExp": {
"type": "string",
"description": "A regular expression used to match URLs for the presence to inject into."
},
"iFrameRegExp": {
"type": "string",
"description": "A regular expression used to match IFrames for the presence to inject into."
},
"button": {
"type": "boolean",
"description": "Controls whether the presence is automatically added when the extension is installed. For partner presences only."
},
"warning": {
"type": "boolean",
"description": "Shows a warning saying that it requires additional steps for the presence to function correctly."
},
"settings": {
"type": "array",
"description": "An array of settings the user can change in the presence.",
"items": {
"type": "object",
"description": "A setting.",
"properties": {
"id": {
"type": "string",
"description": "The ID of the setting."
},
"title": {
"type": "string",
"description": "The title of the setting. Required only if `multiLanguage` is disabled."
},
"icon": {
"type": "string",
"description": "The icon of the setting. Required only if `multiLanguage` is disabled.",
"pattern": "^fa[bsd] fa-[0-9a-z-]+$"
},
"if": {
"type": "object",
"description": "Restrict showing this setting if another setting is the defined value.",
"propertyNames": {
"type": "string",
"description": "The ID of the setting."
},
"patternProperties": {
"": {
"type": ["string", "number", "boolean"],
"description": "The value of the setting."
}
},
"additionalProperties": false
},
"placeholder": {
"type": "string",
"description": "The placeholder for settings that require input. Shown when the input is empty."
},
"value": {
"type": ["string", "number", "boolean"],
"description": "The default value of the setting. Not compatible with `values`."
},
"values": {
"type": "array",
"description": "The default values of the setting. Not compatible with `value`.",
"items": {
"type": ["string", "number", "boolean"],
"description": "The value of the setting."
}
},
"multiLanguage": {
"type": ["string", "boolean", "array"],
"description": "When false, multi-localization is disabled. When true, strings from the `general.json` file are available for use. When a string, it is the name of a file (excluding .json) of a used language from the localization GitHub repo. When an array of strings, it is all of the file names (excluding .json) of used languages from the localization GitHub repo.",
"items": {
"type": "string",
"description": "The name of a file from the localization GitHub repository."
}
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false,
"required": ["author", "service", "description", "url", "version", "logo", "thumbnail", "color", "tags", "category"]
}