mirror of
https://github.com/nestriness/nestri.git
synced 2025-12-11 00:05:36 +02:00
Documentation for Nestri (#116)
I have made documentation for Nestri, so everybody easy can find instructions to get started. It will also make it easier for people to help contribute to the documentation. The documentation is built with Nuxt3, [Docus ](https://github.com/nuxt-themes) which uses Nuxt Content.  
This commit is contained in:
committed by
GitHub
parent
bae089e223
commit
390ee2ac0f
14
apps/docs/.eslintrc.cjs
Normal file
14
apps/docs/.eslintrc.cjs
Normal file
@@ -0,0 +1,14 @@
|
||||
module.exports = {
|
||||
root: true,
|
||||
extends: ['@nuxt/eslint-config'],
|
||||
ignorePatterns: [
|
||||
'dist',
|
||||
'node_modules',
|
||||
'.output',
|
||||
'.nuxt'
|
||||
],
|
||||
rules: {
|
||||
'vue/max-attributes-per-line': 'off',
|
||||
'vue/multi-word-component-names': 'off'
|
||||
}
|
||||
}
|
||||
12
apps/docs/.gitignore
vendored
Normal file
12
apps/docs/.gitignore
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
node_modules
|
||||
*.iml
|
||||
.idea
|
||||
*.log*
|
||||
.nuxt
|
||||
.vscode
|
||||
.DS_Store
|
||||
coverage
|
||||
dist
|
||||
sw.*
|
||||
.env
|
||||
.output
|
||||
2
apps/docs/.npmrc
Normal file
2
apps/docs/.npmrc
Normal file
@@ -0,0 +1,2 @@
|
||||
shamefully-hoist=true
|
||||
strict-peer-dependencies=false
|
||||
47
apps/docs/README.md
Normal file
47
apps/docs/README.md
Normal file
@@ -0,0 +1,47 @@
|
||||
# Docus
|
||||
|
||||
## Setup
|
||||
|
||||
Install dependencies:
|
||||
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
## Development
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
## Edge Side Rendering
|
||||
|
||||
Can be deployed to Vercel Functions, Netlify Functions, AWS, and most Node-compatible environments.
|
||||
|
||||
Look at all the available presets [here](https://v3.nuxtjs.org/guide/deploy/presets).
|
||||
|
||||
```bash
|
||||
npm build
|
||||
```
|
||||
|
||||
## Static Generation
|
||||
|
||||
Use the `generate` command to build your application.
|
||||
|
||||
The HTML files will be generated in the .output/public directory and ready to be deployed to any static compatible hosting.
|
||||
|
||||
```bash
|
||||
npm run generate
|
||||
```
|
||||
|
||||
## Preview build
|
||||
|
||||
You might want to preview the result of your build locally, to do so, run the following command:
|
||||
|
||||
```bash
|
||||
yarn preview
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
For a detailed explanation of how things work, check out [Docus](https://docus.dev).
|
||||
44
apps/docs/app.config.ts
Normal file
44
apps/docs/app.config.ts
Normal file
@@ -0,0 +1,44 @@
|
||||
// https://github.com/nuxt-themes/docus/blob/main/nuxt.schema.ts
|
||||
export default defineAppConfig({
|
||||
docus: {
|
||||
title: 'Nestri',
|
||||
description: 'An open-source, self-hosted Geforce Now alternative',
|
||||
image: 'https://feat-relay-hetzner.nestri.pages.dev/logo.webp',
|
||||
socials: {
|
||||
twitter: 'nestriness',
|
||||
github: 'nestriness/nestri',
|
||||
reddit: '/r/nestri',
|
||||
website: {
|
||||
label: 'Website',
|
||||
icon: 'lucide:house',
|
||||
href: 'https://nestri.io'
|
||||
}
|
||||
},
|
||||
github: {
|
||||
dir: 'apps/docs/content',
|
||||
branch: 'main',
|
||||
repo: 'nestri',
|
||||
owner: 'nestriness',
|
||||
edit: true
|
||||
},
|
||||
aside: {
|
||||
level: 0,
|
||||
collapsed: false,
|
||||
exclude: []
|
||||
},
|
||||
main: {
|
||||
padded: true,
|
||||
fluid: true
|
||||
},
|
||||
logo: "/nestri-logo.svg",
|
||||
header: {
|
||||
logo: true,
|
||||
showLinkIcon: true,
|
||||
exclude: [],
|
||||
fluid: true
|
||||
},
|
||||
footer: {
|
||||
credits: false,
|
||||
}
|
||||
}
|
||||
})
|
||||
62
apps/docs/components/AppSocialIcons.vue
Normal file
62
apps/docs/components/AppSocialIcons.vue
Normal file
@@ -0,0 +1,62 @@
|
||||
<script setup lang="ts">
|
||||
const socials = ['twitter', 'facebook', 'instagram', 'tiktok', 'youtube', 'github', 'medium', 'reddit', 'discord']
|
||||
|
||||
const { config } = useDocus()
|
||||
|
||||
const icons = computed<any>(() => {
|
||||
return Object.entries(config.value.socials || {})
|
||||
.map(([key, value]) => {
|
||||
if (typeof value === 'object') {
|
||||
return value
|
||||
} else if (typeof value === 'string' && value && socials.includes(key)) {
|
||||
return {
|
||||
href: /^https?:\/\//.test(value) ? value : `https://${key}.com/${value}`,
|
||||
icon: `fa-brands:${key}`,
|
||||
label: value,
|
||||
rel: 'noopener noreferrer'
|
||||
}
|
||||
} else {
|
||||
return null
|
||||
}
|
||||
})
|
||||
.filter(Boolean)
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<NuxtLink
|
||||
v-for="icon in icons"
|
||||
:key="icon.label"
|
||||
:rel="icon.rel"
|
||||
:title="icon.label"
|
||||
:aria-label="icon.label"
|
||||
:href="icon.href"
|
||||
target="_blank"
|
||||
>
|
||||
<Icon
|
||||
v-if="icon.icon"
|
||||
:name="icon.icon"
|
||||
/>
|
||||
</NuxtLink>
|
||||
</template>
|
||||
|
||||
<style lang="ts" scoped>
|
||||
css({
|
||||
a: {
|
||||
display: 'flex',
|
||||
color: '{color.gray.500}',
|
||||
padding: '{space.4}',
|
||||
|
||||
'@dark': {
|
||||
color: '{color.gray.400}'
|
||||
},
|
||||
|
||||
'&:hover': {
|
||||
color: '{color.gray.700}',
|
||||
'@dark': {
|
||||
color: '{color.gray.200}',
|
||||
}
|
||||
},
|
||||
}
|
||||
})
|
||||
</style>
|
||||
3
apps/docs/components/Logo.vue
Normal file
3
apps/docs/components/Logo.vue
Normal file
@@ -0,0 +1,3 @@
|
||||
<template>
|
||||
<img width="120" src="/img/nestri-logo-sm.svg"/>
|
||||
</template>
|
||||
48
apps/docs/content/0.index.md
Normal file
48
apps/docs/content/0.index.md
Normal file
@@ -0,0 +1,48 @@
|
||||
---
|
||||
title: Home
|
||||
navigation: false
|
||||
layout: page
|
||||
main:
|
||||
fluid: false
|
||||
---
|
||||
|
||||
:ellipsis{right=0px width=75% blur=150px}
|
||||
|
||||
::block-hero
|
||||
---
|
||||
cta:
|
||||
- Get started
|
||||
- /introduction/what-is-nestri
|
||||
|
||||
secondary:
|
||||
- Open on GitHub →
|
||||
- https://github.com/nestriness/nestri
|
||||
---
|
||||
|
||||
#title
|
||||
An open-source, self-hosted Geforce Now alternative.
|
||||
|
||||
#description
|
||||
Play your favorite games on the go or with your friends on your own game cloud.
|
||||
|
||||
#extra
|
||||
::list
|
||||
- **Selfhosted** cloud gaming
|
||||
- **Open Source** and **Free**
|
||||
- 1.5k ⭐️ on GitHub
|
||||
|
||||
|
||||
::
|
||||
|
||||
<!--#support
|
||||
::terminal
|
||||
---
|
||||
content:
|
||||
- npx nuxi@latest init -t themes/docus
|
||||
- cd docs
|
||||
- npm install
|
||||
- npm run dev
|
||||
---
|
||||
::-->
|
||||
::
|
||||
|
||||
19
apps/docs/content/1.introduction/1.what-is-nestri.md
Normal file
19
apps/docs/content/1.introduction/1.what-is-nestri.md
Normal file
@@ -0,0 +1,19 @@
|
||||
# What is Nestri?
|
||||
|
||||
Nestri is a self-hosted cloud-gaming solution that allows you to stream and play your own games remotely from any device with a browser. Similar to services like NVIDIA GeForce Now, Nestri lets you enjoy high-performance gaming without being physically tied to your gaming PC. The key difference is that Nestri is entirely self-hosted, meaning you have complete control over the server, the games you install, and the overall setup.
|
||||
|
||||
Nestri is designed for gamers who value privacy, flexibility, and control, making it the ideal choice for those who prefer to manage their own infrastructure rather than rely on third-party services. You can play your games from virtually anywhere, as long as you have access to a web browser and a stable internet connection.
|
||||
## Nestri Modules
|
||||
|
||||
To provide a smooth and efficient gaming experience, Nestri is composed of the following key components:
|
||||
|
||||
### Nestri Node
|
||||
The Nestri Node is the core of your Nestri setup. It acts as the game server where you install and run your games. The Nestri Node streams gameplay from the machine it’s installed on, allowing you to access your games remotely. It runs on most Linux-based systems and requires an NVIDIA graphics card to ensure a high-quality gaming experience.
|
||||
|
||||
Since Nestri Node cannot run alongside Xorg (the graphical interface), it’s recommended to install it on a dedicated machine. This way, your server can focus solely on streaming your games while avoiding conflicts with your local display setup.
|
||||
|
||||
### Nestri Relay
|
||||
The Nestri Relay is responsible for transporting the video stream from your Nestri Node to the device you're gaming on. By default, Nestri connects to the Nestri-hosted Relay, which requires no configuration and is available for all users. This simplifies the setup process, ensuring a smooth streaming experience without the need for advanced networking or SSL certificate management.
|
||||
|
||||
For advanced users, it's possible to self-host the relay, but this requires the setup of secure SSL certificates. This option is typically more complex and is recommended only for developers or those familiar with network configuration.
|
||||
|
||||
2
apps/docs/content/1.introduction/_dir.yml
Normal file
2
apps/docs/content/1.introduction/_dir.yml
Normal file
@@ -0,0 +1,2 @@
|
||||
icon: ph:star-duotone
|
||||
navigation.redirect: /introduction/what-is-nestri
|
||||
9
apps/docs/content/2.nestri-node/1.what-is-nestri-node.md
Normal file
9
apps/docs/content/2.nestri-node/1.what-is-nestri-node.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# What is Nestri Node?
|
||||
|
||||
Nestri Node is the core component of Nestri's self-hosted cloud-gaming solution, designed for users who want the freedom and flexibility of running their own game-streaming server. Similar to services like NVIDIA GeForce Now, Nestri allows you to play your games remotely via your browser. However, unlike other cloud-gaming platforms, Nestri is fully self-hosted, giving you complete control over your server and gaming experience.
|
||||
|
||||
The Nestri Node is the actual server where you install your games. Once set up, you can stream and play your games remotely from any compatible device. It runs on machines with Linux and requires an NVIDIA, AMD or an Intel graphics card .
|
||||
## ⚠️ Important Note
|
||||
|
||||
We recommend not installing Nestri Node on your primary PC if you only intend to use it over a weekend. This is because Nestri Node cannot run simultaneously with Xorg, the display server responsible for managing the graphical user interface (GUI). This means that while Nestri Node is running, you will not be able to use an attached screen. For this reason, Nestri Node is best set up on a dedicated machine that won’t be used for other tasks.
|
||||
|
||||
51
apps/docs/content/2.nestri-node/2.prerequisite.md
Normal file
51
apps/docs/content/2.nestri-node/2.prerequisite.md
Normal file
@@ -0,0 +1,51 @@
|
||||
# Prerequisite
|
||||
|
||||
In order to run Nestri on your own server, there are a few things you need to prepare before you can start installing nestri-node. On this page we go through the requirements needed to get started with Nestri.
|
||||
|
||||
Although it may be very tempting to skip this step, you shouldn't! You will save yourself a lot of headaches and wasted hours because something doesn't work due to lack of setup beforehand.
|
||||
|
||||
## Hardware Requirements
|
||||
|
||||
::list{type="primary"}
|
||||
- **NVIDIA GPU**
|
||||
- **8GB Memory**
|
||||
- **Linux** (We Recommend Ubuntu Desktop 22.04)
|
||||
::
|
||||
|
||||
## Software Requirements
|
||||
|
||||
::list{type="primary"}
|
||||
- **Nvidia Drivers**
|
||||
- **[NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installing-with-apt)**
|
||||
- **[Docker](https://linuxiac.com/how-to-install-docker-on-ubuntu-24-04-lts/)**
|
||||
|
||||
::
|
||||
|
||||
## Disconnect monitor
|
||||
Since Nestri requires access to your GPU, then you need to unplug you screen from it.
|
||||
If you want to see the Desktop and have a integrated graphicscard in your CPU, then you can connect your monitor to the motherboard.
|
||||
### Change the Default Boot Target to Multi-User (Non-GUI Mode)
|
||||
Ubuntu typically starts in graphical mode (using the graphical.target systemd target). You should change to the non-graphical multi-user.target, which will prevent Xorg from starting.
|
||||
|
||||
1. Open a terminal or access your system via SSH.
|
||||
2. To check your current default target (which should be graphical.target)
|
||||
|
||||
```bash
|
||||
systemctl get-default
|
||||
|
||||
```
|
||||
|
||||
3. Change the default target to multi-user.target (which corresponds to text mode, without Xorg):
|
||||
```bash
|
||||
sudo systemctl set-default multi-user.target
|
||||
|
||||
|
||||
```
|
||||
|
||||
4. Reboot the system
|
||||
|
||||
5. Verify that Xorg is not running
|
||||
```bash
|
||||
nvidia-smi
|
||||
```
|
||||
|
||||
30
apps/docs/content/2.nestri-node/3.getting-started.md
Normal file
30
apps/docs/content/2.nestri-node/3.getting-started.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# Getting Started
|
||||
|
||||
::alert{type="danger"}
|
||||
Nestri is in a **very early-beta phase**, so errors and bugs may occur.
|
||||
::
|
||||
<!--
|
||||
Nestri Node is easy to install using the provided installation script. Follow the steps below to get started.
|
||||
|
||||
## Installation
|
||||
|
||||
1. Download the installation script using `wget`:
|
||||
|
||||
```bash
|
||||
wget https://github.com/nestriness/nestri/nestri-node-install.sh
|
||||
|
||||
```
|
||||
|
||||
2. Make the script executable:
|
||||
```bash
|
||||
chmod +x nestri-node-install.sh
|
||||
|
||||
|
||||
```
|
||||
3. Run the script to start the installation process:
|
||||
```bash
|
||||
./nestri-node-install.sh
|
||||
```
|
||||
::-->
|
||||
|
||||
|
||||
2
apps/docs/content/2.nestri-node/4.troubleshooting.md
Normal file
2
apps/docs/content/2.nestri-node/4.troubleshooting.md
Normal file
@@ -0,0 +1,2 @@
|
||||
# Troubleshooting
|
||||
|
||||
2
apps/docs/content/2.nestri-node/_dir.yml
Normal file
2
apps/docs/content/2.nestri-node/_dir.yml
Normal file
@@ -0,0 +1,2 @@
|
||||
title: 'Nestri Node'
|
||||
icon: heroicons-outline:bookmark-alt
|
||||
@@ -0,0 +1,9 @@
|
||||
# What is Nestri Relay?
|
||||
|
||||
Nestri Relay is an essential component in the Nestri cloud-gaming ecosystem, responsible for transporting the video gameplay stream from your Nestri Node to the device you’re playing on. It is built on the moq-rs protocol, designed for efficient and smooth video transmission, ensuring a low-latency gaming experience.
|
||||
|
||||
By default, your Nestri Node will connect to the Nestri-hosted Relay, which we manage and is available for all users. This is the simplest and most straightforward option, requiring no additional configuration on your end.
|
||||
## ⚠️ Important Note
|
||||
|
||||
We recommend not installing Nestri Node on your primary PC if you only intend to use it over a weekend. This is because Nestri Node cannot run simultaneously with Xorg, the display server responsible for managing the graphical user interface (GUI). This means that while Nestri Node is running, you will not be able to use an attached screen. For this reason, Nestri Node is best set up on a dedicated machine that won’t be used for other tasks.
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
## Self-hosted Nestri Relay
|
||||
|
||||
For those who prefer full control over their infrastructure, it is possible to self-host the Nestri Relay. However, setting this up can be a bit complex, as it requires generating SSL certificates for secure communication between your Nestri Node and your gaming devices. There are three main options:
|
||||
|
||||
- **Let's Encrypt Certificate**: This is the **recommended option** for self-hosting and requires a domain name. You can generate a certificate using tools like **certbot** or **acme.sh**. Let's Encrypt provides free SSL certificates that are trusted by most browsers and are relatively straightforward to set up.
|
||||
|
||||
- **Purchased SSL Certificate**: The **easiest option** for most users is to buy an SSL certificate from a trusted Certificate Authority (CA). This option eliminates much of the hassle involved with certificate generation, as these certificates are already trusted by browsers and don’t require as much manual setup.
|
||||
|
||||
While self-hosting offers more flexibility, most users will find the **Nestri-hosted Relay** to be the easiest and most reliable option for getting started with cloud gaming on Nestri. This hosted relay is available to everyone and requires no configuration.
|
||||
|
||||
---
|
||||
|
||||
## Prerequisites
|
||||
|
||||
1. **Server Requirements:**
|
||||
- Ensure **port 443** is open for both **TCP and UDP** (`:443/udp & :443/tcp`).
|
||||
- The server should have at least **4GB RAM** and **2 vCPUs**.
|
||||
- Supports both ARM or AMD64 architecture.
|
||||
|
||||
2. **Software Requirements:**
|
||||
- Docker and `docker-compose` must be installed on the server. You can use [this installation script](https://github.com/docker/docker-install) to set up Docker.
|
||||
- Git must be installed to clone the necessary repository.
|
||||
|
||||
3. **Certificates:**
|
||||
- You will need both private and public SSL certificates. It is recommended to use certificates from a **trusted Certificate Authority** (CA), either by using **Let's Encrypt** or purchasing a commercial SSL certificate, for secure communication. Avoid using self-signed certificates, as they can lead to compatibility issues and security warnings in browsers.
|
||||
69
apps/docs/content/3.nestri-relay/3.deploy-moq.md
Normal file
69
apps/docs/content/3.nestri-relay/3.deploy-moq.md
Normal file
@@ -0,0 +1,69 @@
|
||||
## Installation Steps
|
||||
|
||||
### Step 1: Clone the Repository
|
||||
|
||||
Clone the `kixelated/moq-rs` repository to your local machine:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/kixelated/moq-rs moq
|
||||
```
|
||||
|
||||
### Step 2: Verify Port Availability
|
||||
|
||||
Check if port 443 is already in use on your server:
|
||||
|
||||
```bash
|
||||
sudo netstat -tulpn | grep ':443' | grep LISTEN
|
||||
```
|
||||
or
|
||||
```bash
|
||||
sudo lsof -i -P -n | grep LISTEN | grep 443
|
||||
```
|
||||
|
||||
If you find any processes using port 443, consider terminating them.
|
||||
|
||||
### Step 3: Configure Ports
|
||||
|
||||
Navigate to the cloned directory and edit the Docker compose file to use port 443:
|
||||
|
||||
```bash
|
||||
cd moq
|
||||
vim docker-compose.yml
|
||||
```
|
||||
|
||||
Change the ports section from lines 34 to 35 to:
|
||||
|
||||
```yaml
|
||||
ports:
|
||||
- "443:443"
|
||||
- "443:443/udp"
|
||||
```
|
||||
|
||||
### Step 4: Prepare Certificates
|
||||
|
||||
Copy your generated certificates into the `moq/dev` directory and rename them:
|
||||
|
||||
```bash
|
||||
cp cert.pem moq/dev/localhost.crt
|
||||
cp key.pem moq/dev/localhost.key
|
||||
```
|
||||
|
||||
### Step 5: Start Docker Instances
|
||||
|
||||
Ensure you are in the root directory of the `moq` project, then start the Docker containers:
|
||||
|
||||
```bash
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
### Step 6: Link Domain to Server IP
|
||||
|
||||
Configure your DNS settings to connect your server's IP address to your domain:
|
||||
|
||||
```
|
||||
Record Type: A
|
||||
Subdomain: relay.fst.so
|
||||
IP Address: xx.xxx.xx.xxx
|
||||
```
|
||||
|
||||
Congratulations, your MoQ server is now set up! You can verify its functionality by using the [MoQ Checker](https://nestri.pages.dev/moq/checker).
|
||||
42
apps/docs/content/3.nestri-relay/4.advanced-users.md
Normal file
42
apps/docs/content/3.nestri-relay/4.advanced-users.md
Normal file
@@ -0,0 +1,42 @@
|
||||
# ⚠️ Advanced users
|
||||
|
||||
## Generating an SSL Certificate for Nestri Relay
|
||||
|
||||
This guide is for developers and advanced users who wish to self-host Nestri Relay. We strongly discourage this setup for general users due to its complexity, particularly when it comes to configuring SSL certificates correctly. Using a self-signed certificate or manually generating certificates can lead to issues with browser compatibility and security warnings, making it difficult to ensure a smooth experience.
|
||||
|
||||
For most users, we highly recommend using the **Nestri-hosted Relay**, which requires no manual setup and is ready to use out of the box.
|
||||
|
||||
---
|
||||
|
||||
## Generating an SSL Certificate Using Terraform
|
||||
|
||||
If you still wish to proceed with self-hosting, we recommend using Terraform to generate a valid SSL certificate. This method provides a secure, automated way to obtain the necessary certificates for Nestri Relay.
|
||||
|
||||
### Usage
|
||||
|
||||
1. **Update the `terraform.tfvars`** file with your domain and email.
|
||||
2. Run the following command to initialize the Terraform working directory:
|
||||
|
||||
```bash
|
||||
terraform init
|
||||
```
|
||||
```bash
|
||||
terraform plan
|
||||
```
|
||||
```bash
|
||||
terraform apply
|
||||
```
|
||||
The configuration provides two sensitive outputs:
|
||||
```bash
|
||||
certificate_pem: The full certificate chain
|
||||
private_key_pem: The private key for the certificate
|
||||
```
|
||||
|
||||
These can be then be used in your `moq-relay` as it requires SSL/TLS certificates.
|
||||
|
||||
## Note
|
||||
The generated certificate and key files are saved locally and ignored by git:
|
||||
```git
|
||||
.terraform
|
||||
relay_*
|
||||
```
|
||||
4
apps/docs/content/3.nestri-relay/5.moq-tester.md
Normal file
4
apps/docs/content/3.nestri-relay/5.moq-tester.md
Normal file
@@ -0,0 +1,4 @@
|
||||
## MOQ Tester
|
||||
Test your Nestri Relay, with our MOQ tester tool.
|
||||
|
||||
:button-link[Try MOQ Test Tool]{size="small" icon="IconStackBlitz" href="https://nestri.pages.dev/moq/checker" blank}
|
||||
2
apps/docs/content/3.nestri-relay/_dir.yml
Normal file
2
apps/docs/content/3.nestri-relay/_dir.yml
Normal file
@@ -0,0 +1,2 @@
|
||||
title: 'Nestri Relay'
|
||||
icon: heroicons-outline:bookmark-alt
|
||||
39
apps/docs/nuxt.config.ts
Normal file
39
apps/docs/nuxt.config.ts
Normal file
@@ -0,0 +1,39 @@
|
||||
import { createResolver, logger, defineNuxtModule } from '@nuxt/kit'
|
||||
import { $fetch } from 'ofetch'
|
||||
import { version } from './package.json'
|
||||
|
||||
const { resolve } = createResolver(import.meta.url)
|
||||
|
||||
// That allows to overwrite these dependencies paths via `.env` for local development
|
||||
const envModules = {
|
||||
tokens: process?.env?.THEME_DEV_TOKENS_PATH || '@nuxt-themes/tokens',
|
||||
elements: process?.env?.THEME_DEV_ELEMENTS_PATH || '@nuxt-themes/elements',
|
||||
studio: process?.env?.THEME_DEV_STUDIO_PATH || '@nuxthq/studio',
|
||||
typography: process?.env?.THEME_DEV_TYPOGRAPHY_PATH || '@nuxt-themes/typography'
|
||||
}
|
||||
|
||||
const updateModule = defineNuxtModule({
|
||||
meta: {
|
||||
name: '@nuxt-themes/docus'
|
||||
},
|
||||
setup (_, nuxt) {
|
||||
if (nuxt.options.dev) {
|
||||
$fetch('https://registry.npmjs.org/@nuxt-themes/docus/latest').then((release) => {
|
||||
if (release.version > version) {
|
||||
logger.info(`A new version of Docus (v${release.version}) is available: https://github.com/nuxt-themes/docus/releases/latest`)
|
||||
}
|
||||
}).catch(() => {})
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
export default defineNuxtConfig({
|
||||
// https://github.com/nuxt-themes/docus
|
||||
extends: ['@nuxt-themes/docus'],
|
||||
|
||||
devtools: { enabled: true },
|
||||
|
||||
|
||||
|
||||
compatibilityDate: '2024-09-26'
|
||||
})
|
||||
16024
apps/docs/package-lock.json
generated
Normal file
16024
apps/docs/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
21
apps/docs/package.json
Normal file
21
apps/docs/package.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"name": "docus-starter",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "nuxi dev",
|
||||
"build": "nuxi build",
|
||||
"generate": "nuxi generate",
|
||||
"preview": "nuxi preview",
|
||||
"lint": "eslint ."
|
||||
},
|
||||
"devDependencies": {
|
||||
"@nuxt-themes/docus": "latest",
|
||||
"@nuxt/devtools": "^1.4.1",
|
||||
"@nuxt/eslint-config": "^0.5.6",
|
||||
"@nuxtjs/plausible": "^1.0.2",
|
||||
"@types/node": "^20.16.5",
|
||||
"eslint": "^9.10.0",
|
||||
"nuxt": "^3.13.1"
|
||||
}
|
||||
}
|
||||
BIN
apps/docs/public/cover.png
Normal file
BIN
apps/docs/public/cover.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 214 KiB |
BIN
apps/docs/public/favicon.ico
Normal file
BIN
apps/docs/public/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
1
apps/docs/public/img/nestri-logo-sm.svg
Normal file
1
apps/docs/public/img/nestri-logo-sm.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 167 44" width="167" height="44"><defs><image width="47" height="36" id="img1" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC8AAAAkCAMAAAAuPpNdAAAAAXNSR0IB2cksfwAAAEJQTFRF/1gO/1MG/1MG/1UJ/08B/08B/14X/1oQ/1oQAAAA/18Z/1oR/1oR/1kP/1MH/1MH/2ck/2Me/2Me/24v/2sq/2sqUcSXkwAAABZ0Uk5T//+f//+fp6hpACsrG3BwRmdoQUpKLmJsmB4AAAA6SURBVHicY2RgZCABMDIyj6ofUPVsJKrnJEU5UAOp6rkGWfiMqqeuet5Blt4EBln4jKqnrnph0tQDAHjbARfH6mW/AAAAAElFTkSuQmCC"/></defs><style>.a{fill:#0a0a0a}</style><use href="#img1" x="6" y="4"/><path class="a" d="m69.2 34h-5.8v-24h7.9l8.5 16.3h0.1v-16.3h5.8v24h-7.4l-9-16.8h-0.1zm28.4 0.5q-2.8 0-4.6-0.7-1.8-0.8-3-2.2-1.1-1.3-1.6-3.1-0.5-1.7-0.5-3.6 0-2.1 0.5-4 0.6-1.9 1.7-3.3 1.1-1.5 2.8-2.4 1.8-0.8 4.3-0.8 2.5 0 4.2 0.8 1.8 0.9 2.8 2.4 1.1 1.5 1.4 3.5 0.3 2-0.1 4.3l-13.9 0.2v-3.1l9.4-0.2-0.8 1.8q0.3-1.6 0-2.8-0.3-1.1-1-1.7-0.7-0.6-2-0.6-1.4 0-2.1 0.7-0.8 0.7-1.2 1.9-0.3 1.3-0.3 3 0 2.9 1 4.2 1 1.4 3 1.4 0.9 0 1.4-0.2 0.6-0.2 1-0.6 0.3-0.5 0.5-1.1 0.1-0.6 0.1-1.3l5.4 0.2q0.1 1.2-0.3 2.5-0.3 1.3-1.3 2.4-0.9 1.1-2.6 1.8-1.7 0.6-4.2 0.6zm18.7 0q-1.9 0-3.6-0.3-1.6-0.4-2.8-1.3-1.2-0.8-1.9-2.2-0.6-1.4-0.5-3.4l5.1-0.4q0.1 1.2 0.6 2 0.4 0.7 1.3 1.1 0.8 0.4 2 0.4 1.1 0 1.9-0.4 0.9-0.4 0.9-1.3 0-0.5-0.3-0.8-0.3-0.3-1.1-0.5-0.8-0.3-2.3-0.7-1.8-0.5-3.3-0.9-1.5-0.5-2.6-1.2-1-0.6-1.5-1.6-0.6-0.9-0.6-2.4 0-2 1.1-3.3 1-1.4 2.9-2.2 1.9-0.7 4.4-0.7 2.2 0 4.1 0.7 2 0.6 3 2.2 1.2 1.6 0.9 4.1l-5 0.5q0.1-1-0.3-1.8-0.4-0.7-1.2-1.1-0.7-0.4-1.8-0.4-1.3 0-2 0.5-0.6 0.4-0.6 1.1 0 0.5 0.4 0.9 0.4 0.4 1.3 0.7 0.9 0.3 2.3 0.6 1.3 0.2 2.6 0.6 1.3 0.4 2.5 1.1 1.2 0.7 1.9 1.8 0.7 1.1 0.7 2.7 0 1.8-1 3.1-0.9 1.4-2.8 2.1-1.9 0.7-4.7 0.7zm18.1 0q-3.4 0-5.1-1.7-1.6-1.8-1.6-5.4v-8h-2.1v-3.7h0.1q2.2-0.2 3.2-1.4 0.9-1.3 1.1-3.7v-0.1h3.5v4.4h4.4v4.7h-4.4v7.2q0 1.4 0.6 2 0.7 0.6 1.7 0.6 0.5 0 1.1-0.2 0.5-0.1 1-0.4v5.2q-1.1 0.3-2 0.4-0.9 0.1-1.5 0.1zm11.5-0.5h-5.8v-10.4-8.7h5v7.6h0.3q0.2-3.1 0.9-4.8 0.6-1.8 1.6-2.5 0.9-0.8 2.1-0.8 0.7 0 1.4 0.2 0.7 0.2 1.4 0.6l-0.3 6.5q-0.8-0.4-1.6-0.7-0.7-0.2-1.4-0.2-1.2 0-2 0.6-0.8 0.7-1.2 2-0.4 1.2-0.4 3zm14.5 0h-5.8v-19.1h5.8zm-2.9-20.6q-1.7 0-2.6-0.6-0.9-0.8-0.9-2.1 0-1.4 0.9-2.1 0.9-0.7 2.6-0.7 1.7 0 2.6 0.7 0.9 0.7 0.9 2.1 0 1.3-0.9 2-0.9 0.7-2.6 0.7z"/></svg>
|
||||
|
After Width: | Height: | Size: 2.2 KiB |
BIN
apps/docs/public/img/nestri-logo.png
Normal file
BIN
apps/docs/public/img/nestri-logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 25 KiB |
1
apps/docs/public/img/nestri-logo.svg
Normal file
1
apps/docs/public/img/nestri-logo.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1080 1080" width="1080" height="1080"><defs><image width="308" height="234" id="img1" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATQAAADqCAMAAAAbHElGAAAAAXNSR0IB2cksfwAAADNQTFRF/5Bf/2wr/3tB/08B/4VQ/2Uh/9K//9K/AAAA/5xw/3tA/5Fg/2wr/5Zo/4NN/9K//9K/u/+9NwAAABF0Uk5T/f////H/HCsAVVWAgLjVOVVGDSqkAAACDElEQVR4nO3cQQrCAAxFwUaKKCK9/217hryNCDMnCG/7IXPMwdI8RFsTLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLZhTtLV5irY2r19f8IdEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAvmbSNYM+EFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBfMRbc2nvkC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0QLRAtEC0YL6GlTUTXiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaIFogWiBaMKdoa3OJtnYDtq8EmnzQ7p8AAAAASUVORK5CYII="/></defs><style>.a{fill:#0a0a0a}</style><use href="#img1" x="8" y="423"/><path class="a" d="m426 624h-38.4v-158.4h52.1l56.4 107.3h0.5v-107.3h38.4v158.4h-49l-59.5-110.9h-0.5zm187.4 3.4q-18 0-30.2-5.1-12-5.2-19.4-14.1-7.5-9.1-10.8-20.7-3.2-11.5-3.2-24.2 0-13.7 3.4-26.2 3.6-12.4 10.8-22 7.4-9.9 19-15.4 11.7-5.8 28-5.8 16.4 0 27.9 5.8 11.7 5.5 18.7 15.6 7 10.1 8.9 23.3 2.1 13.2-0.5 28.5l-91.9 1.5v-21.1l62.1-1.2-5 12.2q1.4-11-0.5-18.5-1.7-7.7-6.5-11.5-4.8-4.1-13.2-4.1-8.8 0-14.1 4.6-5.3 4.5-7.5 12.9-2.1 8.2-2.1 19.5 0 19.4 6.5 28.3 6.4 8.9 19.9 8.9 5.7 0 9.6-1.5 3.8-1.4 6.2-4 2.4-2.9 3.4-6.8 0.9-4 0.7-9.1l35.5 1.9q0.7 8-1.7 16.4-2.1 8.4-8.4 15.6-6.2 7.2-17.5 11.7-11 4.6-28.1 4.6zm124.1 0q-12.7 0-23.7-2.4-10.8-2.7-19-8.2-7.9-5.5-12.2-14.6-4.1-9.4-3.4-22.6l33.8-2.9q0.5 8 3.6 13.2 3.2 5.1 8.7 7.5 5.5 2.4 13.4 2.4 7.5 0 12.7-2.4 5.6-2.7 5.6-8.7 0-3.1-2-5-1.9-2.2-7.2-3.8-5-2-14.8-4.4-12.3-3.1-22.1-6.2-9.9-3.1-16.8-7.4-7-4.4-10.6-10.6-3.6-6.5-3.6-15.8 0-13.2 7-22.4 7.2-9.3 19.7-14.1 12.4-5.1 28.8-5.1 14.6 0 27.3 4.6 12.7 4.6 19.9 14.9 7.5 10.3 5.6 27.3l-33.2 3.2q0.8-7-1.9-11.8-2.6-5-7.7-7.4-5-2.7-12.2-2.7-8.2 0-12.7 3.1-4.3 2.9-4.3 7.5 0 3.6 2.6 6.2 2.9 2.4 8.6 4.3 6 1.7 15.4 3.9 8.2 1.7 17 4.3 8.9 2.6 16.6 7.2 7.7 4.3 12.5 11.5 4.8 7.2 4.8 18.3 0 11.7-6.5 20.6-6.5 8.9-19 13.7-12.4 4.8-30.7 4.8zm119.3-0.5q-22.3 0-33.4-11.3-10.8-11.5-10.8-35.5v-52.6h-13.9v-24.4h0.7q14.9-2 21.2-9.9 6.2-8.1 7.6-24.5v-0.4h22.8v29h29.1v31.2h-29.1v48q0 9.1 4.4 13 4.5 3.8 11 3.8 3.4 0 7-1 3.6-0.9 6.7-2.6v33.8q-7.5 2.2-13.2 2.9-5.8 0.5-10.1 0.5zm76.3-2.9h-38.6v-68.9-57.8h33.6v50.4h1.9q1.4-20.2 5.5-31.7 4.3-11.7 10.6-16.5 6.5-5.1 14.4-5.1 4.3 0 8.9 1.2 4.8 1.2 9.3 3.9l-1.9 43.2q-5.3-3.2-10.3-4.6-5.1-1.7-9.6-1.7-7.7 0-13 4.3-5.3 4.4-8.1 12.8-2.7 8.4-2.7 20.4zm96.3 0h-38.9v-126.8h38.9zm-19.7-135.8q-11.1 0-17.1-4.6-5.7-4.8-5.7-13.6 0-9.2 5.7-13.7 6-4.8 17.1-4.8 11.3 0 17 4.8 6 4.8 6 13.7 0 8.6-6 13.4-5.7 4.8-17 4.8z"/></svg>
|
||||
|
After Width: | Height: | Size: 2.9 KiB |
6
apps/docs/renovate.json
Normal file
6
apps/docs/renovate.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"extends": ["github>nuxt/renovate-config-nuxt"],
|
||||
"lockFileMaintenance": {
|
||||
"enabled": true
|
||||
}
|
||||
}
|
||||
218
apps/docs/tokens.config.ts
Normal file
218
apps/docs/tokens.config.ts
Normal file
@@ -0,0 +1,218 @@
|
||||
import { defineTheme } from 'pinceau'
|
||||
|
||||
export default defineTheme({
|
||||
color: {
|
||||
black: '#0B0A0A',
|
||||
// Primary is modified lightblue
|
||||
primary: {
|
||||
50: '#fff6ec',
|
||||
100: '#ffebd3',
|
||||
200: '#ffd4a5',
|
||||
300: '#ffb56d',
|
||||
400: '#ff8a32',
|
||||
500: '#ff680a',
|
||||
600: '#ff4f01',
|
||||
700: '#cc3602',
|
||||
800: '#a12b0b',
|
||||
900: '#82260c'
|
||||
},
|
||||
gray: {
|
||||
50: '#FBFBFB',
|
||||
100: '#F6F5F4',
|
||||
200: '#ECEBE8',
|
||||
300: '#DBD9D3',
|
||||
400: '#ADA9A4',
|
||||
500: '#97948F',
|
||||
600: '#67635D',
|
||||
700: '#36332E',
|
||||
800: '#201E1B',
|
||||
900: '#121110'
|
||||
},
|
||||
red: {
|
||||
50: '#FFF9F8',
|
||||
100: '#FFF3F0',
|
||||
200: '#FFDED7',
|
||||
300: '#FFA692',
|
||||
400: '#FF7353',
|
||||
500: '#FF3B10',
|
||||
600: '#BB2402',
|
||||
700: '#701704',
|
||||
800: '#340A01',
|
||||
900: '#1C0301'
|
||||
},
|
||||
blue: {
|
||||
50: '#F2FAFF',
|
||||
100: '#DFF3FF',
|
||||
200: '#C6EAFF',
|
||||
300: '#A1DDFF',
|
||||
400: '#64C7FF',
|
||||
500: '#1AADFF',
|
||||
600: '#0069A6',
|
||||
700: '#014267',
|
||||
800: '#002235',
|
||||
900: '#00131D'
|
||||
},
|
||||
green: {
|
||||
50: '#ECFFF7',
|
||||
100: '#DEFFF1',
|
||||
200: '#C3FFE6',
|
||||
300: '#86FBCB',
|
||||
400: '#3CEEA5',
|
||||
500: '#0DD885',
|
||||
600: '#00B467',
|
||||
700: '#006037',
|
||||
800: '#002817',
|
||||
900: '#00190F'
|
||||
},
|
||||
yellow: {
|
||||
50: '#FFFCEE',
|
||||
100: '#FFF6D3',
|
||||
200: '#FFF0B1',
|
||||
300: '#FFE372',
|
||||
400: '#FFDC4E',
|
||||
500: '#FBCA05',
|
||||
600: '#CBA408',
|
||||
700: '#614E02',
|
||||
800: '#292100',
|
||||
900: '#1B1500'
|
||||
},
|
||||
shadow: {
|
||||
initial: '{color.gray.400}',
|
||||
dark: '{color.gray.800}'
|
||||
}
|
||||
},
|
||||
shadow: {
|
||||
xs: '0px 1px 2px 0px {color.shadow}',
|
||||
sm: '0px 1px 3px 0px {color.shadow}, 0px 1px 2px -1px {color.shadow}',
|
||||
md: '0px 4px 6px -1px {color.shadow}, 0px 2px 4px -2px {color.shadow}',
|
||||
lg: '0px 10px 15px -3px {color.shadow}, 0px 4px 6px -4px {color.shadow}',
|
||||
xl: '0px 20px 25px -5px {color.shadow}, 0px 8px 10px -6px {color.shadow}',
|
||||
'2xl': '0px 25px 50px -12px {color.shadow}',
|
||||
none: '0px 0px 0px 0px transparent'
|
||||
},
|
||||
docus: {
|
||||
$schema: {
|
||||
title: 'All the configurable tokens from Docus.',
|
||||
tags: [
|
||||
'@studioIcon material-symbols:docs'
|
||||
]
|
||||
},
|
||||
body: {
|
||||
backgroundColor: {
|
||||
initial: '{color.white}',
|
||||
dark: '{color.black}'
|
||||
},
|
||||
color: {
|
||||
initial: '{color.gray.800}',
|
||||
dark: '{color.gray.200}'
|
||||
},
|
||||
fontFamily: '{font.sans}'
|
||||
},
|
||||
header: {
|
||||
height: '64px',
|
||||
logo: {
|
||||
height: {
|
||||
initial: '{space.6}',
|
||||
sm: '{space.7}'
|
||||
}
|
||||
},
|
||||
title: {
|
||||
fontSize: '{fontSize.2xl}',
|
||||
fontWeight: '{fontWeight.bold}',
|
||||
color: {
|
||||
static: {
|
||||
initial: '{color.gray.900}',
|
||||
dark: '{color.gray.100}',
|
||||
},
|
||||
hover: '{color.primary.500}',
|
||||
}
|
||||
}
|
||||
},
|
||||
footer: { height: { initial: '145px', sm: '100px' }, padding: '{space.4} 0' },
|
||||
readableLine: '78ch',
|
||||
loadingBar: {
|
||||
height: '3px',
|
||||
gradientColorStop1: '#00dc82',
|
||||
gradientColorStop2: '#34cdfe',
|
||||
gradientColorStop3: '#0047e1'
|
||||
},
|
||||
search: {
|
||||
backdropFilter: 'blur(24px)',
|
||||
input: {
|
||||
borderRadius: '{radii.2xs}',
|
||||
borderWidth: '1px',
|
||||
borderStyle: 'solid',
|
||||
borderColor: {
|
||||
initial: '{color.gray.200}',
|
||||
dark: 'transparent'
|
||||
},
|
||||
fontSize: '{fontSize.sm}',
|
||||
gap: '{space.2}',
|
||||
padding: '{space.2} {space.4}',
|
||||
backgroundColor: {
|
||||
initial: '{color.gray.200}',
|
||||
dark: '{color.gray.800}'
|
||||
},
|
||||
},
|
||||
results: {
|
||||
window: {
|
||||
marginX: {
|
||||
initial: '0',
|
||||
sm: '{space.4}'
|
||||
},
|
||||
borderRadius: {
|
||||
initial: 'none',
|
||||
sm: '{radii.xs}'
|
||||
},
|
||||
marginTop: {
|
||||
initial: '0',
|
||||
sm: '20vh'
|
||||
},
|
||||
maxWidth: '640px',
|
||||
maxHeight: {
|
||||
initial: '100%',
|
||||
sm: '320px'
|
||||
},
|
||||
},
|
||||
selected: {
|
||||
backgroundColor: {
|
||||
initial: '{color.gray.300}',
|
||||
dark: '{color.gray.700}'
|
||||
},
|
||||
},
|
||||
highlight: {
|
||||
color: 'white',
|
||||
backgroundColor: '{color.primary.500}'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
typography: {
|
||||
color: {
|
||||
primary: {
|
||||
50: '{color.primary.50}',
|
||||
100: '{color.primary.100}',
|
||||
200: '{color.primary.200}',
|
||||
300: '{color.primary.300}',
|
||||
400: '{color.primary.400}',
|
||||
500: '{color.primary.500}',
|
||||
600: '{color.primary.600}',
|
||||
700: '{color.primary.700}',
|
||||
800: '{color.primary.800}',
|
||||
900: '{color.primary.900}'
|
||||
},
|
||||
secondary: {
|
||||
50: '{color.gray.50}',
|
||||
100: '{color.gray.100}',
|
||||
200: '{color.gray.200}',
|
||||
300: '{color.gray.300}',
|
||||
400: '{color.gray.400}',
|
||||
500: '{color.gray.500}',
|
||||
600: '{color.gray.600}',
|
||||
700: '{color.gray.700}',
|
||||
800: '{color.gray.800}',
|
||||
900: '{color.gray.900}'
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
3
apps/docs/tsconfig.json
Normal file
3
apps/docs/tsconfig.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"extends": "./.nuxt/tsconfig.json"
|
||||
}
|
||||
Reference in New Issue
Block a user