{"id":22298005,"url":"https://github.com/vanilagy/marbleland","last_synced_at":"2025-06-16T23:39:28.570Z","repository":{"id":45780525,"uuid":"357646330","full_name":"Vanilagy/Marbleland","owner":"Vanilagy","description":"The custom level sharing platform for Marble Blast.","archived":false,"fork":false,"pushed_at":"2025-05-24T14:52:31.000Z","size":2647,"stargazers_count":7,"open_issues_count":0,"forks_count":3,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-06-10T00:08:12.142Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://marbleland.vaniverse.io","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Vanilagy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-04-13T18:06:13.000Z","updated_at":"2025-05-24T14:52:34.000Z","dependencies_parsed_at":"2023-09-24T11:08:38.516Z","dependency_job_id":"27188e34-d098-4bb2-bd91-0fdc754e677d","html_url":"https://github.com/Vanilagy/Marbleland","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Vanilagy/Marbleland","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vanilagy%2FMarbleland","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vanilagy%2FMarbleland/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vanilagy%2FMarbleland/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vanilagy%2FMarbleland/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Vanilagy","download_url":"https://codeload.github.com/Vanilagy/Marbleland/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vanilagy%2FMarbleland/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260261912,"owners_count":22982705,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-03T17:52:20.834Z","updated_at":"2025-06-16T23:39:28.548Z","avatar_url":"https://github.com/Vanilagy.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"client/assets/img/favicon.png\" width=100\u003e\n\n# Marbleland\nThe custom level sharing platform for Marble Blast, allowing you to browse, download and upload custom levels and level packs.\u003cbr\u003ehttps://marbleland.vaniverse.io/\n\n\u003cimg src=\"client/assets/img/homepage.jpg\" width=640\u003e\n\n[View version history](version_history.md)\n\n## About\nCustom levels have always been a central part of all Marble Blast games, but things haven't always been easy:\n\n- Custom levels are all over the place and are therefore hard to find\n- There's no standard place to post your own customs, so they're usually posted on forum threads\n- People format their custom levels differently, making them more difficult to install than they need to be\n\nMarbleland tries to solve these issues by being a central hub for all custom levels. Levels can easily be searched for, filtered and downloaded, and user-compiled custom level packs make it easy to download multiple, related levels at once. Everyone with an account can also upload their own levels to the platform and share them. All custom levels downloaded from Marbleland are automatically normalized into a standard folder structure, which makes installing them as simple as just merging the level folder with your Marble Blast data directory.\n\n## API\nMarbleland also provides a RESTful API for full programmatic interfacing with its features.\n\nCheck out the docs [here](docs/api.md).\n\n## Implementation\nMarbleland's frontend was built using Vue.js and its backend using Node. When custom levels are imported/uploaded, an asset dependency tree is constructed by scanning the .mis file for the required files, and then scanning those files for their dependencies. This way, all assets needed to correctly run the custom level can be identified and included in the .zip. Marbleland currently identifies the mission file and thumbnails, interiors, interior textures, sky materials, TSStatic shapes, custom datablock shapes, shape materials, music and sounds as level dependencies. .mis and .dts file parsing is done using the parsers used in the [webport](https://github.com/Vanilagy/MarbleBlast), and .dif parsing uses RandomityGuy's [hxDif](https://github.com/RandomityGuy/hxDIF) library. Additionally, the custom code used in the .mis file is detected through his [hxTorquescript](https://github.com/RandomityGuy/hxTorqueScript) library.\n\n## Building and developing\nThis project requires Node.js v14.0.0 and above to run. After cloning, simply run `npm install` in the cloned directory to install all required dependencies. Then run `npm run watch` to create the necessary JavaScript bundles and to watch for future file changes. Run `npm run build` to create minified bundles.\n\nMarbleland requires a PQ data directory for default asset lookup. This directory isn't included in the repo, so you'll have to download it. You can get it [here](https://drive.google.com/file/d/14IocHL5g7t0Bf1Iyu1ExKvyKvReLlE7E/view?usp=sharing) or by cloning [PlatinumQuest](https://github.com/PlatinumTeam/PlatinumQuest). Once downloaded, you'll need to tell Marbleland where it is by setting `dataPQ` in `server/data/config.json` to the correct path.\n\nRunning `npm start` starts the HTTP server on the port defined in `server/data/config.json` (8080 by default).\n\nMarbleland offers a few CLI commands:\n\n- `npm run add-directory -- \u003cdirectory-path\u003e [--id-map \u003cid-map-path\u003e] [--replace-duplicates]`\u003cbr\u003e\nImports a directory of custom levels into the database. Will import all .mis files in `\u003cdirectory-path\u003e`.\u003cbr\u003e\u003cbr\u003e\nThe ID map, when specified, has to point to a JSON file that contains an array of `{id: number, baseName: string}` objects. Imported missions whose base name (file name of the .mis file without path) matches a base name in the array will automatically get their ID set to the one specified by the ID map.\u003cbr\u003e\u003cbr\u003e\nWhen the `--replace-duplicates` option is set, duplicate levels already present in the database will be replaced by the freshly imported ones. If it isn't set, the level will be in the database twice. Replaced levels will maintain stats like download count. This option is usually recommended.\n\n- `npm run reimport -- [--allow-creation] [level_id ...]`\u003cbr\u003e\nWill go over all imported levels and reimport them (rebuilding the dependency tree and so on). A list of level IDs can be passed as an optional argument. When present, instead of reimporting all levels, only the levels with the specified IDs will be reimported. When the `--allow-creation` option is set, this command will also be able to import new missions it finds in the directories (instead of just updating old ones).\n\n## Backups\nMarbleland provies a way to automatically and periodically back up all level and pack-related data to a remote git repository. During the backup process, changed files are synced with the repo, committed and pushed to the remote automatically.\n\nTo set this up, you can configure a few values in `server/data/config.json`:\n\n- `backupRepositoryPath` specifies the path to the local repository you want the backup to be placed into. If `null` (default), backups are turned off. \n- `backupRepositoryRemote` specifies the URI of the remote repository which will be used when pushing. You need to make sure you are authorized to push by either including authentication with the URI or configuring your SSH keys. \n- `backupPeriod` specifies the number of seconds between periodic backups. \n- `backupPushSizeLimit` specifies the maximum size of a push to the remote (often, that size is limited).\n\nKeep in mind that your global git name and email also need to be set for this to work.\n\nThe public backups for https://marbleland.vaniverse.io/ can be found [here](https://github.com/Vanilagy/MarblelandBackups/).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvanilagy%2Fmarbleland","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvanilagy%2Fmarbleland","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvanilagy%2Fmarbleland/lists"}