Compare commits

...
Sign in to create a new pull request.

22 commits

Author SHA1 Message Date
Tenkuma
855b859739
Update README.md 2025-12-22 00:02:39 -03:00
Tenkuma
e7ccac2bb2
Update README.md 2025-12-22 00:00:54 -03:00
Tenkuma
e26f459b5c
Set example as JSON for GitHub MD 2025-11-10 20:58:32 -03:00
Tenkuma
0e133f814d
Merge pull request #3 from adrianvic/project-releases
Proper message for when GitHub integration is disabled. Contribute now links to README.md. Fixed minor bug in authors page preventing the correct logo URL to be injected.
2025-11-10 17:18:28 -03:00
e7cefc84bb Proper message for when GitHub integration is disabled. Contribute now links to README.md. Fixed minor bug in authors page preventing the correct logo URL to be injected. 2025-11-10 17:16:29 -03:00
Tenkuma
be92a1ccf7
Create README.md.
Added detailed project documentation and structure guidelines.
2025-11-10 16:20:10 -03:00
Tenkuma
8e4948d5b3
Merge pull request #2 from adrianvic/project-releases
Better CSS for releases page (inspired on GitHub). Github fetched relases now show more info.
2025-10-30 20:37:58 -03:00
f39ab4539c Better CSS for releases page (inspired on GitHub). Github fetched releases now show more info. 2025-10-30 20:35:39 -03:00
Tenkuma
8b98b00558
Update GitHub Actions to use OAUTH_ACCESS_TOKEN 2025-10-29 20:57:31 -03:00
Tenkuma
d8ff59f98a
Set NODE_ENV_SECRET for npm build step
Added NODE_ENV_SECRET environment variable for build step.
2025-10-29 20:55:30 -03:00
Tenkuma
c925ef5304
Merge pull request #1 from adrianvic/project-releases
Added built-in support for project releases with GitHub integration for fetching repo releases.
2025-10-29 20:49:39 -03:00
05fd995edd Added dedicated virtual template for releases. 2025-10-29 20:40:26 -03:00
c2c676ce19 Finished code to get GitHub OAuth token and fetch project releases at build time. 2025-10-28 19:47:12 -03:00
5bceb5af72 Fixed compatibility issues with GitHub Pages. 2025-10-28 14:08:13 -03:00
Tenkuma
738eea756d
Update deploy key in GitHub Actions workflow 2025-10-28 12:17:14 -03:00
Tenkuma
4ce46defb3
removed saas from build 2025-10-28 07:42:25 -03:00
d249a982ef Changed directory structure for gh pages 2025-10-28 07:38:44 -03:00
b472bc2e5d Duhhh wrong directories 2025-10-28 07:30:36 -03:00
046750e0d2 DO I HAVE TO PUSH PACKAGE-LOCK.JSON????? 2025-10-28 07:26:56 -03:00
Tenkuma
8e2e24afe5
Change workflow name and trigger to manual 2025-10-28 07:23:15 -03:00
Tenkuma
5bdeccea1e
Add GitHub Actions workflow for build and deploy 2025-10-28 07:17:04 -03:00
ca5f3dc587 Uploaded _site by mistake. 2025-10-28 07:14:05 -03:00
117 changed files with 2732 additions and 1920 deletions

View file

@ -1,28 +0,0 @@
name: Build PR
on:
pull_request:
branches: ['main']
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: ['20']
steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- name: Install packages
run: npm ci
- name: Run npm build
run: npm run build

View file

@ -1,8 +1,7 @@
name: Build and Deploy
name: Manual Build and Deploy
on:
push:
branches: ['master']
workflow_dispatch:
jobs:
build:
@ -29,8 +28,10 @@ jobs:
- name: Run npm build
run: npm run build:prod
env:
GITHUB_ACCESS_TOKEN: ${{ secrets.OAUTH_ACCESS_TOKEN }}
- name: Deploy to gh-pages
uses: peaceiris/actions-gh-pages@v4
with:
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
deploy_key: ${{ secrets.ACTIONS }}

2
.gitignore vendored
View file

@ -17,4 +17,4 @@
/.vscode
.history
package_lock.json
.env

123
README.md Normal file
View file

@ -0,0 +1,123 @@
<img width="80" height="80" alt="image" src="https://i.postimg.cc/SsRzHt4Y/image.png" />
# neoBeta
This is a static CMS (content management system) made with eleventy for Minecraft mods.
## Why?
Because I love beta Minecraft mods, plugins and texture-packs! And I'm fascinated with static websites that do not juice the user's CPU. Also, I need to spend my free time with something...
## TODO
- [ ] Listing projects in the artist page.
- [ ] Building a single-file repo index for clients to work with ([like what F-Droid does](https://f-droid.org/docs/Setup_an_F-Droid_App_Repo/))
## Project structure
New projects can be added to `/src/project` and need to follow a specific structure for proper recognition:
```graphql
/src/projects/exampleproject/*
├─ index.md - # The text text content for the project page.
├─ index.json - # Project metadata.
├─ logo.png - # Project logo, can be defined to have a different name in the metadata.
└─ docs/* - # Documentation files, will automatically pick up.
├─ install.md - # Example documentation page for installing the plugin.
├─ uninstall.md - # And for uninstalling.
├─ upgrade.md - # And for upgrading.
└─ manage_players.md - # And for managing players.
```
Files used in the project page can be added to it's directory and referenced relatively to the current working dir.
## Project metadata
### Required metadata fields
- *name* - project name.
- *subtitle* - project's brief description.
- *author* - your author name, must be consistent across all your submissions.
- *tags* - whether your project is a plugin or mod.
### Optional metadata fields
- *images* - lists of image files names or URLs that will appear in the project page.
- *logo* - your logo file name or URL.
- *gameVersions* - taget Minecraft versions.
- *gameLoaders* - supported modloaders.
### Releases metadata
- *releasesType* - wheter your project uses `local` releases or `github`.
#### For local releases:
- *releases* - a list of relases labels and links.
- *name* - name of the release.
- *version* - version of the release.
- *gameVersions* - taget Minecraft versions (overrides default value).
- *gameLoaders* - supported modloaders (overrides default value).
- *downloads* - list of download links for this release.
#### For GitHub releases:
- *githubRepoOwner* - username of the repo owner.
- *githubReponame* - name of the repository.
Example index.json for a project:
```json
{
"name": "Ghosts 'n Stuff",
"subtitle": "Miscellaneous additions to your Minecraft server.",
"author": "tenkuma",
"downloadLink": "https://modrinth.com/plugin/ghosts/versions",
"images": ["anti-spam.png", "rainbow-chat.png", "skibidi-blocker.png"],
"logo": "logo.png",
"tags": ["plugin"],
"links": {
"GitHub": "https://github.com/adrianvic/ghostsandstuff",
"Disroot Git": "https://git.disroot.org/adrianvictor/ghostsandstuff"
},
"docs": {
"Installation" : "docs/installation"
},
"releaseType": "github or local",
"githubRepoOwner": "adrianvic",
"githubRepoName": "ghostsandstuff",
"gameLoaders": ["Craftbukkit"]
"releases": [
{
"name": "The first release.",
"version": "1.0.0",
"gameVersions": ["b1.7.3"],
"downloads": {
"GitHub": "https://example.com",
"Modrinth": "https://modrinth.com"
}
}
]
}
```
## Authors structure
The structure for adding new author pages is mostly like the one for project pages:
```graphql
/src/authors/exampleauthor/*
├─ index.md - # The text text content for the author page (bio).
├─ index.json - # Author metadata.
└─ logo.png - # Author logo, can be defined to have a different name in the metadata.
```
The metadata is the same as the projects, however stripped down. The only values are `name`, `subtitle`, `logo` and `images`.
## GitHub API integration
neoBeta can log into a GitHub account using oAuth, this is used to automatically fetch project releases from a GitHub repository. This is needed because GitHub's API has a limit of 60 requests for users that are not authenticated.
Beforing using this integration you need to populate the enviroment variables `GITHUB_CLIENT_ID` and `GITHUB_CLIENT_SECRET` with your own oAuth information, and run `gen-github-token.cjs`. A web server will be started locally (default port is `9876`), redirecting you to GitHub's oAuth screen, after logging in the script will populate `GITHUB_ACCESS_TOKEN` to your `.env`. You can set `GITHUB_ACCESS_TOKEN` directly if you have one.
## Search
Search is provided statically by [elasticlunr](http://elasticlunr.com/). The search index is compiled every time neoBeta is built. From my searches I'm confident elasticlunr will be enough for searching the project base for a sufficient period of time, if it ever get unrealistically heavy to the end-user other solutions will be explored.
## Contributing
### Adding new projects
> [!NOTE]
> I know it's quirky to download neoBeta's whole codebase to add projects, that's why I'll be looking into splitting the projects into a separate repo.
neoBeta is intended to be crowd-sourced, so you can clone our repo, add your plugin page with the ''correct metadata'' and make a merge request. Be sure that you have the necessary rights to upload the project or proper authorization of the creator, open-source projects are better in that matter.
You can also open an issue or send me an [e-mail](mailto:adrianvictor+neobeta@disroot.org) with your project info, or a link for a place with relevant info so I can add your project to our database.
### With code
Feel free to submit your contributions to this repo ^^

View file

@ -1,10 +0,0 @@
---
layout: skeleton.njk
---
<main>
<p>You are seeing the documentation for: <a href="{{ projectData.url }}">{{ projectData.fileSlug }}</a></p>
<hr>
<div>
{{ content | safe }}
</div>
</main>

View file

@ -1,17 +0,0 @@
<header>
<div id="linksBox">
<div id="headerLinksAndTitle">
<div id="logoTitle">
<img src="/assets/logo.png" id="logo">
<h1 id="title" class="rainbowText">neoBeta</h1>
</div>
<ul id="headerLinks">
<li><a href="/">home</a></li>
<li><a href="/search">search</a></li>
<li><a href="/allprojects">index</a></li>
<li><a href="/contribute">contribute</a></li>
</ul>
</div>
<p id="credits">Adrian Victor, 2025 (<a href="https://git.disroot.org/adrianvictor/neoBeta">Unlicense</a>)</p>
</div>
</header>

View file

@ -1,10 +0,0 @@
{% if images %}
<div id="projectImageCarrousel">
<p>Images</p>
<div id="projectCarrouselImageHolder">
{% for image in images %}
<a href="{{ page.dir }}{{ image }}"><img class="projectImage" src="{{ page.dir }}{{ image }}" alt=""></a>
{% endfor %}
</div>
</div>
{% endif %}

View file

@ -1,183 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/assets/stylesheets/styles.css" media="screen">
<link rel="stylesheet" href="/assets/stylesheets/search.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>neoBeta</title>
</head>
<body>
<div id="everythingHelper">
<aside>
<header>
<div id="linksBox">
<div id="headerLinksAndTitle">
<div id="logoTitle">
<img src="/assets/logo.png" id="logo">
<h1 id="title" class="rainbowText">neoBeta</h1>
</div>
<ul id="headerLinks">
<li><a href="/">home</a></li>
<li><a href="/search">search</a></li>
<li><a href="/allprojects">index</a></li>
<li><a href="/contribute">contribute</a></li>
</ul>
</div>
<p id="credits">Adrian Victor, 2025 (<a href="https://git.disroot.org/adrianvictor/neoBeta">Unlicense</a>)</p>
</div>
</header>
</aside>
<main>
<ul style="display: flex; flex-direction: column; gap: 1em;">
<div class="searchItem">
<p>
<img float="left" class="searchItemImage" src="/projects/aboukkit/logo.png">
<a class="searchItemTitle" href="/projects/aboukkit/">Aboukkit</a>
by <a href="/authors/tenkuma">tenkuma</a>
</p>
<p class="searchItemDescription">A simple way to add custom commands with custom responses to your server.</p>
<div class="searchItemTagHolder">
<div class="tag-plugin">plugin</div>
</div>
</div>
<div class="searchItem">
<p>
<img float="left" class="searchItemImage" src="/projects/ghostsandstuff/logo.png">
<a class="searchItemTitle" href="/projects/ghostsandstuff/">Ghosts &#39;n Stuff</a>
by <a href="/authors/tenkuma">tenkuma</a>
</p>
<p class="searchItemDescription">Miscellaneous additions to your Minecraft server.</p>
<div class="searchItemTagHolder">
<div class="tag-plugin">plugin</div>
</div>
</div>
<div class="searchItem">
<p>
<img float="left" class="searchItemImage" src="/projects/tenkumalib/logo.png">
<a class="searchItemTitle" href="/projects/tenkumalib/">tenkuma&#39;s Library</a>
by <a href="/authors/tenkuma">tenkuma</a>
</p>
<p class="searchItemDescription">Library to support my other plugins. Does nothing on it&#39;s own.</p>
<div class="searchItemTagHolder">
<div class="tag-plugin">plugin</div>
</div>
</div>
<div class="searchItem">
<p>
<a class="searchItemTitle" href="/projects/hangglidere/">HangGlideRE</a>
by <a href="/authors/tenkuma">tenkuma</a>
</p>
<p class="searchItemDescription">Fly with a chicken!</p>
<div class="searchItemTagHolder">
<div class="tag-plugin">plugin</div>
</div>
</div>
<div class="searchItem">
<p>
<img float="left" class="searchItemImage" src="/projects/devilwithin/logo.png">
<a class="searchItemTitle" href="/projects/devilwithin/">The Devil Within</a>
by <a href="/authors/tenkuma">tenkuma</a>
</p>
<p class="searchItemDescription">Adds enchanting to Minecraft Beta. Supports balancing through curses.</p>
<div class="searchItemTagHolder">
<div class="tag-plugin">plugin</div>
</div>
</div>
<div class="searchItem">
<p>
<img float="left" class="searchItemImage" src="/projects/timekeeper/logo.png">
<a class="searchItemTitle" href="/projects/timekeeper/">TimeKeeper</a>
by <a href="/authors/tenkuma">tenkuma</a>
</p>
<p class="searchItemDescription">Syncs real world time with your Minecraft server time.</p>
<div class="searchItemTagHolder">
<div class="tag-plugin">plugin</div>
</div>
</div>
<div class="searchItem">
<p>
<img float="left" class="searchItemImage" src="/projects/tefreezer/logo.png">
<a class="searchItemTitle" href="/projects/tefreezer/">teFreezer</a>
by <a href="/authors/tenkuma">tenkuma</a>
</p>
<p class="searchItemDescription">Force your players to refrigerate their food by rotting food in unrefrigerated chests!</p>
<div class="searchItemTagHolder">
<div class="tag-plugin">plugin</div>
</div>
</div>
<div class="searchItem">
<p>
<a class="searchItemTitle" href="/projects/ghostsandstuff/docs/example_documentation/"></a>
</p>
<p class="searchItemDescription"></p>
<div class="searchItemTagHolder">
</div>
</div>
</ul>
<nav>
</nav>
</main>
</div>
</body>
</html>

View file

@ -1,121 +0,0 @@
#projectTitle {
font-size: xx-large;
}
#projectTitleSubtitle {
margin-top: auto;
margin-bottom: auto;
}
#projectTitleSubtitle h1 {
margin-bottom: 0;
}
#projectHeader {
padding-top: 20px;
gap: 20px;
display: flex;
}
#project {
display: flex;
flex-direction: column;
gap: var(--box-gap);
width: 100%;
}
#downloadLink {
color: gray;
height: fit-content;
margin-top: auto;
margin-bottom: auto;
margin-left: auto;
text-align: right;
/* text-shadow: 2px 2px black; */
}
#downloadButton:hover {
cursor: pointer;
}
#projectHeader img {
outline: 2px solid gray;
height: 5em;
image-rendering: pixelated;
}
#projectTitleAuthor {
display: flex;
}
#projectAuthor {
margin-left: .6em;
margin-top: auto;
/* margin-bottom: .4em; */
}
#projectImageCarrousel {
outline: 2px solid gray;
padding: 1rem;
display: flex;
flex-direction: column;
width: 50%;
}
#projectCarrouselImageHolder {
height: 100%;
gap: 1em;
overflow: auto;
scroll-margin-left: 10px;
overflow-x: scroll;
white-space: nowrap;
}
.projectImage {
transition: .4s;
height: 95%;
max-width: 10em;
object-fit: cover;
/* filter: grayscale(); */
}
/* .projectImage:hover {
filter: none;
opacity: .8;
max-width: 100%;
object-fit: unset;
} */
#projectImagesAndInfo {
display: flex;
gap: 2em;
height: 12em;
}
#projectInfo {
outline: 2px solid var(--accent-color);
background-color: var(--accent-background);
flex-grow: 1;
padding: 1em;
overflow-y: auto;
}
@media only screen and (max-width: 1280px) {
#projectImagesAndInfo {
flex-direction: column;
flex-grow: unset;
}
#projectImagesAndInfo {
height: unset;
}
#projectInfo {
height: 13em;
}
#projectImageCarrousel {
height: 13em;
width: unset;
}
}

View file

@ -1,272 +0,0 @@
:root {
--text-color: white;
--accent-color: greenyellow;
--accent-secondary: green;
--box-gap: 2rem;
--accent-background: rgb(0, 30, 0);
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
scrollbar-color: var(--accent-color) var(--accent-background);
}
@font-face {
font-family: Minecraft;
src: url("/assets/MinecraftRegular-Bmg3.otf") format("opentype");
}
body {
font-family: Minecraft, 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: black;
color:white;
font-size : clamp(1.2rem, .2vw, 2rem);
}
header {
display: flex;
text-align: center;
}
aside {
width: min-content;
user-select: none;
}
a {
text-decoration: none;
color: var(--accent-color);
}
main {
outline: 2px solid gray;
padding: 1em;
background-color: black;
height: fit-content;
border-radius: 0 0 4px 4px;
width: 100%;
}
/* main:last-child {
margin-bottom: 0px;
padding-bottom: 0px;
} */
button {
padding: 10px;
border: medium solid var(--accent-color);
background: linear-gradient(var(--accent-color), var(--accent-secondary));
border-radius: 2px;
color: white;
}
code {
background-color: darkslategray;
color: var(--accent-color);
padding-left: .2em;
padding-right: .2em;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
border-radius: 2px;
display: inline-block;
}
input, select {
padding: .4em;
background-color: black;
color: white;
border: medium solid var(--accent-color);
}
p, ul {
padding-bottom: .6em;
}
img {
image-rendering: pixelated;
}
hr {
margin-bottom: 1em;
}
#linksBox {
padding: 2em;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
width: 100%;
background-color: black;
outline: 2px solid var(--accent-color);
border-radius: 0 0 4px 4px;
height: fit-content;
gap: 1em;
background-color: rgb(0, 30, 0);
}
#headerLinks a {
margin-top: auto;
margin-bottom: auto;
padding: 0;
padding-left: 0;
}
#everythingHelper {
max-width: 80%;
margin: auto;
transform: .2s;
display: flex;
gap: var(--box-gap);
}
#headerLinks {
padding: 0;
text-align: left;
width: 100%;
}
#headerLinksAndTitle {
display: flex;
flex-direction: column;
gap: 1em;
}
#logoTitle {
display: flex;
flex-direction: column;
gap: .5em;
}
#title {
margin: auto;
text-align: center;
}
#logo {
height: 8em;
}
#featured {
display: flex;
flex-direction: column;
}
#featuredHelper {
display: flex;
flex-direction: column;
}
.featuredProject {
gap: 1em;
display: flex;
transition: .2s;
font-size: smaller;
padding: 4px;
overflow: hidden;
}
.featuredProjectName {
margin-top: auto;
padding: 0;
}
.featuredProjectSubtitle {
overflow: hidden;
width: 100%;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical
}
.featuredProjectSubtitle {
padding-bottom: 0px;
}
.featuredProject img {
height: 5em;
border: medium solid var(--accent-color);
}
.featuredProject p {
margin-right: auto;
margin-left: auto;
text-overflow:clip;
}
#featured h2 {
font-size: medium;
font-weight: 100;
margin-bottom: 10px;
}
#featuredHelper {
gap: 10px;
flex-wrap: wrap;
}
li {
margin-left: 20px;
list-style-type: "> ";
margin-bottom: .4em;
}
h1, h2, h3 {
margin-bottom: .4em;
}
.errorQuote {
color: gray;
}
.dimText {
opacity: .6;
}
.rainbowText {
background: linear-gradient(to right, var(--text-color), var(--accent-color), var(--accent-secondary));
-webkit-background-clip: text;
background-clip: text;
color: transparent;
animation: rainbow_animation 6s ease-in-out infinite;
background-size: 400% 100%;
}
@keyframes rainbow_animation {
0%,100% {
background-position: 0 0;
}
50% {
background-position: 100% 0;
}
}
@media only screen and (max-width: 1280px) {
#everythingHelper {
flex-direction: column;
}
aside {
width: 100%;
}
#projectTitle {
font-size: larger;
}
#headerLinksAndTitle {
flex-direction: row;
}
#headerLinks {
margin-left: 2em;
}
}
@media only screen and (max-width: 300px) {
}

View file

@ -1,63 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/assets/stylesheets/styles.css" media="screen">
<link rel="stylesheet" href="/assets/stylesheets/project.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>tenkuma - neoBeta</title>
</head>
<body>
<div id="everythingHelper">
<aside>
<header>
<div id="linksBox">
<div id="headerLinksAndTitle">
<div id="logoTitle">
<img src="/assets/logo.png" id="logo">
<h1 id="title" class="rainbowText">neoBeta</h1>
</div>
<ul id="headerLinks">
<li><a href="/">home</a></li>
<li><a href="/search">search</a></li>
<li><a href="/allprojects">index</a></li>
<li><a href="/contribute">contribute</a></li>
</ul>
</div>
<p id="credits">Adrian Victor, 2025 (<a href="https://git.disroot.org/adrianvictor/neoBeta">Unlicense</a>)</p>
</div>
</header>
</aside>
<div id="project">
<div id="projectHeader">
<img src="logo.png">
<div id="projectTitleSubtitle">
<div id="projectTitleAuthor">
<h1 id="projectTitle">tenkuma</h1>
</div>
<p id="projectSubtitle">A bear doing things on the internet.</p>
</div>
</div>
<div id="projectImageCarrousel">
<p>Images</p>
<div id="projectCarrouselImageHolder">
<a href="tenkuma-silverfish.jpg"><img class="projectImage" src="tenkuma-silverfish.jpg" alt=""></a>
<a href="tenkuma-mrnando-enderdragon.jpg"><img class="projectImage" src="tenkuma-mrnando-enderdragon.jpg" alt=""></a>
</div>
</div>
<main id="projectDescription">
<p>I'm tenkuma. A bear, dreamer and sometimes developer.</p>
<p>You can find more about me on <a href="https://adrianvictor.rf.gd">my website</a>.</p>
</main>
</div>
</div>
</body>
</html>

View file

@ -1,76 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/assets/stylesheets/styles.css" media="screen">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>neoBeta</title>
</head>
<body>
<div id="everythingHelper">
<aside>
<header>
<div id="linksBox">
<div id="headerLinksAndTitle">
<div id="logoTitle">
<img src="/assets/logo.png" id="logo">
<h1 id="title" class="rainbowText">neoBeta</h1>
</div>
<ul id="headerLinks">
<li><a href="/">home</a></li>
<li><a href="/search">search</a></li>
<li><a href="/allprojects">index</a></li>
<li><a href="/contribute">contribute</a></li>
</ul>
</div>
<p id="credits">Adrian Victor, 2025 (<a href="https://git.disroot.org/adrianvictor/neoBeta">Unlicense</a>)</p>
</div>
</header>
</aside>
<main>
<h2>How can I get my project here?</h2>
<p>neoBeta is an open-source content management system. There are various ways you can put your plugin/mod on our catalog:</p>
<ul>
<li>Clone <a href="https://github.com/adrianvic/neoBeta">neoBeta's repository</a>, create your project folder inside the /projects directory with the necessary metadata (index.md for project description, index.json for metadata and any other file your project may depend on) and make a pull request. Less manual work on our side, so review should be quickier.</li>
<li>Open an issue on our GitHub repository with the project information. This may take longer as a contributor will have to spend time creating the project files, but is useful if you're not confortable using Git.</li>
<li>Host your own instance of neoBeta.</li>
</ul>
<h3>Required metadata fields</h3>
<ul>
<li><em>name</em> - project name.<br>
<code>&quot;name&quot;: &quot;Ghosts 'n Stuff&quot;</code></li>
<li><em>subtitle</em> - project's brief description.<br>
<code>&quot;subtitle&quot;: &quot;Miscellaneous additions to your server.&quot;</code></li>
<li><em>author</em> - your author name, must be consistent across all your submissions.<br>
<code>&quot;author&quot;: &quot;tenkuma&quot;</code></li>
<li><em>tags</em> - whether your project is a plugin or mod.<br>
<code>&quot;tags&quot;: [&quot;plugin&quot;, &quot;mod&quot;]</code></li>
</ul>
<h3>Optional metadata fields</h3>
<p>Please fill as many fields as possible.</p>
<ul>
<li><em>downloadLink</em> - link for when you click the download link.<br>
<code>&quot;downloadLink&quot;: &quot;https://example.com&quot;</code></li>
<li><em>images</em> - lists of image files names or URLs that will appear in the project page.<br>
<code>&quot;images&quot;: &quot;[&quot;image1.png&quot;, &quot;image2.png&quot;, &quot;image3.png&quot;]&quot;</code></li>
<li><em>logo</em> - your logo file name or URL.<br>
<code>&quot;logo&quot;: &quot;logo.png&quot;</code></li>
</ul>
<h3>Config file example</h3>
<pre><code>{
&quot;name&quot;: &quot;Ghosts 'n Stuff&quot;,
&quot;subtitle&quot;: &quot;Miscellaneous additions to your server.&quot;,
&quot;author&quot;: &quot;tenkuma&quot;,
&quot;downloadLink&quot;: &quot;https://example.com&quot;,
&quot;images&quot;: &quot;[&quot;image1.png&quot;, &quot;image2.png&quot;, &quot;image3.png&quot;]&quot;,
&quot;logo&quot;: &quot;logo.png&quot;,
&quot;tags&quot;: [&quot;plugin&quot;, &quot;mod&quot;]
}
</code></pre>
</main>
</div>
</body>
</html>

View file

@ -1,42 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/assets/stylesheets/styles.css" media="screen">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>neoBeta</title>
</head>
<body>
<div id="everythingHelper">
<aside>
<header>
<div id="linksBox">
<div id="headerLinksAndTitle">
<div id="logoTitle">
<img src="/assets/logo.png" id="logo">
<h1 id="title" class="rainbowText">neoBeta</h1>
</div>
<ul id="headerLinks">
<li><a href="/">home</a></li>
<li><a href="/search">search</a></li>
<li><a href="/allprojects">index</a></li>
<li><a href="/contribute">contribute</a></li>
</ul>
</div>
<p id="credits">Adrian Victor, 2025 (<a href="https://git.disroot.org/adrianvictor/neoBeta">Unlicense</a>)</p>
</div>
</header>
</aside>
<main>
<h2>404 - Ouch! We hit a wall.</h2>
<p>We didn't find what you are looking for...</p>
<p class="errorQuote"><i>"If only the clockworks could speak<br>I wouldn't be so alone"</i></p>
</main>
</div>
</body>
</html>

View file

@ -1,270 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/assets/stylesheets/styles.css" media="screen">
<link rel="stylesheet" href="/assets/stylesheets/home.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>neoBeta</title>
</head>
<body>
<div id="everythingHelper">
<aside>
<header>
<div id="linksBox">
<div id="headerLinksAndTitle">
<div id="logoTitle">
<img src="/assets/logo.png" id="logo">
<h1 id="title" class="rainbowText">neoBeta</h1>
</div>
<ul id="headerLinks">
<li><a href="/">home</a></li>
<li><a href="/search">search</a></li>
<li><a href="/allprojects">index</a></li>
<li><a href="/contribute">contribute</a></li>
</ul>
</div>
<p id="credits">Adrian Victor, 2025 (<a href="https://git.disroot.org/adrianvictor/neoBeta">Unlicense</a>)</p>
</div>
</header>
</aside>
<main>
<h1>Howdy, traveler.</h1>
<p>This website is <b class="rainbowText">the place</b> for Minecraft plugins, made with users and developers in mind. neobeta is open-source, you can find out how the website is made in our <a href="https://github.com/adrianvic/neoBeta">GitHub repository</a> <span class="dimText">(spoiler: there's some real magic going on).</span></p>
<p>Our catalog is made by developers and community, you can get involved by following the tutorial linked <a href="/contribute">here</a>.</p>
<div id="featureAndUpdates">
<div>
<h2>Featured projects</h2>
<div id="featured">
<div id="featuredHelper">
<div class="featuredProject">
<a href="/projects/ghostsandstuff">
<img src="/projects/ghostsandstuff/logo.png">
</a>
<div>
<p class="featuredProjectName">Ghosts &#39;n Stuff</p>
<p class="featuredProjectSubtitle">by <a href="/authors/tenkuma/">tenkuma</a></p>
<div class="featuredProjectSubtitle dimText">Miscellaneous additions to your Minecraft server.</div>
</div>
</div>
<div class="featuredProject">
<a href="/projects/aboukkit">
<img src="/projects/aboukkit/logo.png">
</a>
<div>
<p class="featuredProjectName">Aboukkit</p>
<p class="featuredProjectSubtitle">by <a href="/authors/tenkuma/">tenkuma</a></p>
<div class="featuredProjectSubtitle dimText">A simple way to add custom commands with custom responses to your server.</div>
</div>
</div>
<div class="featuredProject">
<a href="/projects/tenkumalib">
<img src="/projects/tenkumalib/logo.png">
</a>
<div>
<p class="featuredProjectName">tenkuma&#39;s Library</p>
<p class="featuredProjectSubtitle">by <a href="/authors/tenkuma/">tenkuma</a></p>
<div class="featuredProjectSubtitle dimText">Library to support my other plugins. Does nothing on it&#39;s own.</div>
</div>
</div>
<div class="featuredProject">
<a href="/projects/hangglidere">
<img src="/assets/mod-placeholder.png">
</a>
<div>
<p class="featuredProjectName">HangGlideRE</p>
<p class="featuredProjectSubtitle">by <a href="/authors/tenkuma/">tenkuma</a></p>
<div class="featuredProjectSubtitle dimText">Fly with a chicken!</div>
</div>
</div>
<div class="featuredProject">
<a href="/projects/devilwithin">
<img src="/projects/devilwithin/logo.png">
</a>
<div>
<p class="featuredProjectName">The Devil Within</p>
<p class="featuredProjectSubtitle">by <a href="/authors/tenkuma/">tenkuma</a></p>
<div class="featuredProjectSubtitle dimText">Adds enchanting to Minecraft Beta. Supports balancing through curses.</div>
</div>
</div>
<div class="featuredProject">
<a href="/projects/timekeeper">
<img src="/projects/timekeeper/logo.png">
</a>
<div>
<p class="featuredProjectName">TimeKeeper</p>
<p class="featuredProjectSubtitle">by <a href="/authors/tenkuma/">tenkuma</a></p>
<div class="featuredProjectSubtitle dimText">Syncs real world time with your Minecraft server time.</div>
</div>
</div>
<div class="featuredProject">
<a href="/projects/tefreezer">
<img src="/projects/tefreezer/logo.png">
</a>
<div>
<p class="featuredProjectName">teFreezer</p>
<p class="featuredProjectSubtitle">by <a href="/authors/tenkuma/">tenkuma</a></p>
<div class="featuredProjectSubtitle dimText">Force your players to refrigerate their food by rotting food in unrefrigerated chests!</div>
</div>
</div>
</div>
</div>
</div>
<div id="homeUpdates">
<h2>Latest updates</h2>
<p>2025-10-27: Website redesign!<br>Yaaay! neoBeta got a stylish redesign.</p>
</div>
</div>
</main>
</div>
</body>
</html>

View file

@ -1,71 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/assets/stylesheets/styles.css" media="screen">
<link rel="stylesheet" href="/assets/stylesheets/project.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Aboukkit - neoBeta</title>
</head>
<body>
<div id="everythingHelper">
<aside>
<header>
<div id="linksBox">
<div id="headerLinksAndTitle">
<div id="logoTitle">
<img src="/assets/logo.png" id="logo">
<h1 id="title" class="rainbowText">neoBeta</h1>
</div>
<ul id="headerLinks">
<li><a href="/">home</a></li>
<li><a href="/search">search</a></li>
<li><a href="/allprojects">index</a></li>
<li><a href="/contribute">contribute</a></li>
</ul>
</div>
<p id="credits">Adrian Victor, 2025 (<a href="https://git.disroot.org/adrianvictor/neoBeta">Unlicense</a>)</p>
</div>
</header>
</aside>
<div id="project">
<div id="projectHeader">
<img src="logo.png">
<div id="projectTitleSubtitle">
<div id="projectTitleAuthor">
<h1 id="projectTitle">Aboukkit</h1>
<p id="projectAuthor">by <a href="/authors/tenkuma">tenkuma</a></p>
</div>
<p id="projectSubtitle">A simple way to add custom commands with custom responses to your server.</p>
</div>
<a id="downloadLink" href="https://modrinth.com/plugin/aboukkit/versions"><button id="downloadButton">Download</button></a>
</div>
<main id="projectDescription">
<p><img src="https://cdn.modrinth.com/data/cached_images/94b1f813f8e15f82dddcffa5284c92e59cb93b27.png" alt="Aboukkit logo, abboukit written in a Minecraft's logo like font painted in red."></p>
<p>This plugin adds a simple way to add custom commands that will respond users with predefined messages from <code>config.yml</code>. It supports Minecraft's color coding (use &amp; instead of §) <s>and placeholders for player/server info</s> (TODO).</p>
<h2>Default Commands</h2>
<ul>
<li>About</li>
<li>Aboukkit</li>
</ul>
<p>These default commands need to be configured.</p>
<h2>Adding new commands</h2>
<p>First of all: run the server with the plugin for the first time, so <code>config.yml</code> is generated.</p>
<p>Follow the structure that the template shows in your <code>config.yml</code>. Then use a file explorer to open the plugin's JAR file and edit plugin.yml, you can copy a command entry and fill all the fields (be careful with indentation, YML does not support TAB).</p>
<h2>Why?</h2>
<p>I made this plugin because I have a server for version b1.7.3 and I wanted to add a /about command to give credit to the server founders and link to our website. So I made this that I will use every time I need a simple 'wall of text' command.</p>
<h2>Newer versions</h2>
<p>I don't see why I would build this for latest versions, I guess there are already better solutions. I made this just because of the lack of plugins for Minecraft beta.</p>
</main>
</div>
</div>
</body>
</html>

View file

@ -1,84 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/assets/stylesheets/styles.css" media="screen">
<link rel="stylesheet" href="/assets/stylesheets/project.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>The Devil Within - neoBeta</title>
</head>
<body>
<div id="everythingHelper">
<aside>
<header>
<div id="linksBox">
<div id="headerLinksAndTitle">
<div id="logoTitle">
<img src="/assets/logo.png" id="logo">
<h1 id="title" class="rainbowText">neoBeta</h1>
</div>
<ul id="headerLinks">
<li><a href="/">home</a></li>
<li><a href="/search">search</a></li>
<li><a href="/allprojects">index</a></li>
<li><a href="/contribute">contribute</a></li>
</ul>
</div>
<p id="credits">Adrian Victor, 2025 (<a href="https://git.disroot.org/adrianvictor/neoBeta">Unlicense</a>)</p>
</div>
</header>
</aside>
<div id="project">
<div id="projectHeader">
<img src="logo.png">
<div id="projectTitleSubtitle">
<div id="projectTitleAuthor">
<h1 id="projectTitle">The Devil Within</h1>
<p id="projectAuthor">by <a href="/authors/tenkuma">tenkuma</a></p>
</div>
<p id="projectSubtitle">Adds enchanting to Minecraft Beta. Supports balancing through curses.</p>
</div>
<a id="downloadLink" href="https://modrinth.com/plugin/devilwithin/versions"><button id="downloadButton">Download</button></a>
</div>
<main id="projectDescription">
<p>This plugin is a remake of <a href="https://dev.bukkit.org/projects/goldenchant/">GoldEnchant</a>.
This plugin depends on <a href="https://modrinth.com/plugin/tenkumalib">tenkumaLib</a>.</p>
<p>Have you ever wanted to have enchantments in your beta server? This is the plugin you want.</p>
<h2>Enchanting</h2>
<p>To enchant a armor piece you need to interact to a diamond block with a diamond armor piece in your hand.</p>
<h2>Enchantments and Curses</h2>
<p>All of those enchantments will not take effect if the damage exceeds the player's HP. An armor get cursed if it's durability is below 30%. Spooky bad stuff will happen if your armor is cursed :D</p>
<h3>Helmet</h3>
<ul>
<li>Prevents the player from drowning.</li>
<li>The player cannot sleep. If the player try to sleep a entity will tell the player the text set in the config.</li>
</ul>
<h3>Chestplate</h3>
<ul>
<li>Prevents fire damage. Does not prevent lava damage.</li>
<li>Protects the player from fire damage only half of the time, also has a 25% chance to ignite the player every time it takes damage.</li>
</ul>
<h3>Leggings</h3>
<ul>
<li>Nothing for now. Only useful for the full-set perks.</li>
<li>Makes player run slower 50% of the time a PlayerMoveEvent happens. The speed is randomly generated.</li>
</ul>
<h3>Boots</h3>
<p>Prevents fall damage.</p>
<h3>Full-set perks</h3>
<p>If the player has a full-set of enchanted armor the condition of the damage being taken if it's greater than the player's HP is ignored, also the player gets immune to contact damage (cactus), lava damage and lava damage.</p>
<h2>Config</h2>
<p>Everything is explained in the config file's comments, in case it changes.</p>
</main>
</div>
</div>
</body>
</html>

View file

@ -1,49 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/assets/stylesheets/styles.css" media="screen">
<link rel="stylesheet" href="/assets/stylesheets/project.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>neoBeta</title>
</head>
<body>
<div id="everythingHelper">
<aside>
<header>
<div id="linksBox">
<div id="headerLinksAndTitle">
<div id="logoTitle">
<img src="/assets/logo.png" id="logo">
<h1 id="title" class="rainbowText">neoBeta</h1>
</div>
<ul id="headerLinks">
<li><a href="/">home</a></li>
<li><a href="/search">search</a></li>
<li><a href="/allprojects">index</a></li>
<li><a href="/contribute">contribute</a></li>
</ul>
</div>
<p id="credits">Adrian Victor, 2025 (<a href="https://git.disroot.org/adrianvictor/neoBeta">Unlicense</a>)</p>
</div>
</header>
</aside>
<main>
<p>You are seeing the documentation for: <a href=""></a></p>
<hr>
<div>
<h2>Installation instructions for GhostsAndStuff</h2>
<ul>
<li>Download the plugin JAR</li>
<li>Download the dependency JAR (tenkumaLib)</li>
<li>Move both to your server's <code>plugin</code> folder.</li>
</ul>
<p>After following these steps the plugin should appear in the plugin list when you turn the server on.</p>
</div>
</main>
</div>
</body>
</html>

View file

@ -1,101 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/assets/stylesheets/styles.css" media="screen">
<link rel="stylesheet" href="/assets/stylesheets/project.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ghosts &#39;n Stuff - neoBeta</title>
</head>
<body>
<div id="everythingHelper">
<aside>
<header>
<div id="linksBox">
<div id="headerLinksAndTitle">
<div id="logoTitle">
<img src="/assets/logo.png" id="logo">
<h1 id="title" class="rainbowText">neoBeta</h1>
</div>
<ul id="headerLinks">
<li><a href="/">home</a></li>
<li><a href="/search">search</a></li>
<li><a href="/allprojects">index</a></li>
<li><a href="/contribute">contribute</a></li>
</ul>
</div>
<p id="credits">Adrian Victor, 2025 (<a href="https://git.disroot.org/adrianvictor/neoBeta">Unlicense</a>)</p>
</div>
</header>
</aside>
<div id="project">
<div id="projectHeader">
<img src="logo.png">
<div id="projectTitleSubtitle">
<div id="projectTitleAuthor">
<h1 id="projectTitle">Ghosts &#39;n Stuff</h1>
<p id="projectAuthor">by <a href="/authors/tenkuma">tenkuma</a></p>
</div>
<p id="projectSubtitle">Miscellaneous additions to your Minecraft server.</p>
</div>
<a id="downloadLink" href="https://modrinth.com/plugin/ghosts/versions"><button id="downloadButton">Download</button></a>
</div>
<div id="projectImagesAndInfo">
<div id="projectImageCarrousel">
<p>Images</p>
<div id="projectCarrouselImageHolder">
<a href="anti-spam.png"><img class="projectImage" src="anti-spam.png" alt=""></a>
<a href="rainbow-chat.png"><img class="projectImage" src="rainbow-chat.png" alt=""></a>
<a href="skibidi-blocker.png"><img class="projectImage" src="skibidi-blocker.png" alt=""></a>
</div>
</div>
<div id="projectInfo">
<h2>Here's what we found:</h2>
<p>2 links.</p>
<ul>
<li><a href="https://github.com/adrianvic/ghostsandstuff">GitHub</a></li>
<li><a href="https://git.disroot.org/adrianvictor/ghostsandstuff">Disroot Git</a></li>
</ul>
<p>1 documentaion files.</p>
<ul>
<li><a href="docs/example_documentation">Installation</a></li>
</ul>
</div>
</div>
<main id="projectDescription">
<p>This plugins was made to use stuff from my library that would not fit into any plugin (or not in the way presented here) that has <s>a lot</s> (WIP) of random stuff. Everything should be togglable in the config.</p>
<h2>Features</h2>
<ul>
<li><strong>RainbowChat:</strong> Rainbow color code (&amp;z by default).</li>
<li><strong>SkibidiBlocker:</strong> Strike a lightning on players that say a word.</li>
<li><strong>AntiSpam:</strong> Blocks repeated words in the chat. Optionally can strike a lightning to the player who is spamming.</li>
</ul>
</main>
</div>
</div>
</body>
</html>

View file

@ -1,56 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/assets/stylesheets/styles.css" media="screen">
<link rel="stylesheet" href="/assets/stylesheets/project.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>HangGlideRE - neoBeta</title>
</head>
<body>
<div id="everythingHelper">
<aside>
<header>
<div id="linksBox">
<div id="headerLinksAndTitle">
<div id="logoTitle">
<img src="/assets/logo.png" id="logo">
<h1 id="title" class="rainbowText">neoBeta</h1>
</div>
<ul id="headerLinks">
<li><a href="/">home</a></li>
<li><a href="/search">search</a></li>
<li><a href="/allprojects">index</a></li>
<li><a href="/contribute">contribute</a></li>
</ul>
</div>
<p id="credits">Adrian Victor, 2025 (<a href="https://git.disroot.org/adrianvictor/neoBeta">Unlicense</a>)</p>
</div>
</header>
</aside>
<div id="project">
<div id="projectHeader">
<div id="projectTitleSubtitle">
<div id="projectTitleAuthor">
<h1 id="projectTitle">HangGlideRE</h1>
<p id="projectAuthor">by <a href="/authors/tenkuma">tenkuma</a></p>
</div>
<p id="projectSubtitle">Fly with a chicken!</p>
</div>
<a id="downloadLink" href=""><button id="downloadButton">Unavailable</button></a>
</div>
<main id="projectDescription">
<h2>Oopsie! :<</h2>
<p>Seems like we don't have a description for this project.</p>
<p class="errorQuote"><i>"If only the clockworks could speak<br>I wouldn't be so alone"</i></p>
</main>
</div>
</div>
</body>
</html>

View file

@ -1,69 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/assets/stylesheets/styles.css" media="screen">
<link rel="stylesheet" href="/assets/stylesheets/project.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>teFreezer - neoBeta</title>
</head>
<body>
<div id="everythingHelper">
<aside>
<header>
<div id="linksBox">
<div id="headerLinksAndTitle">
<div id="logoTitle">
<img src="/assets/logo.png" id="logo">
<h1 id="title" class="rainbowText">neoBeta</h1>
</div>
<ul id="headerLinks">
<li><a href="/">home</a></li>
<li><a href="/search">search</a></li>
<li><a href="/allprojects">index</a></li>
<li><a href="/contribute">contribute</a></li>
</ul>
</div>
<p id="credits">Adrian Victor, 2025 (<a href="https://git.disroot.org/adrianvictor/neoBeta">Unlicense</a>)</p>
</div>
</header>
</aside>
<div id="project">
<div id="projectHeader">
<img src="logo.png">
<div id="projectTitleSubtitle">
<div id="projectTitleAuthor">
<h1 id="projectTitle">teFreezer</h1>
<p id="projectAuthor">by <a href="/authors/tenkuma">tenkuma</a></p>
</div>
<p id="projectSubtitle">Force your players to refrigerate their food by rotting food in unrefrigerated chests!</p>
</div>
<a id="downloadLink" href="https://modrinth.com/plugin/freezer/versions"><button id="downloadButton">Download</button></a>
</div>
<main id="projectDescription">
<p><img src="https://cdn.modrinth.com/data/cached_images/0aaabfb51609876ece6de83e62b9641a4635fad9_0.webp" alt="Tefreezer written in Minecraft-like font in purple."></p>
<p>teFreezer is a fork of <a href="https://dev.bukkit.org/projects/freezer">Freezer by outadoc</a>, logo by <a href="https://github.com/malcolmriley/unused-textures/blob/master/items/food_pepper.png">malcolmriley</a>.</p>
<p>This plugins purpose is to force people in your server to refrigerate their food by placing a cold block around their chest with the food. In case there is no cold block around the chest, it will turn the food into a rotted item.</p>
<h2>Configuration</h2>
<p>In the <code>config.yml</code> you can set these values:</p>
<ul>
<li>Cold blocks</li>
<li>Resulting itens</li>
<li>Itens that can rot</li>
<li>Message for when the user let food rot</li>
</ul>
<h2>Why fork?</h2>
<p>I have forked this plugin because I was really anoyed by the original plugin that broadcasts the message to the whole server once anyone let food rot and the lack of a configuration file.</p>
</main>
</div>
</div>
</body>
</html>

View file

@ -1,59 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/assets/stylesheets/styles.css" media="screen">
<link rel="stylesheet" href="/assets/stylesheets/project.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>tenkuma&#39;s Library - neoBeta</title>
</head>
<body>
<div id="everythingHelper">
<aside>
<header>
<div id="linksBox">
<div id="headerLinksAndTitle">
<div id="logoTitle">
<img src="/assets/logo.png" id="logo">
<h1 id="title" class="rainbowText">neoBeta</h1>
</div>
<ul id="headerLinks">
<li><a href="/">home</a></li>
<li><a href="/search">search</a></li>
<li><a href="/allprojects">index</a></li>
<li><a href="/contribute">contribute</a></li>
</ul>
</div>
<p id="credits">Adrian Victor, 2025 (<a href="https://git.disroot.org/adrianvictor/neoBeta">Unlicense</a>)</p>
</div>
</header>
</aside>
<div id="project">
<div id="projectHeader">
<img src="logo.png">
<div id="projectTitleSubtitle">
<div id="projectTitleAuthor">
<h1 id="projectTitle">tenkuma&#39;s Library</h1>
<p id="projectAuthor">by <a href="/authors/tenkuma">tenkuma</a></p>
</div>
<p id="projectSubtitle">Library to support my other plugins. Does nothing on it&#39;s own.</p>
</div>
<a id="downloadLink" href="https://modrinth.com/plugin/tenkumalib/versions"><button id="downloadButton">Download</button></a>
</div>
<main id="projectDescription">
<p>This is a dependency for my other projects. This does not do anything on it's own.</p>
<h2>Why do I have to install this alongside your plugins?</h2>
<p>You may think that installing two plugins instead of one is installing unecessary bloat that is useless. But it's not, libraries hold code that is common to more than one project, so you avoid having the same code repeated twice or more in your server. Also it's easier for the developer that has to improve only a single codebase to improve all the rest of the dependants.</p>
</main>
</div>
</div>
</body>
</html>

View file

@ -1,66 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/assets/stylesheets/styles.css" media="screen">
<link rel="stylesheet" href="/assets/stylesheets/project.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TimeKeeper - neoBeta</title>
</head>
<body>
<div id="everythingHelper">
<aside>
<header>
<div id="linksBox">
<div id="headerLinksAndTitle">
<div id="logoTitle">
<img src="/assets/logo.png" id="logo">
<h1 id="title" class="rainbowText">neoBeta</h1>
</div>
<ul id="headerLinks">
<li><a href="/">home</a></li>
<li><a href="/search">search</a></li>
<li><a href="/allprojects">index</a></li>
<li><a href="/contribute">contribute</a></li>
</ul>
</div>
<p id="credits">Adrian Victor, 2025 (<a href="https://git.disroot.org/adrianvictor/neoBeta">Unlicense</a>)</p>
</div>
</header>
</aside>
<div id="project">
<div id="projectHeader">
<img src="logo.png">
<div id="projectTitleSubtitle">
<div id="projectTitleAuthor">
<h1 id="projectTitle">TimeKeeper</h1>
<p id="projectAuthor">by <a href="/authors/tenkuma">tenkuma</a></p>
</div>
<p id="projectSubtitle">Syncs real world time with your Minecraft server time.</p>
</div>
<a id="downloadLink" href="https://modrinth.com/plugin/timekeeper/versions"><button id="downloadButton">Download</button></a>
</div>
<main id="projectDescription">
<p>This is a plugin for Minecraft beta that syncs the real world time with your in-game time. Logo by <a href="https://github.com/malcolmriley/unused-textures/blob/master/items/">malcolmriley</a>.</p>
<h2>How it works</h2>
<p>It will calculate and change the game time every second (that's 20 ticks and can be changed in the config), it will use your computer's timezone as default if the config <code>timezone</code> value does not exist.</p>
<h2>Performance</h2>
<p>I am not sure if this plugin has any significant performance hit, it runs code every few ticks (you can in/decrease the frequency in the config) and that is not the best approach for doing this, but it's the only that works in beta. Using it with <code>ticksBetweenUpdate: 1</code> does not seem to change the performance in any way. The specifications for the computer used for the tests:</p>
<pre><code>Host: 83AF IdeaPad 1 14IAU7
CPU: 12th Gen Intel i5-1235U (12) @ 1.300GHz
GPU: Intel Alder Lake-UP3 GT2 [Iris Xe Graphics]
Memory: 10097MiB / 15709MiB
</code></pre>
</main>
</div>
</div>
</body>
</html>

View file

@ -1,61 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/assets/stylesheets/styles.css" media="screen">
<link rel="stylesheet" href="/assets/stylesheets/search.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>neoBeta</title>
</head>
<body>
<div id="everythingHelper">
<aside>
<header>
<div id="linksBox">
<div id="headerLinksAndTitle">
<div id="logoTitle">
<img src="/assets/logo.png" id="logo">
<h1 id="title" class="rainbowText">neoBeta</h1>
</div>
<ul id="headerLinks">
<li><a href="/">home</a></li>
<li><a href="/search">search</a></li>
<li><a href="/allprojects">index</a></li>
<li><a href="/contribute">contribute</a></li>
</ul>
</div>
<p id="credits">Adrian Victor, 2025 (<a href="https://git.disroot.org/adrianvictor/neoBeta">Unlicense</a>)</p>
</div>
</header>
</aside>
<main>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/elasticlunr/0.9.6/elasticlunr.min.js"></script>
<script src="/assets/search.js" defer></script>
<style>
main {
display: flex;
flex-direction: column;
gap: 1em;
}
</style>
<p>Welcome to neoBeta's search, here you can search through our whole database of plugins, mods and authors. You may want to filter out the results using the dropdown menu below. The search is done on your device using <a href="https://github.com/weixsong/elasticlunr.js">elasticlunr</a>.</p>
<div style="display: flex; gap: .5em;">
<input type="text" id="search" placeholder="Search..." style="flex-grow: 1;"/>
<select name="Search mode" id="searchMode">
<option value="all" selected>All</option>
<option value="plugin">Plugins</option>
<option value="mod">Mods</option>
<option value="author">Authors</option>
</select>
</div>
<div id="searchResults" style="display: flex; gap: 1em; flex-direction: column;"></div>
</main>
</div>
</body>
</html>

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 828 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

View file

@ -1,52 +0,0 @@
fetch('/search_index.json')
.then(r => r.json())
.then(data => {
const idx = elasticlunr.Index.load(data);
const docs = idx.documentStore.docs;
const searchInput = document.getElementById('search');
const out = document.getElementById('searchResults');
const filterSelect = document.getElementById('searchMode');
function runSearch(q, tags = 'all') {
let result = idx.search(q, { expand: true }).map(r => docs[r.ref] )
if (tags === 'all') {
return result;
}
result = result.filter(d => tags === 'all' || d.tags.includes(tags));
return result;
}
function render(doc) {
console.log(doc.imageq)
let tagsHTML = "";
console.log(doc.tags)
doc.tags.forEach(tag => {
tagsHTML += `<div class="tag-${tag}">${tag}</div>`
});
return `<div class="searchItem">
<p>${doc.image ? `<img float=left class="searchItemImage" src="${doc.image}">` : ''} <a class="searchItemTitle" href="${doc.url}">${doc.title}</a>${doc.author ? ` by <a href="/authors/${doc.author}">${doc.author}</a>` : ''}</p>
<p class="searchItemDescription">${doc.subtitle}</p>
<div class="searchItemTagHolder">
${tagsHTML}
</div>
</div>`;
}
function update() {
const q = searchInput.value.trim();
if (!q) {
out.innerHTML = '';
return;
}
const results = runSearch(q, filterSelect.value);
out.innerHTML = results.map(render).join('');
}
searchInput.addEventListener('input', update);
filterSelect.addEventListener('change', update);
});

View file

@ -1,28 +0,0 @@
#homeUpdates {
background-color: var(--accent-secondary);
border: thick solid var(--accent-color);
width: 50%;
margin: 0px 2em 2em 2em;
padding: 1em;
height: fit-content;
border-radius: 4px;
}
#featureAndUpdates {
display: flex;
flex-direction: row;
margin-top: 1em;
}
@media only screen and (max-width: 1280px) {
#featureAndUpdates {
flex-direction: column;
gap: 1em;
flex-flow: column-reverse;
}
#homeUpdates {
width: 100%;
margin: 0;
}
}

View file

@ -1,18 +0,0 @@
.searchItemImage {
height: 1em;
}
.searchItemTagHolder {
display: flex;
padding-top: .2em;
gap: .4em;
}
.searchItemTagHolder div {
border: thin solid greenyellow;
padding: .1em .2em .1em .2em;
}
.searchItemDescription {
margin-bottom: 0px;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 560 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 377 KiB

View file

@ -1,41 +0,0 @@
---
layout: "base.njk"
---
## How can I get my project here?
neoBeta is an open-source content management system. There are various ways you can put your plugin/mod on our catalog:
- Clone [neoBeta's repository](https://github.com/adrianvic/neoBeta), create your project folder inside the /projects directory with the necessary metadata (index.md for project description, index.json for metadata and any other file your project may depend on) and make a pull request. Less manual work on our side, so review should be quickier.
- Open an issue on our GitHub repository with the project information. This may take longer as a contributor will have to spend time creating the project files, but is useful if you're not confortable using Git.
- Host your own instance of neoBeta.
### Required metadata fields
- *name* - project name.
```"name": "Ghosts 'n Stuff"```
- *subtitle* - project's brief description.
```"subtitle": "Miscellaneous additions to your server."```
- *author* - your author name, must be consistent across all your submissions.
```"author": "tenkuma"```
- *tags* - whether your project is a plugin or mod.
```"tags": ["plugin", "mod"]```
### Optional metadata fields
Please fill as many fields as possible.
- *downloadLink* - link for when you click the download link.
```"downloadLink": "https://example.com"```
- *images* - lists of image files names or URLs that will appear in the project page.
```"images": "["image1.png", "image2.png", "image3.png"]"```
- *logo* - your logo file name or URL.
```"logo": "logo.png"```
### Config file example
```
{
"name": "Ghosts 'n Stuff",
"subtitle": "Miscellaneous additions to your server.",
"author": "tenkuma",
"downloadLink": "https://example.com",
"images": "["image1.png", "image2.png", "image3.png"]",
"logo": "logo.png",
"tags": ["plugin", "mod"]
}
```

View file

@ -1,21 +1,65 @@
import elasticlunr from 'elasticlunr';
import fs from 'fs';
import path from 'path';
import fetch from "node-fetch";
import 'dotenv/config';
let allPlugins = [];
const isProd = process.env.ELEVENTY_ENV === "production";
const pathPrefix = isProd ? "/neoBeta/" : "/";
const buildTime = new Date(Date.now()).toISOString();
export default function (eleventyConfig) {
eleventyConfig.addPassthroughCopy("projects/**/*.png");
eleventyConfig.addPassthroughCopy("projects/**/*.jpg");
eleventyConfig.addPassthroughCopy("projects/**/*.jpeg");
eleventyConfig.addPassthroughCopy("authors/**/*.png");
eleventyConfig.addPassthroughCopy("authors/**/*.jpg");
eleventyConfig.addPassthroughCopy("authors/**/*.jpeg");
eleventyConfig.addPassthroughCopy("assets");
eleventyConfig.addPassthroughCopy({ "favicon/*" : "/" });
eleventyConfig.addNunjucksAsyncFilter("githubReleases", async function(owner, repo, callback) {
const token = process.env.GITHUB_ACCESS_TOKEN;
if (!owner || !repo) return callback(null, [ name = "This project is not configured properly." ]);
if (!token || !isProd) return callback(null, [{
name: "This instance cannot fetch releases from GitHub, you can check them manually here.",
html_url: `https://github.com/${owner}/${repo}/releases`
}]);
const url = `https://api.github.com/repos/${owner}/${repo}/releases`;
try {
const res = await fetch(url, {
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/vnd.github+json",
"User-Agent": "eleventy-build"
}
});
if (!res.ok) return callback(null, [ name = "Error fetching releases for GitHub project." ]);
const data = await res.json();
console.log(data)
callback(null, data);
} catch (err) {
console.error(err);
callback(null, []);
}
});
eleventyConfig.addFilter("collectionFind", (collection = [], url = "") => {
return collection.find(item => item.url = url);
});
eleventyConfig.setInputDirectory("src");
eleventyConfig.setOutputDirectory("public");
eleventyConfig.addPassthroughCopy("src/projects/**/*.png");
eleventyConfig.addPassthroughCopy("src/projects/**/*.jpg");
eleventyConfig.addPassthroughCopy("src/projects/**/*.jpeg");
eleventyConfig.addPassthroughCopy("src/authors/**/*.png");
eleventyConfig.addPassthroughCopy("src/authors/**/*.jpg");
eleventyConfig.addPassthroughCopy("src/authors/**/*.jpeg");
eleventyConfig.addPassthroughCopy("src/assets");
eleventyConfig.addPassthroughCopy({ "src/favicon/*" : "/" });
eleventyConfig.addGlobalData("pathPrefix", pathPrefix);
eleventyConfig.addGlobalData("buildTime", buildTime);
eleventyConfig.addGlobalData("isProduction", isProd);
eleventyConfig.addCollection("projects", function(collection) {
return collection.getFilteredByGlob("./projects/**/*.md");
const col = collection.getFilteredByGlob("src/projects/*/*.md");
return col;
});
eleventyConfig.addGlobalData("eleventyComputed", {
@ -31,11 +75,14 @@ export default function (eleventyConfig) {
}
return { name: path.basename(projectDir) };
},
layout: (data) => {
const inputPath = data.page.inputPath;
if (inputPath.match(/\/projects\/[^\/]+\/docs\//)) return "docs.njk";
return data.layout;
},
projectSlug: data => {
const url = data.page?.url || data.page?.filePathStem || "";
return url.replace(/\/$/,'').split('/').filter(Boolean).pop() || null;
}
});
@ -65,6 +112,11 @@ export default function (eleventyConfig) {
allPlugins.forEach(doc => this.addDoc(doc));
});
fs.writeFileSync('./_site/search_index.json', JSON.stringify(idx));
fs.writeFileSync('./public/search_index.json', JSON.stringify(idx));
});
return {
pathPrefix
}
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 721 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

View file

@ -1 +0,0 @@
{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}

89
gen-github-token.cjs Normal file
View file

@ -0,0 +1,89 @@
require('dotenv').config();
const http = require('http');
const { URL } = require('url');
const fetch = require('node-fetch');
const open = (...args) => import('open').then(m => m.default(...args));
const fs = require('fs');
const path = require('path');
const {
GITHUB_CLIENT_ID,
GITHUB_CLIENT_SECRET,
GITHUB_OAUTH_SCOPES = 'repo,user',
} = process.env;
if (!GITHUB_CLIENT_ID || !GITHUB_CLIENT_SECRET) {
console.error('Set GITHUB_CLIENT_ID and GITHUB_CLIENT_SECRET in .env');
process.exit(1);
}
const PORT = 9876;
const REDIRECT_URI = `http://localhost:${PORT}/`;
const STATE = String(Math.random()).slice(2);
function appendEnv(key, value) {
const envPath = path.resolve(process.cwd(), '.env');
const line = `\n${key}=${value}\n`;
fs.appendFileSync(envPath, line, { encoding: 'utf8' });
console.log(`${key} appended to .env`);
}
async function exchangeCodeForToken(code) {
const tokenUrl = 'https://github.com/login/oauth/access_token';
const res = await fetch(tokenUrl, {
method: 'POST',
headers: { Accept: 'application/json', 'Content-Type': 'application/json' },
body: JSON.stringify({
client_id: GITHUB_CLIENT_ID,
client_secret: GITHUB_CLIENT_SECRET,
code,
redirect_uri: REDIRECT_URI,
state: STATE,
}),
});
if (!res.ok) throw new Error(`Token exchange failed: ${res.status}`);
const data = await res.json();
if (data.error) throw new Error(`Token error: ${data.error_description || data.error}`);
return data.access_token;
}
const server = http.createServer(async (req, res) => {
try {
const reqUrl = new URL(req.url, `http://localhost:${PORT}`);
const code = reqUrl.searchParams.get('code');
const state = reqUrl.searchParams.get('state');
if (!code || state !== STATE) {
res.writeHead(400, { 'Content-Type': 'text/plain' });
res.end('Invalid request');
return;
}
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Authorization received. You can close this window.');
console.log('Received code, exchanging for token...');
const token = await exchangeCodeForToken(code);
console.log('Access token received:', token);
// Append token to .env (BE CAREFUL)
appendEnv('GITHUB_ACCESS_TOKEN', token);
} catch (err) {
console.error('Error handling OAuth callback:', err);
} finally {
server.close();
}
});
server.listen(PORT, async () => {
const authUrl =
`https://github.com/login/oauth/authorize` +
`?client_id=${encodeURIComponent(GITHUB_CLIENT_ID)}` +
`&redirect_uri=${encodeURIComponent(REDIRECT_URI)}` +
`&scope=${encodeURIComponent(GITHUB_OAUTH_SCOPES)}` +
`&state=${encodeURIComponent(STATE)}`;
console.log('Opening browser for GitHub authorization...');
await open(authUrl);
console.log(`Listening for OAuth callback at ${REDIRECT_URI}`);
});

2186
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -11,11 +11,12 @@
"build:sass": "sass src/static/scss:public/static/css",
"watch:eleventy": "eleventy --serve",
"build:eleventy": "ELEVENTY_ENV=development eleventy",
"start": "npm run watch:eleventy & npm run watch:sass",
"build": "npm run build:eleventy & npm run build:sass",
"start": "npm run watch:eleventy",
"build": "npm run build:eleventy",
"build:sass:prod": "sass src/static/scss:public/static/css --style compressed",
"build:eleventy:prod": "ELEVENTY_ENV=production eleventy",
"build:prod": "npm run build:eleventy:prod & npm run build:sass:prod"
"build:prod": "npm run build:eleventy:prod",
"serve:prod": "ELEVENTY_ENV=production eleventy --serve"
},
"repository": {
"type": "git",
@ -29,7 +30,10 @@
"homepage": "https://github.com/adrianvic/neoBeta#readme",
"dependencies": {
"@11ty/eleventy": "^3.1.2",
"dotenv": "^17.2.3",
"elasticlunr": "^0.9.5",
"node-fetch": "^2.7.0",
"open": "^10.2.0",
"sass": "1.93.2"
}
}

View file

@ -1,8 +0,0 @@
{
"name": "Aboukkit",
"subtitle": "A simple way to add custom commands with custom responses to your server.",
"author": "tenkuma",
"downloadLink": "https://modrinth.com/plugin/aboukkit/versions",
"logo": "logo.png",
"tags": ["plugin"]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 730 B

14
src/_data/news.json Normal file
View file

@ -0,0 +1,14 @@
{
"entries": [
{
"date": "2025-10-30",
"title": "Releases support",
"text": "Now developers can list their software version and automatically list their GitHub releases in their project page!"
},
{
"date": "2025-10-27",
"title": "Website redesign!",
"text": "Yaaay! neoBeta got a stylish redesign."
}
]
}

View file

@ -4,7 +4,9 @@ styles: ["project"]
---
<div id="project">
<div id="projectHeader">
<img src="{{ page.dir }}{{ logoName }}.{{ logoExtension }}">
{% if logo %}
<img src="{{ logo | url }}">
{% endif %}
<div id="projectTitleSubtitle">
<div id="projectTitleAuthor">
<h1 id="projectTitle">{{ name }}</h1>

10
src/_includes/docs.njk Normal file
View file

@ -0,0 +1,10 @@
---
layout: skeleton.njk
---
<main>
<p>You are seeing the documentation for: <span class="rainbowText">{{ projectData.fileSlug }}</span></p>
<hr>
<div>
{{ content | safe }}
</div>
</main>

View file

@ -6,12 +6,16 @@
{% if item.fileSlug == project %}
{% set projectData = item %}
<div class="featuredProject">
<a href="/projects/{{ project }}">
<img src="{% if projectData.data.logo %}/projects/{{project}}/{{ projectData.data.logo }}{% else %}/assets/mod-placeholder.png{% endif %}">
<a href="{{ ('/projects/' + project) | url }}">
{% if projectData.data.logo %}
<img src="{{ ('/projects/' ~ project ~ '/' ~ projectData.data.logo) | url }}">
{% else %}
<img src="{{ '/assets/mod-placeholder.png' | url }}">
{% endif %}
</a>
<div>
<p class="featuredProjectName">{{ projectData.data.name }}</p>
<p class="featuredProjectSubtitle">by <a href="/authors/{{ projectData.data.author }}/">{{ projectData.data.author }}</a></p>
<p class="featuredProjectSubtitle">by <a href="{{ ('/authors/' + projectData.data.author + '/') | url}}">{{ projectData.data.author }}</a></p>
<div class="featuredProjectSubtitle dimText">{{ projectData.data.subtitle }}</div>
</div>
</div>

17
src/_includes/header.njk Normal file
View file

@ -0,0 +1,17 @@
<header>
<div id="linksBox">
<div id="headerLinksAndTitle">
<div id="logoTitle">
<img src="{{ '/assets/logo.png' | url }}" id="logo">
<h1 id="title" class="rainbowText">neoBeta</h1>
</div>
<ul id="headerLinks">
<li><a href="{{ '/' | url }}">home</a></li>
<li><a href="{{ '/search' | url }}">search</a></li>
<li><a href="{{ '/allprojects' | url}}">index</a></li>
<li><a href="https://github.com/adrianvic/neoBeta?tab=readme-ov-file#contributing">contribute</a></li>
</ul>
</div>
<p id="credits">Adrian Victor, 2025 (<a href="https://git.disroot.org/adrianvictor/neoBeta">Unlicense</a>)</p>
</div>
</header>

5
src/_includes/news.njk Normal file
View file

@ -0,0 +1,5 @@
<h2>Latest updates</h2>
{% for news in news.entries %}
<p>{{ news.date }} {{ news.title }}:</p>
<p style="opacity: .8;">{{ news.text | safe }}</p>
{% endfor %}

View file

@ -5,27 +5,27 @@ styles: ["project"]
<div id="project">
<div id="projectHeader">
{% if logo %}
<img src="{{ page.dir }}{{ logo }}">
<img src="{{ ('/projects/' + projectSlug + '/' + logo) | url }}">
{% endif %}
<div id="projectTitleSubtitle">
<div id="projectTitleAuthor">
<h1 id="projectTitle">{{ name }}</h1>
<p id="projectAuthor">by <a href="/authors/{{ author }}">{{ author }}</a></p>
<p id="projectAuthor">by <a href="{{ ('/authors/' + author) | url }}">{{ author }}</a></p>
</div>
<p id="projectSubtitle">{{ subtitle }}</p>
</div>
<a id="downloadLink" href="{{ downloadLink }}"><button id="downloadButton">{% if downloadLink %}Download{% else %}Unavailable{% endif %}</button></a>
<a id="downloadLink" href="releases"><button id="downloadButton">{% if downloadLink %}Download{% else %}Unavailable{% endif %}</button></a>
</div>
{% if links or docs or images or releases %}
{% if links or docs or images or releaseType %}
<div id="projectImagesAndInfo">
{% include "project_image.njk" %}
<div id="projectInfo">
<h2>Here's what we found:</h2>
<p>Here's what we found about this project:</p>
{% if links %}
<p>{{ links | length }} links.</p>
<ul>
{% for label, addr in links %}
<li><a href="{{ addr }}">{{ label }}</a></li>
<li><a href="{{ addr | url}}">{{ label }}</a></li>
{% endfor %}
</ul>
{% endif %}
@ -33,7 +33,7 @@ styles: ["project"]
<p>{{ docs | length }} documentaion files.</p>
<ul>
{% for label, addr in docs %}
<li><a href="{{ addr }}">{{ label }}</a></li>
<li><a href="{{ addr | url }}">{{ label }}</a></li>
{% endfor %}
</ul>
{% endif %}

View file

@ -0,0 +1,13 @@
{% if images %}
<div id="projectImageCarrousel">
<p>Images</p>
<div id="projectCarrouselImageHolder">
{% for image in images %}
{% set dir = (page.filePathStem | default(page.url) ) | replace('/index','') %}
<a href="{{ (dir ~ '/' ~ image) | url }}">
<img class="projectImage" src="{{ (dir ~ '/' ~ image) | url }}">
</a>
{% endfor %}
</div>
</div>
{% endif %}

View file

@ -2,14 +2,17 @@
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/assets/stylesheets/styles.css" media="screen">
<link rel="stylesheet" href="{{ '/assets/stylesheets/styles.css' | url }}" media="screen">
{% for stylesheet in styles %}
<link rel="stylesheet" href="/assets/stylesheets/{{ stylesheet }}.css">
<link rel="stylesheet" href="{{ ('/assets/stylesheets/' + stylesheet + '.css') | url }}">
{% endfor %}
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% if name %}{{ name }} - {% endif %}neoBeta</title>
</head>
<body>
<script>
window.ELEVENTY_PATH_PREFIX = "{{ pathPrefix | safe }}";
</script>
<div id="everythingHelper">
<aside>
{% include "header.njk" %}

71
src/_virtual/releases.njk Normal file
View file

@ -0,0 +1,71 @@
---
pagination:
data: collections.projects
size: 1
alias: project
permalink: "{{ project.url }}releases.html"
layout: base.njk
---
<h1>Releases for {{ project.data.name }}</h1>
{% if project.data.dependencies %}
<p>This project depends on:
{% for dep in project.data.dependencies %}
{% set depl = collections.projects | collectionFind("/projects/" + dep + "/") %}
<a href="{% if depl %}{{ depl.url | url }}{% else %}{% endif %}">{{ dep }}.</a>
{% endfor %}
</p>
{% endif %}
{% if project.data.releaseType %}
{% if project.data.releaseType == "github" and not isProduction %}
<p>Sorry, but this instance of neoBeta cannot fetch GitHub releases, please follow <a href="https://github.com/{{ project.data.githubRepoOwner }}/{{ project.data.githubRepoName }}/">this link</a> to see them.</p>
<p class="errorQuote"><i>"Take us down, and we keep trying<br>Forty thousand feet, keep flying"</i></p>
{% else %}
{% if project.data.releaseType == "github" %}
{% set releases = project.data.githubRepoOwner | githubReleases(project.data.githubRepoName) %}
<p>Fetched from GitHub at {{ buildTime }}.</p>
{% else %}
{% set releases = project.data.releases %}
{% endif %}
<p class="rainbowText">{{ releases | length }} releases.</p>
<div style="display: flex; flex-direction: column; gap: 1em;">
{% for release in releases %}
<div>
<h2>{{ release.name }}</h2>
{% if project.data.releaseType == "github" %}
<p>{{ release.tag_name }} for {{ project.data.gameLoaders or "unknown loader" }} {{ project.data.gameVersions or "unknow version" }}</p>
{% else %}
<p>Version {{ release.version }} for {{ project.data.gameLoaders or "unknown loader" }} {{ project.data.gameVersions or "unknow version" }}</p>
{% endif %}
<div style="padding: .6em; background-color: var(--accent-background); border-radius: 4px;">
{% if project.data.releaseType == "github" %}
<div class="oneLineClamp">
<p><a href="{{release.html_url}}">Download on GitHub.</a><p>
</div>
<div class="oneLineClamp">
<p><a href="{{ release.tarball_url }}">Source code tarball <span class="dimText">{{ release.tarball_url }}</span></a></p>
</div>
<div class="oneLineClamp">
<p><a href="{{ release.zipball_url }}">Source code zipball <span class="dimText">{{ release.zipball_url }}</span></a></p>
</div>
{% else %}
{% if release.downloads %}
<div style="padding: .6em; background-color: var(--accent-background); border-radius: 4px;">
{% for label, addr in release.downloads %}
<div class="oneLineClamp">
<p><a href="{{ addr | url }}">{{ label }} <span class="dimText">{{ addr | url }}</span></a></p>
</div>
{% endfor %}
</div>
{% endif %}
{% endif %}
</div>
</div>
{% endfor %}
</div>
{% endif %}
{% else %}
<p>Could not find any release for this project...</p>
{% endif %}

View file

@ -6,16 +6,18 @@ pagination:
alias: paginatedProjects
styles: ["search"]
---
<h1>Projects Index - page {{ pagination.pageNumber + 1 }}</h1>
<ul style="display: flex; flex-direction: column; gap: 1em;">
{% for project in paginatedProjects %}
<div class="searchItem">
<p>
{% if project.data.logo %}
<img float="left" class="searchItemImage" src="{{ project.url }}{{ project.data.logo }}">
<img float="left" class="searchItemImage" src="{{ (project.url + project.data.logo) | url }}">
{% endif %}
<a class="searchItemTitle" href="{{ project.url }}">{{ project.data.name }}</a>
<a class="searchItemTitle" href="{{ project.url | url }}">{{ project.data.name }}</a>
{% if project.data.author %}
by <a href="/authors/{{ project.data.author }}">{{ project.data.author }}</a>
by <a href="{{ ('/authors/' + project.data.author) | url }}">{{ project.data.author }}</a>
{% endif %}
</p>
<p class="searchItemDescription">{{ project.data.subtitle }}</p>
@ -30,9 +32,9 @@ styles: ["search"]
<nav>
{% if pagination.href.previous %}
<a href="{{ pagination.href.previous }}">Prev</a>
<a href="{{ pagination.href.previous | url }}">Prev</a>
{% endif %}
{% if pagination.href.next %}
<a href="{{ pagination.href.next }}">Next</a>
<a href="{{ pagination.href.next | url }}">Next</a>
{% endif %}
</nav>

View file

Before

Width:  |  Height:  |  Size: 828 B

After

Width:  |  Height:  |  Size: 828 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Before After
Before After

View file

@ -1,4 +1,9 @@
fetch('/search_index.json')
function url(path) {
const prefix = (window.ELEVENTY_PATH_PREFIX || '').replace(/\/$/,'');
return (prefix ? prefix + '/' : '/') + path.replace(/^\/+/,'');
}
fetch(url("search_index.json"))
.then(r => r.json())
.then(data => {
const idx = elasticlunr.Index.load(data);
@ -28,7 +33,7 @@ fetch('/search_index.json')
});
return `<div class="searchItem">
<p>${doc.image ? `<img float=left class="searchItemImage" src="${doc.image}">` : ''} <a class="searchItemTitle" href="${doc.url}">${doc.title}</a>${doc.author ? ` by <a href="/authors/${doc.author}">${doc.author}</a>` : ''}</p>
<p>${doc.image ? `<img float=left class="searchItemImage" src="${url(doc.image)}">` : ''} <a class="searchItemTitle" href="${url(doc.url)}">${doc.title}</a>${doc.author ? ` by <a href="${ url('/authors/' + doc.author) }">${doc.author}</a>` : ''}</p>
<p class="searchItemDescription">${doc.subtitle}</p>
<div class="searchItemTagHolder">
${tagsHTML}

View file

@ -100,6 +100,14 @@
overflow-y: auto;
}
.projectInfoGitHubReleases.less {
overflow: hidden;
display: -webkit-box;
line-clamp: 2;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical
}
@media only screen and (max-width: 1280px) {
#projectImagesAndInfo {
flex-direction: column;

View file

@ -15,7 +15,7 @@
@font-face {
font-family: Minecraft;
src: url("/assets/MinecraftRegular-Bmg3.otf") format("opentype");
src: url("../MinecraftRegular-Bmg3.otf") format("opentype");
}
body {
@ -50,8 +50,8 @@ main {
}
/* main:last-child {
margin-bottom: 0px;
padding-bottom: 0px;
margin-bottom: 0px;
padding-bottom: 0px;
} */
button {
@ -70,6 +70,9 @@ code {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
border-radius: 2px;
display: inline-block;
max-width: 100%;
overflow-x: auto;
font-size: .8em;
}
input, select {
@ -91,6 +94,10 @@ hr {
margin-bottom: 1em;
}
h1, h2, h3, h4, h5, h6 {
text-shadow: 2px 6px 5px rgba(0,0,0,0.2), 0px -4px 10px rgba(0,0,0,0.3);
}
#linksBox {
padding: 2em;
display: flex;
@ -174,11 +181,22 @@ hr {
}
.featuredProjectSubtitle {
overflow: hidden;
width: 100%;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical
overflow: hidden;
width: 100%;
display: -webkit-box;
line-clamp: 2;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical
}
.oneLineClamp {
overflow: hidden;
width: 100%;
display: -webkit-box;
height: 1em;
line-clamp: 1;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical
}
.featuredProjectSubtitle {
@ -232,13 +250,14 @@ h1, h2, h3 {
color: transparent;
animation: rainbow_animation 6s ease-in-out infinite;
background-size: 400% 100%;
text-shadow: none;
}
@keyframes rainbow_animation {
0%,100% {
background-position: 0 0;
}
50% {
background-position: 100% 0;
}
@ -248,25 +267,25 @@ h1, h2, h3 {
#everythingHelper {
flex-direction: column;
}
aside {
width: 100%;
}
#projectTitle {
font-size: larger;
}
#headerLinksAndTitle {
flex-direction: row;
}
#headerLinks {
margin-left: 2em;
}
}
@media only screen and (max-width: 300px) {
}

View file

@ -1,9 +1,7 @@
---
name: "tenkuma"
subtitle: "A bear doing things on the internet."
downloadLink: "https://modrinth.com/plugin/tenkumalib/versions"
logoName: "logo"
logoExtension: "png"
logo: "logo.png"
images: ["tenkuma-silverfish.jpg", "tenkuma-mrnando-enderdragon.jpg"]
---

View file

Before

Width:  |  Height:  |  Size: 534 B

After

Width:  |  Height:  |  Size: 534 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 560 KiB

After

Width:  |  Height:  |  Size: 560 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 377 KiB

After

Width:  |  Height:  |  Size: 377 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 96 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 721 B

After

Width:  |  Height:  |  Size: 721 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Before After
Before After

View file

@ -11,10 +11,9 @@ styles: ["home"]
<div id="featureAndUpdates">
<div>
<h2>Featured projects</h2>
{{ featured.projectShowcase(["ghostsandstuff", "aboukkit", "tenkumalib", "hangglidere", "devilwithin", "timekeeper", "tefreezer"], collections.projects) }}
{{ featured.projectShowcase(["ghostsandstuff", "devilwithin", "timekeeper", "tefreezer"], collections.projects) }}
</div>
<div id="homeUpdates">
<h2>Latest updates</h2>
<p>2025-10-27: Website redesign!<br>Yaaay! neoBeta got a stylish redesign.</p>
{% include "news.njk" %}
</div>
</div>

View file

@ -0,0 +1,39 @@
{
"name": "Aboukkit",
"subtitle": "A simple way to add custom commands with custom responses to your server.",
"author": "tenkuma",
"links": {
"Modrinth": "https://modrinth.com/plugin/aboukkit/versions",
"GitHub": "https://github.com/adrianvic/aboukkit",
"Disroot Git": "https://git.disroot.org/adrianvictor/aboukkit"
},
"logo": "logo.png",
"tags": ["plugin"],
"releaseType": "local",
"dependencies": ["tenkumalib"],
"gameVersions": "b1.7.3",
"gameLoaders": "Bukkit",
"releases": [
{
"name": "Library update",
"version": "2.1",
"downloads": {
"Modrinth": "https://modrinth.com/plugin/aboukkit/version/2.1"
}
},
{
"name": "Color update",
"version": "2.0",
"downloads": {
"Modrinth": "https://modrinth.com/plugin/aboukkit/version/2.0"
}
},
{
"name": "Vanilla",
"version": "1.0",
"downloads": {
"Modrinth": "https://modrinth.com/plugin/aboukkit/version/1.0"
}
}
]
}

View file

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Before After
Before After

View file

@ -11,6 +11,11 @@
"Disroot Git": "https://git.disroot.org/adrianvictor/ghostsandstuff"
},
"docs": {
"Installation" : "docs/example_documentation"
}
"Installation" : "docs/installation"
},
"releaseType": "github",
"githubRepoOwner": "adrianvic",
"githubRepoName": "ghostsandstuff",
"gameVersions": ["b1.7.3"],
"gameLoaders": ["Bukkit"]
}

Some files were not shown because too many files have changed in this diff Show more