{"id":119334,"date":"2026-06-07T03:26:52","date_gmt":"2026-06-07T00:26:52","guid":{"rendered":"https:\/\/vpesports.com\/minecraft\/mods\/paperts\/"},"modified":"2026-06-07T03:26:52","modified_gmt":"2026-06-07T00:26:52","slug":"paperts","status":"publish","type":"mod","link":"https:\/\/vpesports.com\/minecraft\/mods\/paperts\/","title":{"rendered":"PaperTS"},"content":{"rendered":"<p># PaperTS<\/p>\n<p>PaperTS is a Paper Minecraft plugin that enables you to write Minecraft server plugins in TypeScript, running on the Node.js JavaScript engine via Javet. It provides a runtime environment for TypeScript modules, allowing you to leverage the power and flexibility of JavaScript\/TypeScript for Minecraft server development. **Node.JS runtime is downloaded at runtime**, the plugins install it from Javet Official Depedencies, you may verify if your platform is supported.<\/p>\n<p>## Features<\/p>\n<p>&#8211; **TypeScript\/JavaScript Plugin Support**: Write Minecraft plugins in TypeScript or JavaScript and run them directly on your Paper server.<br \/>\n&#8211; **Automatic Module Loading**: Scans the plugin&#8217;s data folder for modules (directories with a `package.json`), initializes, and starts them automatically.<br \/>\n&#8211; **Node.js Environment**: Provides a Node.js-like environment using Javet&#8217;s NodeRuntime.<br \/>\n&#8211; **Event and Command Registration**: Exposes APIs for registering\/unregistering Bukkit events and commands from TypeScript.<br \/>\n&#8211; **Hot Reloading**: Modules can be released and reloaded without restarting the server.<\/p>\n<p>## How It Works<\/p>\n<p>1. On server start, PaperTS scans its data folder for subdirectories containing a `package.json` file.<br \/>\n2. For each module, it reads the `main` field in `package.json` to find the entry script.<br \/>\n3. The entry script is executed in a Node.js runtime, with access to PaperTS APIs for interacting with the server.<br \/>\n4. Modules can register event handlers and commands using the provided global `PaperTS` object.<\/p>\n<p>## Getting Started<\/p>\n<p>1. **Install PaperTS**: Place the PaperTS plugin JAR in your server&#8217;s `plugins` folder.<br \/>\n2. **Create a Module**:<br \/>\n    &#8211; In the `plugins\/PaperTS` folder, create a new directory for your module (e.g., `my-plugin`).<br \/>\n    &#8211; Add a `package.json` file with a `main` field pointing to your entry script (e.g., `index.js`).<br \/>\n    &#8211; Write your TypeScript\/JavaScript code and compile it to JavaScript if needed.<br \/>\n3. **Example `package.json`**:<\/p>\n<p>    &#8220;`json<br \/>\n    {<br \/>\n      &#8220;name&#8221;: &#8220;my-plugin&#8221;,<br \/>\n      &#8220;main&#8221;: &#8220;index.js&#8221;<br \/>\n    }<br \/>\n    &#8220;`<br \/>\n4. **Example `index.js`**:<\/p>\n<p>    &#8220;`js<br \/>\n    class ServerModule {<br \/>\n      constructor() {<br \/>\n        console.log(&#8220;My plugin has been loaded!&#8221;);<br \/>\n      }<\/p>\n<p>      public handlePlayerJoin(event) {<br \/>\n        \/\/ Handle player join event<br \/>\n        event.player.sendMessage(event.player.name, &#8220;Welcome to the server!&#8221;);<br \/>\n      }<\/p>\n<p>      public helloCommand(sender, args) {<br \/>\n        sender.sendMessage(&#8220;Hello from PaperTS!&#8221;);<br \/>\n      }<br \/>\n    }<\/p>\n<p>    const server = new ServerModule();<\/p>\n<p>    PaperTS.registerEvent(<br \/>\n      org.bukkit.event.player.PlayerJoinEvent,<br \/>\n      server.handlePlayerJoin.bind(server),<br \/>\n    );<br \/>\n    PaperTS.registerCommand(<br \/>\n      &#8220;hello&#8221;,<br \/>\n      &#8220;Says hello to the player&#8221;,<br \/>\n      &#8220;\/hello&#8221;,<br \/>\n      &#8220;&#8221;,<br \/>\n      [],<br \/>\n      server.helloCommand.bind(server),<br \/>\n    );<\/p>\n<p>    &#8220;`<br \/>\n5. Start your Paper server. PaperTS will automatically load your module. You can reload the modules any time using the `\/paperts reload` command.<\/p>\n<p>### Note<\/p>\n<p>#### Importing Node Modules<\/p>\n<p>The root for the imports of node modules is the root of the working directory, so if your directory structure is like this:<\/p>\n<p>&#8220;`<br \/>\nmy-plugin\/<br \/>\n\u251c\u2500\u2500 package.json<br \/>\n\u251c\u2500\u2500 src\/<br \/>\n\u2502   \u2514\u2500\u2500 index.ts<br \/>\n\u251c\u2500\u2500 dist\/<br \/>\n\u2502   \u2514\u2500\u2500 index.js<br \/>\n\u2514\u2500\u2500 node_modules\/<br \/>\n    \u2514\u2500\u2500 some-node-module\/<br \/>\n&#8220;`<\/p>\n<p>PaperTS will look for modules in `my-plugin` directory, you may need to adjust the `require` functiion if you want to import scripts from diferents paths that the root of the module. The required function is already modified with the following code to allow importing the java classes:<\/p>\n<p>&#8220;`js<br \/>\nconst Module = require(&#8220;module&#8221;);<br \/>\nconst originalRequire = Module.prototype.require;<\/p>\n<p>Module.prototype.require = function () {<br \/>\n  if (arguments.length === 1 &#038;&#038; typeof arguments[0] === &#8220;string&#8221; &#038;&#038; (arguments[0].startsWith(&#8220;org.&#8221;) || arguments[0].startsWith(&#8220;java.&#8221;) || arguments[0].startsWith(&#8220;net.&#8221;) || arguments[0].startsWith(&#8220;com.&#8221;))) {<br \/>\n    return javet.package[arguments[0]];<br \/>\n  }<\/p>\n<p>  return originalRequire.apply(this, arguments);<br \/>\n};<br \/>\n&#8220;`<\/p>\n<p>#### Get and Set methods<\/p>\n<p>According to the Javet wiki, Javet guesses the `get` and `set` methods. For example, `getName()` turns into `name`, and `setName(value)` becomes `name = value`. So, when using these methods, you should use the property-like syntax. For example, instead of calling `player.getName()`, you should use `player.name`. Similarly, to set a value, use the assignment syntax like `player.name = &#8220;NewName&#8221;`.<\/p>\n<p>### PaperTS Global API<\/p>\n<p>The following global API is available in your TypeScript\/JavaScript code:<\/p>\n<p>&#8220;`ts<br \/>\nimport { Event } from &#8220;org.bukkit.event&#8221;;<br \/>\nimport { CommandSender } from &#8220;org.bukkit.command&#8221;;<br \/>\nimport { PersistentDataContainer } from &#8220;org.bukkit.persistence&#8221;;<br \/>\nimport { List } from &#8220;java.util&#8221;;<br \/>\nimport { Runnable } from &#8220;java.lang&#8221;;<br \/>\nimport { JavaPlugin } from &#8220;org.bukkit.plugin.java&#8221;;<\/p>\n<p>declare namespace PaperTS {<br \/>\n  export function registerEvent<T extends Event>(<br \/>\n    eventClass: { new (&#8230;args: any[]): T },<br \/>\n    listener: (event: T) => void,<br \/>\n  ): void;<\/p>\n<p>  export function registerCommand(<br \/>\n    name: string,<br \/>\n    description: string,<br \/>\n    usageMessage: string,<br \/>\n    permission: string,<br \/>\n    aliases: string[],<br \/>\n    executor: (sender: CommandSender, args: string[]) => void,<br \/>\n  ): void;<\/p>\n<p>  export function getPersistentContainerString(<br \/>\n    key: string,<br \/>\n    container: PersistentDataContainer<br \/>\n  ): string;<\/p>\n<p>  export function hasKeyPersistentContainer(<br \/>\n    key: string,<br \/>\n    container: PersistentDataContainer<br \/>\n  ): boolean;<\/p>\n<p>  export function setPersistentContainerString(<br \/>\n    key: string,<br \/>\n    value: string,<br \/>\n    container: PersistentDataContainer<br \/>\n  ): void;<\/p>\n<p>  export function getJavaPlugin(): JavaPlugin;<\/p>\n<p>  export function createRunnable(runnable: () => void): Runnable;<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>#### Registering Events<\/p>\n<p>To register events, use the `PaperTS.registerEvent` method. You can pass the event class and a callback function that will be executed when the event is triggered.<\/p>\n<p>&#8220;`js<br \/>\nexport class ServerModule {<br \/>\n  public handlePlayerJoin(event) {<br \/>\n    console.log(`Player ${event.player.name} has joined the server!`);<br \/>\n  }<br \/>\n}<\/p>\n<p>const server = new ServerModule();<\/p>\n<p>PaperTS.registerEvent(<br \/>\n  org.bukkit.event.PlayerJoinEvent,<br \/>\n  server.handlePlayerJoin.bind(server),<br \/>\n);<br \/>\n&#8220;`<\/p>\n<p>#### Registering Commands<\/p>\n<p>To register commands, use the `PaperTS.registerCommand` method. You can specify the command name, description, usage message, permission, aliases, and an executor function that will handle the command execution.<\/p>\n<p>&#8220;`js<br \/>\nclass ServerModule {<br \/>\n  public command(sender, args) {<br \/>\n    console.log(`Command executed by ${sender.displayName()} with args: ${args.join(&#8220;, &#8220;)}`);<br \/>\n  }<br \/>\n}<\/p>\n<p>const server = new ServerModule();<\/p>\n<p>PaperTS.registerCommand(<br \/>\n  &#8220;commandname&#8221;,<br \/>\n  &#8220;Command description&#8221;,<br \/>\n  &#8220;\/commandname <args>&#8220;,<br \/>\n  &#8220;command.permission&#8221;,<br \/>\n  [&#8220;alias1&#8221;, &#8220;alias2&#8221;],<br \/>\n  server.command.bind(server),<br \/>\n);<br \/>\n&#8220;`<\/p>\n<p>#### Note<\/p>\n<p>Using `bind` is necessary when passing methods as callbacks to ensure the correct context (`this`) is maintained.<\/p>\n<p>### Using typescript<\/p>\n<p>To use TypeScript, you can set up a `tsconfig.json` in your module directory:<\/p>\n<p>&#8220;`json<br \/>\n{<br \/>\n  &#8220;compilerOptions&#8221;: {<br \/>\n    &#8220;incremental&#8221;: true,<br \/>\n    &#8220;module&#8221;: &#8220;commonjs&#8221;,<br \/>\n    &#8220;esModuleInterop&#8221;: true,<br \/>\n    &#8220;strict&#8221;: true,<br \/>\n    &#8220;outDir&#8221;: &#8220;.\/dist&#8221;,<br \/>\n    &#8220;forceConsistentCasingInFileNames&#8221;: true,<br \/>\n    &#8220;skipLibCheck&#8221;: true,<br \/>\n    &#8220;typeRoots&#8221;: [<br \/>\n      &#8220;node_modules\/paperts-java-ts-bind&#8221;,<br \/>\n      &#8220;node_modules\/@types&#8221;<br \/>\n    ]<br \/>\n  },<br \/>\n  &#8220;include&#8221;: [<br \/>\n    &#8220;src\/**\/*&#8221;<br \/>\n  ]<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>Install the necessary depedencies in your module directory:<\/p>\n<p>&#8220;`sh<br \/>\nnpm install &#8211;save github:MetlHedd\/java-ts-bind#1.20-R0.1-SNAPSHOT<br \/>\n&#8220;`<\/p>\n<p>You can substitute the version, with another version of the `paperts-java-ts-bind` package, if you want to use a different version. You can also request another version by opening an issue on this repository.<\/p>\n<p>Then, you can write your TypeScript code in the `src` directory and compile it to JavaScript in the `dist` directory.<\/p>\n<p>Your `package.json` should look like this:<\/p>\n<p>&#8220;`json<br \/>\n{<br \/>\n  &#8220;main&#8221;: &#8220;dist\/index.js&#8221;,<br \/>\n  &#8220;scripts&#8221;: {<br \/>\n    &#8220;build&#8221;: &#8220;bun build .\/src\/index.ts &#8211;outdir=.\/dist &#8211;target=node &#8211;format=cjs &#8211;external=org.* &#8211;external=com.* &#8211;external=net.* &#8211;external=io.* &#8211;external=java.* &#8211;external=javet.* &#8211;watch&#8221;<br \/>\n  },<br \/>\n  &#8220;dependencies&#8221;: {<br \/>\n    &#8220;bun&#8221;: &#8220;^1.2.19&#8221;,<br \/>\n    &#8220;paperts-java-ts-bind&#8221;: &#8220;github:MetlHedd\/java-ts-bind#1.21.4-R0.1-SNAPSHOT&#8221;,<br \/>\n    &#8220;typescript&#8221;: &#8220;^5.8.3&#8221;,<br \/>\n    &#8220;@types\/node&#8221;: &#8220;^24.0.15&#8221;<br \/>\n  }<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>Then you can use `npm run build` to bundle your TypeScript code into a single JavaScript file that can be run by PaperTS.<\/p>\n<p>Example `index.ts`:<\/p>\n<p>&#8220;`ts<br \/>\nimport { Event } from &#8220;org.bukkit.event&#8221;;<br \/>\nimport { PlayerJoinEvent } from &#8220;org.bukkit.event.player&#8221;;<br \/>\nimport { CommandSender } from &#8220;org.bukkit.command&#8221;;<\/p>\n<p>declare namespace PaperTS {<br \/>\n  export function registerEvent<T extends Event>(<br \/>\n    eventClass: { new (&#8230;args: any[]): T },<br \/>\n    listener: (event: T) => void,<br \/>\n  ): void;<\/p>\n<p>  export function registerCommand(<br \/>\n    name: string,<br \/>\n    description: string,<br \/>\n    usageMessage: string,<br \/>\n    permission: string,<br \/>\n    aliases: string[],<br \/>\n    executor: (sender: CommandSender, args: string[]) => void,<br \/>\n  ): void;<br \/>\n}<\/p>\n<p>export class ServerModule {<br \/>\n  constructor() {<br \/>\n    \/\/ This constructor is called when the module is loaded<br \/>\n    console.log(&#8220;My plugin has been loaded!&#8221;);<br \/>\n  }<\/p>\n<p>  public handlePlayerJoin(event: PlayerJoinEvent) {<br \/>\n    \/\/ Handle player join event<br \/>\n    event.player.sendMessage(event.player.name, &#8220;Welcome to the server!&#8221;);<br \/>\n  }<\/p>\n<p>  public helloCommand(sender: CommandSender, args: string[]) {<br \/>\n    sender.sendMessage(&#8220;Hello from PaperTS!&#8221;);<br \/>\n  }<br \/>\n}<\/p>\n<p>const server = new ServerModule();<\/p>\n<p>PaperTS.registerEvent(<br \/>\n  PlayerJoinEvent,<br \/>\n  server.handlePlayerJoin.bind(server),<br \/>\n);<br \/>\nPaperTS.registerCommand(<br \/>\n  &#8220;hello&#8221;,<br \/>\n  &#8220;Says hello to the player&#8221;,<br \/>\n  &#8220;\/hello&#8221;,<br \/>\n  &#8220;&#8221;,<br \/>\n  [],<br \/>\n  server.helloCommand.bind(server),<br \/>\n);<br \/>\n&#8220;`<\/p>\n<p>### Internationalization (i18n)<\/p>\n<p>PaperTS supports internationalization (i18n) through the Node.js runtime, enabling it may lead to more compatible behavior with some Node.js modules. To enable i18n, create a folder name `node-icu` in the data folder of the plugin (normally `plugins\/PaperTS\/node-icu`) and place the ICU data files there. You can download the ICU data files from any actions run of the Javet repository. The plugin will automatically detect the presence of the `node-icu` folder and enable i18n support.<\/p>\n<p>### Setting up the Run Type<\/p>\n<p>You can configure how the script runs by specifying the `runType` field in the `package.json` of your module. This determines whether the script executes synchronously or asynchronously, and on which thread. Below is an example configuration:<\/p>\n<p>&#8220;`json<br \/>\n{<br \/>\n  &#8220;runType&#8221;: &#8220;SynchronousOnNextTick&#8221;<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>The available options for `runType` are:<\/p>\n<p>&#8211; **`SynchronousOnNextTick`**: Executes the script synchronously on the next server tick.<br \/>\n&#8211; **`AsynchronousOnNextTick`**: Executes the script asynchronously on the next server tick.<br \/>\n&#8211; **`NewThread`**: Executes the script asynchronously on a separate thread.<\/p>\n<p>### Resource Cleanup<\/p>\n<p>When unloading or reloading a module, PaperTS attempts to clean up resources by calling a `cleanup` function if it exists in the module&#8217;s main script. This function should handle any necessary cleanup tasks, such as closing database connections, closing a http server, or freeing up memory.<\/p>\n<p>## Plugin Commands<\/p>\n<p>You can use the following commands to manage your PaperTS modules:<br \/>\n&#8211; `\/paperts reload`: Reloads all modules.<br \/>\n&#8211; `\/paperts reload <module>`: Reloads a specific module.<br \/>\n&#8211; `\/paperts list`: Lists all loaded modules.<br \/>\n&#8211; `\/paperts unload <module>`: Unloads a specific module.<br \/>\n&#8211; `\/paperts load <module>`: Loads a specific module.<\/p>\n<p>## Development<\/p>\n<p>PaperTS uses Javet to embed the V8 engine and Node.js runtime. The plugin manages engine pools, working directories, and exposes a `Globals` API for event and command management.<\/p>\n<p>### Building<\/p>\n<p>Build with Gradle:<\/p>\n<p>&#8220;`sh<br \/>\n.\/gradlew build<br \/>\n&#8220;`<\/p>\n<p>The output JAR will be in `app\/build\/libs\/`.<\/p>\n<p>## Contributing<\/p>\n<p>Contributions are welcome! Please open issues or pull requests for bug fixes, features, or documentation improvements.<\/p>\n<p>## Inspiration<\/p>\n<p>Some projects that inspired PaperTS:<br \/>\n&#8211; Grakkit<br \/>\n&#8211; Javet<br \/>\n&#8211; Custom Realms<br \/>\n&#8211; CraftJS<br \/>\n&#8211; ScriptCraft<\/p>\n","protected":false},"excerpt":{"rendered":"<p>PaperTS is a Paper Minecraft plugin that enables you to write Minecraft server plugins in TypeScript.<\/p>\n","protected":false},"featured_media":119335,"template":"","meta":{"_minecraft_slug":"paperts","_minecraft_project_id":"uqOgfcal","_minecraft_author":"MetlHedd","_minecraft_license":"MIT","_minecraft_downloads":127,"_minecraft_follows":1,"_minecraft_client_side":"unsupported","_minecraft_server_side":"required","_minecraft_storage_type":"zip","_minecraft_archive_name":"paperts.zip","_minecraft_size_bytes":652556615,"_minecraft_version_count":6,"_minecraft_updated_at":"2026-05-15T19:09:13.196297Z","_minecraft_date_created":"2025-07-29T01:23:52.728378Z","_minecraft_date_modified":"2026-01-16T13:50:34.907740Z","_minecraft_project_url":"https:\/\/modrinth.com\/mod\/paperts","_minecraft_icon_attachment_id":119335,"_minecraft_imported_at":"2026-06-07T00:26:53+00:00","_minecraft_import_hash":"02e4a962987e7ea7dc5cc7bae2b43601","_minecraft_versions":"","_minecraft_links":"","_minecraft_gallery":"","_minecraft_api_metadata":""},"mod_category":[124,125,873,127,128,129,123],"mod_loader":[130,131,132,133,134],"minecraft_version":[59,36,60,93,94,101,102,62,37,40,41,73,74,38,78,79,80,81,82],"class_list":["post-119334","mod","type-mod","status-publish","has-post-thumbnail","hentry","mod_category-bukkit","mod_category-folia","mod_category-library","mod_category-paper","mod_category-purpur","mod_category-spigot","mod_category-technology","mod_loader-bukkit","mod_loader-folia","mod_loader-paper","mod_loader-purpur","mod_loader-spigot","minecraft_version-1-20","minecraft_version-1-20-1","minecraft_version-1-20-2","minecraft_version-1-20-3","minecraft_version-1-20-4","minecraft_version-1-20-5","minecraft_version-1-20-6","minecraft_version-1-21","minecraft_version-1-21-1","minecraft_version-1-21-10","minecraft_version-1-21-11","minecraft_version-1-21-2","minecraft_version-1-21-3","minecraft_version-1-21-4","minecraft_version-1-21-5","minecraft_version-1-21-6","minecraft_version-1-21-7","minecraft_version-1-21-8","minecraft_version-1-21-9"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>PaperTS - Minecraft<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vpesports.com\/minecraft\/mods\/paperts\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PaperTS - Minecraft\" \/>\n<meta property=\"og:description\" content=\"PaperTS is a Paper Minecraft plugin that enables you to write Minecraft server plugins in TypeScript.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vpesports.com\/minecraft\/mods\/paperts\/\" \/>\n<meta property=\"og:site_name\" content=\"Minecraft\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/paperts\\\/\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/paperts\\\/\",\"name\":\"PaperTS - Minecraft\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/paperts\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/paperts\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/paperts-icon-354056f595859979d6c872a5efacb694a02f1921_96.webp\",\"datePublished\":\"2026-06-07T00:26:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/paperts\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/paperts\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/paperts\\\/#primaryimage\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/paperts-icon-354056f595859979d6c872a5efacb694a02f1921_96.webp\",\"contentUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/paperts-icon-354056f595859979d6c872a5efacb694a02f1921_96.webp\",\"width\":96,\"height\":96},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/paperts\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mods\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"PaperTS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\",\"name\":\"Minecraft\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"PaperTS - Minecraft","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vpesports.com\/minecraft\/mods\/paperts\/","og_locale":"en_US","og_type":"article","og_title":"PaperTS - Minecraft","og_description":"PaperTS is a Paper Minecraft plugin that enables you to write Minecraft server plugins in TypeScript.","og_url":"https:\/\/vpesports.com\/minecraft\/mods\/paperts\/","og_site_name":"Minecraft","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/vpesports.com\/minecraft\/mods\/paperts\/","url":"https:\/\/vpesports.com\/minecraft\/mods\/paperts\/","name":"PaperTS - Minecraft","isPartOf":{"@id":"https:\/\/vpesports.com\/minecraft\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/paperts\/#primaryimage"},"image":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/paperts\/#primaryimage"},"thumbnailUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/paperts-icon-354056f595859979d6c872a5efacb694a02f1921_96.webp","datePublished":"2026-06-07T00:26:52+00:00","breadcrumb":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/paperts\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vpesports.com\/minecraft\/mods\/paperts\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/vpesports.com\/minecraft\/mods\/paperts\/#primaryimage","url":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/paperts-icon-354056f595859979d6c872a5efacb694a02f1921_96.webp","contentUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/paperts-icon-354056f595859979d6c872a5efacb694a02f1921_96.webp","width":96,"height":96},{"@type":"BreadcrumbList","@id":"https:\/\/vpesports.com\/minecraft\/mods\/paperts\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vpesports.com\/minecraft\/"},{"@type":"ListItem","position":2,"name":"Mods","item":"https:\/\/vpesports.com\/minecraft\/mods\/"},{"@type":"ListItem","position":3,"name":"PaperTS"}]},{"@type":"WebSite","@id":"https:\/\/vpesports.com\/minecraft\/#website","url":"https:\/\/vpesports.com\/minecraft\/","name":"Minecraft","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vpesports.com\/minecraft\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod\/119334","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod"}],"about":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/types\/mod"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media\/119335"}],"wp:attachment":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media?parent=119334"}],"wp:term":[{"taxonomy":"mod_category","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_category?post=119334"},{"taxonomy":"mod_loader","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_loader?post=119334"},{"taxonomy":"minecraft_version","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/minecraft_version?post=119334"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}