# Introduction

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

Have you ever questioned what debuff a boss' ability applied to you?

Have you ever wondered what kills you in the Crimson Temple boss room? &#x20;

Are you so fed up with Sirus' "Die" Beams that you're questioning what it actually does?

***

[exile.watch](https://exile.watch) aims to provide quick snippets of the majority of Path of Exile encounters' abilities.&#x20;

In the modern world, no one has time to watch a 10-minute fight guide.&#x20;

Learn strategies in no time.&#x20;

Each ability is explained with short GIFs.


# The Maven - exile.watch context

When using exile.watch, you become 'The Maven'.

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

Being a cosmic entity yourself *(as a human)*, you essentially serve as an observer *(akin to an* [*exile.watch*](https://exile.watch) *user).*

You witness encounters through GIF snippets, much like Maven observes your PoE endeavors.

***

The main project of [exile.watch](https://exile.watch) is named [crucible](/projects/crucible) - this is your arena *(the website)* where you witness all the battles.&#x20;

To gain entry into the `crucible`, you need Maven's Writ. The exile.watch [writ](/projects/writ) project contains components and icons that allow the `crucible` to exist.&#x20;

To obtain a Maven's Writ, you need [splinters](/projects/splinters) - this is where the exile.watch build tools create `writ` packages.

All the information served to `crucible` resides in the exile.watch [nucleus](/projects/nucleus) project, just like all the information The Maven processes through her Nucleus.


# hideout

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

Welcome to the [hideout](https://github.com/exile-watch/hideout), the central nerve center for all things related to the [exile.watch](https://exile.watch/) project and its associated repositories: [crucible](https://github.com/exile-watch/crucible), [writ](https://github.com/exile-watch/writ), [splinters](https://github.com/exile-watch/splinters), [nucleus](https://github.com/exile-watch/nucleus), [malachai](https://github.com/exile-watch/malachai), [doryani](https://github.com/exile-watch/doryani) and [voidstone](https://github.com/exile-watch/voidstone) *(*&#x6D;ore on them [*here*](#links-to-projects)*).*

The Hideout is designed to be a comprehensive resource where users and contributors can find everything from issue tracking to feature discussions, extensive documentation, and overarching project details.

### Overview

The Hideout streamlines access to critical information and facilitates community engagement across the exile.watch project. By consolidating communication and documentation, we aim to enhance transparency, efficiency, and collaboration.

#### Navigation

* [Issue Tracking](https://github.com/exile-watch/hideout/issues): Centralized location for reporting, tracking, and discussing issues across all related projects. This ensures that feedback and bug reports are addressed efficiently.
* [Feature Requests](https://github.com/exile-watch/hideout/discussions): Share your ideas for new features or improvements. This is a space to discuss potential enhancements and gauge community interest.
* [Project Updates and News](https://github.com/exile-watch/hideout/discussions/categories/announcements): Stay informed about the latest developments, releases, and important announcements related to exile.watch.
* [Engineering Blog](https://engineering.exile.watch/): Dive into the minds behind the project with insightful posts on development, challenges, and innovations within the exile.watch ecosystem.

#### How to Get Involved

* [Report an Issue](https://github.com/exile-watch/hideout/issues/new/choose): Encountered a bug or have a suggestion? Open a new issue using our template and provide as much detail as possible.
* [Propose a Feature](https://github.com/exile-watch/hideout/discussions/new?category=ideas): Have an idea for a new feature? Create a feature request detailing your proposal and its potential impact.
* [Contribute to the Wiki](https://github.com/exile-watch/hideout/wiki): Our wiki is a collaborative effort. If you have knowledge to share or see an area that could be improved, your contributions are welcome.

### Links to projects

* [crucible](https://github.com/exile-watch/crucible) *(user facing website,* [*exile.watch*](https://exile.watch/)*)*
  * Documentation: [crucible](/projects/crucible)
* [writ](https://github.com/exile-watch/writ) *(exile.watch design system)*
  * Documentation: [writ](/projects/writ)
* [splinters](https://github.com/exile-watch/splinters) *(exile.watch build tools)*
  * Documentation: [splinters](/projects/splinters)
* [nucleus](https://github.com/exile-watch/nucleus) *(exile.watch data)*
  * Documentation: [nucleus](/projects/nucleus)
* [malachai](https://github.com/exile-watch/malachai) *(exile.watch chrome extensions)*
  * Documentation: [malachai](/projects/malachai)
* [doryani](https://github.com/exile-watch/doryani) *(exile.watch automation)*
  * Documentation: [doryani](/projects/doryani)
* [voidstone](https://github.com/exile-watch/voidstone) (exile.watch monorepo release manager)
  * Documentation: [voidstone](/voidstone)

### Contact

If you have any general questions or need assistance, please head over to [discussions](https://github.com/exile-watch/hideout/discussions).

Thank you for helping us improve [exile.watch](https://exile.watch/). Your contributions make a significant difference in the development and enhancement of these projects.


# crucible

User facing website (www\.exile.watch)

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

[crucible](https://www.poewiki.net/wiki/Crucible_Hideout) *(*[*Hideout*](https://www.poewiki.net/wiki/Hideout)*)* - This is where the main foundations of exile.watch are laid.&#x20;

All `exile.watch` packages and site deployments are utilized in this place.


# Contributing

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

## [Prerequisites](/development/prerequisites)

## Development

### 1. [Fork @exile-watch/crucible repo](https://github.com/exile-watch/crucible)

### 2. [Create GitHub PAT token](/development/generating-github-pat)

### 3. [Create .npmrc file](/development/.npmrc-file)&#x20;

### 4. Install dependencies & start script

```bash
# project root
$: nvm use # uses node version that's defined in .nvmrc
$: npm i # install dependencies
$: npm run dev # run the app locally
```

After that, `exile.watch` should be available on `localhost:3000` and you are good to go


# writ

exile.watch design system

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

Without [*(The Maven's)* Writ](https://www.poewiki.net/wiki/The_Maven%27s_Writ) there is no [*(The Maven's)* Crucible](https://www.poewiki.net/wiki/The_Maven%27s_Crucible)

Similarly, without a [design system](https://github.com/exile-watch/writ) there is no [user facing website](https://github.com/exile-watch/crucible).

***

`writ` design system is based on real-world codebases.

`writ` design system provides UI components to help contributors work more efficiently, and to make *Writ* modules more cohesive.

While `writ` design system is not yet accessibility friendly as well as not thoroughly tested, this will be changed in the future.

Aim of the `writ` design system is to provide high quality experience for both, developers and users, that effortlessly scales across *Writ* modules.

`writ` design system is intended for all platforms and latest browsers. This may not be the case in the MVP (Minimum Viable Product) phase, but it sets a ground up for the future.


# Contributing

@exile-watch/writ setup & contribution guide

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

## [Prerequisites](/development/prerequisites)

## Development

### 1. [Fork @exile-watch/writ repo](https://github.com/exile-watch/writ)

### 2. [Create GitHub PAT token](/development/generating-github-pat)

### 3. [Create .npmrc file](/development/.npmrc-file)&#x20;

### 4. Install dependencies

```bash
# project root
$: nvm use # uses node version that's defined in .nvmrc
$: npm i # install dependencies
```

### 5. Check changes made in [writ](/projects/writ) package locally in [crucible](/projects/crucible) project

#### a) Create [writ](/projects/writ) package link

<pre class="language-bash"><code class="lang-bash"><strong># @exile-watch/writ project
</strong># package path e.g. ~/writ/packages/writ-react
$: npm link
</code></pre>

#### b) Build [writ](/projects/writ) package

<pre class="language-bash"><code class="lang-bash"><strong># @exile-watch/writ project
</strong># package path e.g. ~/writ/packages/writ-react
$: npm run build
</code></pre>

#### c) Link [writ](/projects/writ) package in [crucible](/projects/crucible) project

<pre class="language-bash"><code class="lang-bash"><strong># @exile-watch/crucible project
</strong># root path ~/crucible
$: npm link @exile-watch/writ-react #
</code></pre>

### 6. Conclusion

Not happy with the change? \
Repeat step [#b-build-writ-package](#b-build-writ-package "mention") and [#c-link-writ-package-in-crucible-project](#c-link-writ-package-in-crucible-project "mention")

Happy with the change? \
Create a new pull request and don't forget to locally unlink modified package:

<pre class="language-bash"><code class="lang-bash"><strong># @exile-watch/writ project
</strong># package path e.g. ~/writ/packages/writ-react
$: npm unlink
</code></pre>

<pre class="language-bash"><code class="lang-bash"><strong># @exile-watch/crucible project
</strong># root path ~/crucible
$: npm i # this will "revert" linked module to the actual package 
</code></pre>


# splinters

exile.watch build tools

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

some naming context

***

Collection of shared frontend tooling configurations and project dependencies


# Contributing

@exile-watch/splinters setup & contribution guide

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

## [Prerequisites](/development/prerequisites)

## Development

### 1. [Fork @exile-watch/splinters repo](https://github.com/exile-watch/splinters)

### 2. [Create GitHub PAT token](/development/generating-github-pat)

### 3. [Create .npmrc file](/development/.npmrc-file)&#x20;

### 4. Install dependencies

```bash
# project root
$: nvm use # uses node version that's defined in .nvmrc
$: npm i # install dependencies
```

### 5. Check changes made in [splinter](/projects/splinters) package locally in [writ](/projects/writ) or [crucible](/projects/crucible) project

#### a) Create [splinter](/projects/splinters) package link

<pre class="language-bash"><code class="lang-bash"><strong># @exile-watch/splinters project
</strong># package path e.g. ~/splinters/packages/biome-config
$: npm link
</code></pre>

#### b) Build [splinters](/projects/splinters) package

<pre class="language-bash"><code class="lang-bash"><strong># @exile-watch/splinters project
</strong># package path e.g. ~/splinters/packages/biome-config
$: npm run build
</code></pre>

#### c) Link [splinter](/projects/splinters) package in [crucible](/projects/crucible)

<pre class="language-bash"><code class="lang-bash"><strong># e.g. @exile-watch/crucible project
</strong># root path ~/crucible
$: npm link @exile-watch/biome-config
</code></pre>

### 6. Conclusion

Not happy with the changes? \
Repeat step [#b-build-splinters-package](#b-build-splinters-package "mention") and [#c-link-splinter-package-in-crucible](#c-link-splinter-package-in-crucible "mention")

Happy with the change? \
Create a new pull request and don't forget to unlink:

<pre class="language-bash"><code class="lang-bash"><strong># @exile-watch/splinters project
</strong># package path e.g. ~/splinters/packages/biome-config
$: npm unlink
</code></pre>

<pre class="language-bash"><code class="lang-bash"><strong># e.g. @exile-watch/crucible project
</strong># root path ~/crucible
$: npm i # this will "revert" linked module to the actual package 
</code></pre>


# @exile-watch/vite-config

Shared Vite configuration for exile.watch projects

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

## About [`@exile-watch/vite-config`](https://github.com/exile-watch/splinters/tree/main/packages/vite-config)

This package contains shared Vite configuration, Vite dependency and Vite-related dependencies.

## About Vite

[Vite](https://vite.dev/) is a blazing fast frontend build tool powering the next generation of web applications that aims to provide a faster and leaner development experience for modern web projects.

## Usage

1. Install the package as a `devDependency`:

```bash
npm i -D @exile-watch/vite-config
```

***

2. Create a new configuration file at `{root}/vite.config.ts`:

```typescript
// {root}/vite.config.ts
import viteConfig from '@exile-watch/vite-config'

export default viteConfig()
```

***

3. Add `build` script to `package.json`

```jsonp
// {root}/package.json
{
  // ...
  "scripts": {
    // ...
    "build": "vite build"
  }
}
```


# @exile-watch/biome-config

Shared Biome configuration for exile.watch projects

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

## About [`@exile-watch/biome-config`](https://github.com/exile-watch/splinters/tree/main/packages/biome-config)

This package contains shared Biome configuration and Biome dependency (including it's binary).

## About Biome

[Biome](https://biomejs.dev/) is a fast formatter and a performant linter.

## Usage

1. Install the package as a `devDependency`:

```bash
npm i -D @exile-watch/biome-config
```

***

2. Add/update following `scripts` properties in repo's root `package.json`:

<pre class="language-jsonp"><code class="lang-jsonp">// {root}/package.json
{
  // ...
  "scripts": {
    // ...
    "lint": "npx @biomejs/biome check .",
<strong>    "lint:apply": "npx @biomejs/biome check --apply .",
</strong>    "format": "npx @biomejs/biome format --write ."
  }
}
</code></pre>

***

3. Create `biome.json` with following content:

```jsonp
// {root}/biome.json
{
  "extends": ["@exile-watch/biome-config"]
}
```


# @exile-watch/typescript-config

Shared TypeScript configuration for exile.watch projects

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

## About [`@exile-watch/typescript-config`](https://github.com/exile-watch/splinters/tree/main/packages/typescript-config)

This package contains both, shared TypeScript configuration and the TypeScript dependency itself.

## About TypeScript

[TypeScript](https://www.typescriptlang.org/) is a strongly typed programming language that builds on JavaScript, giving you better tooling at any scale.

## Usage

1. Install the package as a `devDependency`:

```bash
npm i -D @exile-watch/typescript-config
```

***

2. In the project’s `package.json` file, add the following npm script to the scripts property:

```json5
// {root}/package.json
{
  // ...
  "scripts": {
    // ...
    "typecheck": "tsc --noEmit"
  }
}
```


# @exile-watch/unit-testing-config

Shared Vitest configuration for exile.watch projects

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

## About [`@exile-watch/unit-testing-config`](https://github.com/exile-watch/splinters/tree/main/packages/unit-testing-config)

This package contains shared Vitest configuration, Vitest and Testing Library dependencies.

## About Vitest & Testing Library

[Vitest](https://vitest.dev/) is a [Vite](https://vitejs.dev/)-native testing framework.

[Testing Library](https://testing-library.com/) contains a simple and complete testing utilities that encourage good testing practices

## Usage

1. Install the package as a `devDependency`:

```bash
npm i -D @exile-watch/unit-testing-config
```

***

2. Add/update `scripts` properties in repo's root `package.json`:

```jsonp
// {root}/package.json
{
  "scripts": {
    "lint": ...,        // "exit 0" if linting is not set
    "lint:apply": ...,  // "exit 0" if linting is not set
    "format": ...       // "exit 0" if formatting is not set
    "typecheck": ...    // "exit 0" if typecheck is not set
  },
  "config": {
    "commitizen": {
      "path": "./node_modules/cz-conventional-changelog"
    }
  }
}
```


# @exile-watch/lefthook-config

Shared Lefthook configuration for exile.watch projects

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

Dedicated blog post: [Leveraging Lefthook to enforce commit guidelines at exile.watch](https://engineering.exile.watch/march-2024/leveraging-lefthook-to-enforce-commit-guidelines-at-exile.watch)

***

## About [`@exile-watch/lefthook-config`](https://github.com/exile-watch/splinters/tree/main/packages/lefthook-config)

This package contains shared Lefthook configuration, Lefthook dependency and commit-related dependencies.

## About Lefthook

[Lefthook](https://github.com/evilmartians/lefthook) is a Git hooks manager for Node.js, Ruby and many other types of projects.

## Usage

### Prerequisites

1. Add [@exile-watch/typescript-config](/projects/splinters/exile-watch-typescript-config)
2. Add [@exile-watch/biome-config](/projects/splinters/exile-watch-biome-config)

***

1. Install the package as a `devDependency`:

```bash
npm i -D @exile-watch/lefthook-config
```

***

2. Add/update following `config` and `scripts` properties in repo's root `package.json`:

```jsonp
// {root}/package.json
{
  "scripts": {
    "postinstall": "npx lefthook install",
    "lint": ...,        // "exit 0" if linting is not set
    "lint:apply": ...,  // "exit 0" if linting is not set
    "format": ...       // "exit 0" if formatting is not set
    "typecheck": ...    // "exit 0" if typecheck is not set
  },
  "config": {
    "commitizen": {
      "path": "./node_modules/cz-conventional-changelog"
    }
  }
}
```

***

3. Create a new configuration file at `./commitlint.config.js` and inherit all the options using `extends` property:

```javascript
// {root}/commitlint.config.js
module.exports = {
  extends: ['@commitlint/config-conventional']
};
```

***

4. In project root in `lefthook.yml` replace generated content with:

<pre class="language-yaml"><code class="lang-yaml"><strong># {root}/lefthook.yml
</strong><strong>remotes:
</strong>  - git_url: https://github.com/exile-watch/splinters
    configs:
      - packages/lefthook-config/lefthook.yml
</code></pre>


# nucleus

exile.watch data

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

some naming context

***


# Contributing (data)

@exile-watch/nucleus setup & contribution guide


# Encounter token breakdown

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

## API

<table><thead><tr><th width="169" align="center">key</th><th width="106" align="center">necessity</th><th width="105" align="center">type</th><th>description</th><th>Example</th></tr></thead><tbody><tr><td align="center">map</td><td align="center">optional</td><td align="center">string</td><td>Map name. In case there is no map for the boss (see: <code>conquerors</code> or <code>elder guardians</code>) then this field is ommited</td><td>Coves</td></tr><tr><td align="center">bosses</td><td align="center">required</td><td align="center">string</td><td><p>Boss name. </p><p>Can be multiple</p></td><td>Telvar, the Inebriated</td></tr><tr><td align="center">type</td><td align="center">optional</td><td align="center">string[]</td><td>List of ability damage types.</td><td>physical, fire</td></tr><tr><td align="center">abilities</td><td align="center">required</td><td align="center">string[]</td><td>List of <code>boss abilities</code></td><td>Spawn Barrel, Tar</td></tr><tr><td align="center">tip</td><td align="center">required</td><td align="center">string[]</td><td>List of Player Interactions to given Ability. <code>yml</code> brackets have the same role as dashes.</td><td>dodge, kill new spawns</td></tr><tr><td align="center">gif</td><td align="center">required</td><td align="center">string</td><td>Video source. Currently all of the sources are hosted from <code>http://gyazo.com/</code></td><td><a href="https://i.gyazo.com/279f86d6f8652e9708cde4a80276223c.mp4">https://i.gyazo.com/279f86d6f8652e9708cde4a80276223c.mp4</a></td></tr><tr><td align="center">about</td><td align="center">required</td><td align="center">string[]</td><td>About ability list. Wrap each sentence with double quotation marks (<code>""</code>). In future we may enhance those strings.</td><td>Every couple seconds Telvar throws Barrel at player's position</td></tr><tr><td align="center">isChallenge</td><td align="center">optional</td><td align="center">boolean</td><td>Marks ability as League Challenge</td><td>true, false</td></tr><tr><td align="center">aboutChallenge</td><td align="center">optional</td><td align="center">string[]</td><td>About League Challenge</td><td>Defeat Lycius, Midnight's Howl in Lair Map while he is channeling Wolf Barrage</td></tr></tbody></table>

## YAML example&#x20;

```yaml
map: Coves
bosses:
  - Telvar, the Inebriated:
      abilities:
        - Spawn Barrel:
            tip: [ destroy ]
            gif: https://i.gyazo.com/20b4ddbade91f264d18ba8c304d9a19a.mp4
            about:
              - "Every couple seconds Telvar spawns a Barrel at random position"
              - "Once destroyed leaves a pool of Tar"
        - Tar:
            tip: [ move out ]
            gif: https://i.gyazo.com/22602b30cc9cf622a91f1a0c371477d6.mp4
            about:
              - "Being in Tar slows your movement"
        - Throw Barrel:
            type: [ physical ]
            tip: [ dodge ]
            gif: https://i.gyazo.com/279f86d6f8652e9708cde4a80276223c.mp4
            about:
              - "Every couple seconds Telvar throws Barrel at player's position"
        - Alchemy Orb:
            type: [ fire ]
            gif: https://i.gyazo.com/22602b30cc9cf622a91f1a0c371477d6.mp4
            about:
              - "Alchemy Orb leaves a pool of flames"

  - Pirate Treasure:
      abilities:
        - Slam:
            type: [ physical ]
            tip: [ destroy ]
            gif: https://i.gyazo.com/20b4ddbade91f264d18ba8c304d9a19a.mp4
            about:
              - "Performs a deadly slam"
              - "This ability can explode Telvar's Barrel"
        - Whirling Blades:
            tip: [ dodge ]
            gif: https://i.gyazo.com/de274bac97aeea2ad5e7726b7c1250ab.mp4
            about:
              - "Rolls towards player linearly"
              - "This ability can explode Telvar's Barrel"
```

## Common tokens

In common cases you may notice we don't use "normal" strings but `tokens`. Pay attention to `about` key in example below:

```yaml
# coves.yml
map: Coves
bosses:
  - Telvar, the Inebriated:
      abilities:
        - Spawn Barrel:
            tip: [ destroy ]
            gif: https://i.gyazo.com/20b4ddbade91f264d18ba8c304d9a19a.mp4
            about:
              - /SPAWN_BARREL/
              - "Once destroyed leaves a pool of Tar"
```

In example above `/SPAWN_BARREL/` is a skill token which value is located in [tokens/skills.yml](https://github.com/sbsrnt/poe-watch/tree/main/tokens/skills.yml)

Skill token has 3 rules:

1. Must start with forward slash (`/`)
2. Must be upper-cased with underline in case ability name has more than 2 words
3. Must end with forward slash (`/`)

*example: `/SPAWN_BARREL/`, `/FIREBALL/`*

Since **standard** `yaml` files by definition are independent of each other we can't import in any shape or form values form other `yaml` file values nor make a use of [yaml anchors/aliases](https://support.atlassian.com/bitbucket-cloud/docs/yaml-anchors/).

To make our lives easier and not duplicate definitions of common skills, in [scripts/encounters/extract-tokens.js](https://github.com/sbsrnt/poe-watch/tree/main/scripts/encounters/extract-tokens.js#L26-L36) we are replacing token(s) value for our [`.json` auto-generated](https://github.com/sbsrnt/poe-watch/tree/main/extracted-data/encounters) files.


# Contributing (scripts)

@exile-watch/nucleus setup & contribution guide

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

## [Prerequisites](/development/prerequisites)

## Development

### 1. [Fork @exile-watch/nucleus repo](https://github.com/exile-watch/nucleus)

### 2. [Create GitHub PAT token](/development/generating-github-pat)

### 3. [Create .npmrc file](/development/.npmrc-file)&#x20;

### 4. Install dependencies

```bash
# project root
$: nvm use # uses node version that's defined in .nvmrc
$: npm i # install dependencies
```

### 5. Check changes made in [nucleus](/projects/nucleus) package locally in [crucible](/projects/crucible) project

#### a) Create [nucleus](/projects/nucleus) package link

<pre class="language-bash"><code class="lang-bash"><strong># @exile-watch/nucleus project
</strong># package path e.g. ~/nucleus/packages/encounter-data
$: npm link
</code></pre>

#### b) Build [nucleus](/projects/nucleus) package

<pre class="language-bash"><code class="lang-bash"><strong># @exile-watch/nucleus project
</strong># package path e.g. ~/nucleus/packages/encounter-data
$: npm run build
</code></pre>

#### c) Link [nucleus](/projects/nucleus) package in [crucible](/projects/crucible) project

<pre class="language-bash"><code class="lang-bash"><strong># @exile-watch/crucible project
</strong># root path ~/crucible
$: npm link @exile-watch/encounter-data #
</code></pre>

### 6. Conclusion

Not happy with the change? \
Repeat step [#b-build-nucleus-package](#b-build-nucleus-package "mention") and [#c-link-nucleus-package-in-crucible-project](#c-link-nucleus-package-in-crucible-project "mention")

Happy with the change? \
Create a new pull request and don't forget to locally unlink modified package:

<pre class="language-bash"><code class="lang-bash"><strong># @exile-watch/nucleus project
</strong># package path e.g. ~/nucleus/packages/encounter-data
$: npm unlink
</code></pre>

<pre class="language-bash"><code class="lang-bash"><strong># @exile-watch/crucible project
</strong># root path ~/crucible
$: npm i # this will "revert" linked module to the actual package 
</code></pre>


# Scripts definition

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

Every script is taking a part of auto-generating data content on the website.

There are 3 rules:

1. `extract-*-tokens.js` scripts always goes first.
2. Order of other scripts when they fire don't matter after that step.
3. `clean-invalid-data-files.js` always goes last.

| script                        | description                                                                          |
| ----------------------------- | ------------------------------------------------------------------------------------ |
| `extract-*-tokens.js`         | Converts `.yml` token files to `.json` format                                        |
| `build-indexed-search.js`     | Refines extracted data to retain only what is necessary for the `search input`       |
| `build-paths.js`              | Refines extracted data to retain only what is necessary for the `sidebar navigation` |
| `clean-invalid-data-files.js` | Removes files that have had their `file name` updated                                |


# @exile-watch/encounter-data

Data that powers exile.watch

## About [`@exile-watch/encounter-data`](https://github.com/exile-watch/nucleus/tree/main/packages/encounter-data)

This package contains JSONs that power exile.watch.

This is ES module package only.

JSONs are generated based on the extracted YAML tokens. ([more on the process here](/projects/nucleus/contributing-scripts/scripts-definition))

## Usage

{% hint style="info" %}
The size of generated JSONs can be big (double digit kb)

It's advised to dynamically import them when needed in order to boost performance
{% endhint %}

1. Install the package as a `dependency`:

```bash
npm i @exile-watch/encounter-data
```

***

2. Example of dynamically importing the data

<pre class="language-tsx"><code class="lang-tsx"><strong>// ListEncounterCategories.tsx
</strong><strong>import { CategoryPageType } from "@exile-watch/encounter-data";
</strong>import { SimpleGrid } from "@exile-watch/writ-react";
import { useRouter } from "next/router";
import React, { useEffect, useState } from "react";
import { HomepageCard, SimpleCard } from "#components";

const ListEncounterCategories = () => {
  const {
    query: { directory, category },
  } = useRouter();
  const [data, setData] = useState&#x3C;CategoryPageType | null>(null);

  useEffect(() => {
    import(
      `@exile-watch/encounter-data/dist/extracted-data/${directory}/${category}.esm` as string
    )
      .then((d) => {
        setData(d.default);
      })
      .catch(() => {
        setData(null);
      });
  }, [category]);

  return (
    &#x3C;SimpleGrid
      cols={{ xxxl: 6, xxl: 5, xl: 4, lg: 3, md: 2, sm: 2, xs: 1 }}
      mb="md"
    >
      {data?.map((data) => (
        &#x3C;HomepageCard key={data.path} {...data} />
      ))}
    &#x3C;/SimpleGrid>
  );
};

export default ListEncounterCategories;

</code></pre>


# @exile-watch/seo

Search Optimization Engine tooling that powers exile.watch

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

## About [`@exile-watch/seo`](https://github.com/exile-watch/nucleus/tree/main/packages/seo)

This package contains SEO meta configs, Next SEO dependency and a script to generate [sitemap.xml](https://developers.google.com/search/docs/crawling-indexing/sitemaps/overview) that powers exile.watch [SEO](https://developers.google.com/search/docs/fundamentals/seo-starter-guide#:~:text=SEO%E2%80%94short%20for%20search%20engine,site%20through%20a%20search%20engine.).

## About Next SEO

[Next SEO](https://github.com/garmeeh/next-seo) is a plugin that makes managing your SEO easier in Next.js projects.

## Usage

1. Install the package as a `dependency`:

```bash
npm i @exile-watch/seo
```

***

2. Example of `Next SEO` usage with `metaEncountersCategories` configuration:

<pre class="language-tsx"><code class="lang-tsx"><strong>// EncountersCategory.page.tsx
</strong><strong>import { metaEncountersCategories } from "@exile-watch/seo";
</strong>import { startCase } from "lodash";
import { NextSeo } from "next-seo";
import { useRouter } from "next/router";
import React from "react";
import { Layout } from "#components";
import ListEncounterCategories from "./_components/ListEncounterCategories/ListEncounterCategories";

const EncountersCategoryPage = () => {
  const {
    query: { directory, category },
  } = useRouter();

  return (
    &#x3C;>
      {directory &#x26;&#x26; category &#x26;&#x26; (
        &#x3C;NextSeo {...metaEncountersCategories({ directory, category })} />
      )}

      &#x3C;Layout label={startCase(category as string)}>
        &#x3C;ListEncounterCategories />
      &#x3C;/Layout>
    &#x3C;/>
  );
};

export { EncountersCategoryPage };

</code></pre>


# malachai

exile.watch chrome extensions

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>


# Contributing

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

## [Prerequisites](/development/prerequisites)

## Development

### 1. [Fork @exile-watch/malachai repo](https://github.com/exile-watch/malachai)

### 2. [Create GitHub PAT token](/development/generating-github-pat)

### 3. [Create .npmrc file](/development/.npmrc-file)&#x20;

### 4. Install dependencies & start script

```bash
# project root
$: nvm use # uses node version that's defined in .nvmrc
$: npm i # install dependencies
$: cd packages/snap-gyazo-thumbnail && npm run dev # run the app locally
```

### 5. Loading extension in chrome

#### 5.1. Head over to `chrome://extensions` and enable Developer Mode.

Upper right corner, toggle the `Developer Mode` switch

#### 5.2. Click on "Load Unpacked" and navigate to `malachai` extension's `build/chrome-mv3-dev` (or `build/chrome-mv3-prod`) directory.

Running `npm run dev` will generate `build/chrome-mv3-dev`\
Running `npm run build` will generate `build/chrome-mv3-prod`

`build/*` dir is generated at `./packages/snap-gyazo-thumbnail`

#### 5.3. Head over to [https://gyazo.com/:gif\_id](https://gyazo.com/41c10c1cc7d06c7d5fee3287cdf58724) to see the extension in action

`malachai` is using [plasmo](https://docs.plasmo.com/), the all-in-one platform that makes it easy for browser extension developers to create, test, and publish extensions

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FijmhjM1zCiuoDTArMZii%2Fimage.png?alt=media&amp;token=b92d478b-28ca-45d9-8b52-0a48cdc612cb" alt=""><figcaption><p>Redirect button highlight</p></figcaption></figure>

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2Fiwk4yssg24sDYoKMpgm5%2Fimage.png?alt=media&amp;token=ba6009b8-08b5-432a-a1b9-2328eee44a94" alt=""><figcaption><p>Thumbnail creation button highlight</p></figcaption></figure>


# snap gyazo thumbnail

@exile-watch/snap-gyazo-thumbnail

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

Download Extension: <https://chromewebstore.google.com/detail/exilewatch-snap-gyazo-thu/mjldamcdiefgcfkhgkapmnbnofilgblp?hl=pl&authuser=0>

## Usage:

1. Install the extension
2. Head over to whatever gyazo gif you have created. \
   As an example we can use this GIF: <https://gyazo.com/41c10c1cc7d06c7d5fee3287cdf58724>
3. In upper right corner there is a new button: "Redirect me to GIF thumbnail creation"\
   This will redirect you to `.mp4` file directly (without downloading it), where we can snap the video frame\
   Expected redirect: <https://i.gyazo.com/41c10c1cc7d06c7d5fee3287cdf58724.mp4>

   <figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FfjWNn67Xm27SDuyPeELE%2Fimage.png?alt=media&amp;token=f8744a3c-0a62-487e-b6bd-95fb1ed681ab" alt=""><figcaption></figcaption></figure>
4. In the center you have optional input that you can name the `.webp` ([modern image format](https://developers.google.com/speed/webp#:~:text=WebP%20is%20a%20modern%20image,that%20make%20the%20web%20faster.)) file you want to download.
5. Click `Create GIF thumbnail` button to create and download the frame you wanted to snap<br>

   <figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FhWElzMsN8P36cRbf94fs%2Fimage.png?alt=media&amp;token=fb561a78-d62b-4d48-9421-d6e3ffd8aa9f" alt=""><figcaption></figcaption></figure>


# doryani

exile.watch automation


# Contributing

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

## Development

### 1. [Fork @exile-watch/doryani repo](https://github.com/exile-watch/doryani)

### 2. [Create GitHub PAT](/development/generating-github-pat)


# Actions


# Authenticate to GitHub Package Registry

Action designed to automate the authentication process with GitHub Package Registry

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

{% hint style="info" %}
This page covers [`auth-github-registry*`](https://github.com/exile-watch/doryani/blob/main/auth-github-registry/action.yml)  actions
{% endhint %}

## Usage

In `.github/workflows/auth-github-registry.yml` paste following snippet:

```yaml
name: "Auth to GitHub registry: @exile-watch / doryani"

on:
  push:
    branches:
      - main

jobs:
  auth-github-registry:
    runs-on: ubuntu-latest
    steps:
      - name: Authenticate to GitHub Registry
        uses: exile-watch/doryani/auth-github-registry@main
        with:
          GH_TOKEN: ${{ inputs.GH_TOKEN }}
```


# Install npm dependencies

Action designed to install NPM dependencies

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

{% hint style="info" %}
This page covers [`install-npm-dependencies*`](https://github.com/exile-watch/doryani/blob/main/install-npm-dependencies/action.yml) actions
{% endhint %}

## Usage

```
name: "Install deps: @exile-watch / doryani"

on:
  push:
    branches:
      - main

jobs:
  install-npm-dependencies:
    runs-on: ubuntu-latest
    name: Install NPM dependencies
    steps:
      - uses: exile-watch/doryani/install-npm-dependencies@main
        with:
          GH_TOKEN: ${{ secrets.GH_TOKEN }}
```


# Code quality assurance

Action designed to enforce Code Quality Assurance by automating checks for code formatting, linting, testing, and build verification

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

{% hint style="info" %}
This page covers [`code-quality-assurance*`](https://github.com/exile-watch/doryani/blob/main/code-quality-assurance/action.yml)  actions
{% endhint %}

## Usage

In `.github/workflows/code-quality-assurance.yml` paste following snippet:

```yaml
name: "Code quality assurance: @exile-watch / doryani"

on:
  push:
    branches:
      - main

jobs:
  code-quality-assurance:
    runs-on: ubuntu-latest
    steps:
      - name: Code quality assurance
        if: "!contains(github.event.head_commit.message, '[skip ci]')"
        uses: exile-watch/doryani/code-quality-assurance@main
        with:
          GH_TOKEN: ${{ secrets.GH_TOKEN }}
```


# Deploy webapp

Action designed to automate the deployment of web applications to Cloudflare Pages

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

{% hint style="info" %}
This page covers [`deploy-webapp*`](https://github.com/exile-watch/doryani/tree/main/deploy-webapp) actions
{% endhint %}

## Usage

In `.github/workflows/deploy-webapp.yml` paste following snippet:

```yaml
name: "Deploy: @exile-watch / doryani"

on:
  workflow_dispatch:

jobs:
  deploy-webapp:
    runs-on: ubuntu-latest
    steps:
      - name: Deploy Crucible to Cloudflare Pages
        uses: exile-watch/doryani/deploy-webapp@main
        with:
          CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
          PROJECT_NAME: "project_name"
          ENV: "production"
          GH_TOKEN: ${{ secrets.GH_TOKEN }}
```


# Publish package

Action designed to automate the process of publishing a Lerna package to a github npm registry

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

{% hint style="info" %}
This page covers [`publish-package*`](https://github.com/exile-watch/doryani/blob/main/publish-package/action.yml) actions
{% endhint %}

## Usage

1. Update `package.json` with following script:

```json
// {root}/package.json
{
  "release": "voidstone"
}
```

2. Update `publish-package.yaml` workflow:

```yaml
# {root}/.github/workflows/publish-package.yaml
name: "Publish package: @exile-watch / doryani"

on:
  push:
    paths:
      - 'packages/**'
      - '!packages/**/*.md'
    branches:
      - main

concurrency: ${{ github.workflow }}-${{ github.ref }}

permissions:
  contents: write
  pull-requests: write
  issues: write
  packages: write

jobs:
  code-quality-assurance:
    if: "!contains(github.event.head_commit.message, '[skip ci]')"
    runs-on: ubuntu-latest
    name: Code quality assurance
    steps:
      - uses: exile-watch/doryani/code-quality-assurance@main
        with:
          GH_TOKEN: ${{ secrets.GH_TOKEN }}

  publish-package:
    needs: [code-quality-assurance]
    name: Publish to NPM
    runs-on: ubuntu-latest
    steps:
      - name: Authenticate to GitHub Registry
        uses: exile-watch/doryani/auth-github-registry@main
        with:
          GH_TOKEN: ${{ secrets.GH_TOKEN }}

      - name: Install deps
        uses: exile-watch/doryani/install-npm-dependencies@main
        with:
          GH_TOKEN: ${{ secrets.GH_TOKEN }}

      - run: npm run release
        env:
          GH_TOKEN: ${{ secrets.GH_TOKEN }}
          NODE_AUTH_TOKEN: ${{ secrets.GH_TOKEN }}
          GITHUB_REPOSITORY: ${{ github.repository }}
```


# Preview publish package

Designed to automate the process of building and publishing a preview version of a exile.watch package to a GitHub NPM registry, enabling users to test and evaluate changes before the final release

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch</p></figcaption></figure>

{% hint style="info" %}
This page covers [`preview-publish-package*`](https://github.com/exile-watch/doryani/blob/main/preview-publish-package/action.yml)actions
{% endhint %}

## Usage

In `.github/workflows/preview-publish-package.yml` paste following snippet:

```yaml
name: "Preview publish: @exile-watch / doryani"

on:
  pull_request_target:
    types:
      - labeled

jobs:
  preview-publish-package:
    runs-on: ubuntu-latest
    if: contains(github.event.pull_request.labels.*.name, 'preview-publish')
    steps:
      - name: Checkout source code
        uses: actions/checkout@v4
        with:
          token: ${{ secrets.GH_TOKEN }}
          fetch-depth: 0
          ref: ${{ github.event.pull_request.head.ref }}

      - name: Preview publish package
        uses: exile-watch/doryani/preview-publish-package@main
        with:
          GH_ACTOR: ${{ github.actor }}
          GH_TOKEN: ${{ secrets.GH_TOKEN }}
          prRef: ${{ github.event.pull_request.head.ref }}
```

## Sub-actions

<table><thead><tr><th width="138" align="center">Action code</th><th width="234">Name</th><th></th></tr></thead><tbody><tr><td align="center"><a href="https://github.com/exile-watch/doryani/blob/main/preview-publish-package/00-create-status-comment/action.yml"><code>00</code></a></td><td>Create status comment</td><td>Creates status comment after <code>preview-publish</code> label is applied to the branch</td></tr><tr><td align="center"><a href="https://github.com/exile-watch/doryani/blob/main/preview-publish-package/01-publish-prerelease/action.yml"><code>01</code></a></td><td>Publish prerelease</td><td>Creates prerelease in <code>x.x.x-preview.x</code> format and publishes to github registry</td></tr><tr><td align="center"><a href="https://github.com/exile-watch/doryani/blob/main/preview-publish-package/02-update-status-comment-on-success/action.yml"><code>02</code></a></td><td>Update status comment on success</td><td>Once the package is published, this action updates the status comment created in <code>00</code></td></tr><tr><td align="center"><a href="https://github.com/exile-watch/doryani/blob/main/preview-publish-package/03-update-status-comment-on-failure/action.yml"><code>03</code></a></td><td>Update status comment on failure</td><td>If <code>00</code> or <code>01</code> action fails, this action updates the status created in <code>00</code></td></tr><tr><td align="center"><a href="https://github.com/exile-watch/doryani/blob/main/preview-publish-package/04-remove-preview-publish-label/action.yml"><code>04</code></a></td><td>Remove preview publish label</td><td>Removes <code>preview-publish</code> label from PR once <code>00</code> is completed</td></tr></tbody></table>


# Preview deploy webapp

Action designed to automate the process of building and deploying a preview version of a webapp to Cloudflare Pages, enabling users to test and evaluate changes before the final release

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch</p></figcaption></figure>

{% hint style="info" %}
This page covers [`preview-deploy-webapp*`](https://github.com/exile-watch/doryani/tree/main/preview-deploy-webapp)actions
{% endhint %}

## Usage

In `.github/workflows/preview-deploy-webapp.yml` paste following snippet:

```yaml
name: "Preview deploy: @exile-watch / doryani"

on:
  pull_request_target:
    types:
      - labeled

jobs:
  preview-deploy-webapp:
    runs-on: ubuntu-latest
    if: contains(github.event.pull_request.labels.*.name, 'preview-deploy')
    steps:
      - name: Preview deploy Crucible to Cloudflare Pages
        uses: exile-watch/doryani/preview-deploy-webapp@main
        with:
          CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
          PROJECT_NAME: "crucible"
          GH_TOKEN: ${{ secrets.GH_TOKEN }}
          GH_ACTOR: ${{ github.actor }}
          prRef: ${{ github.event.pull_request.head.ref }}
```

## Sub-actions

<table><thead><tr><th width="141" align="center">Action code</th><th width="215">Name</th><th></th></tr></thead><tbody><tr><td align="center"><a href="https://github.com/exile-watch/doryani/blob/main/preview-publish-package/00-create-status-comment/action.yml"><code>00</code></a></td><td>Create status comment</td><td>Creates status comment after <code>preview-deploy</code> label is applied to the branch</td></tr><tr><td align="center"><a href="https://github.com/exile-watch/doryani/blob/main/preview-publish-package/01-publish-prerelease/action.yml"><code>01</code></a></td><td>Preview deploy</td><td>Creates preview deploy at <code>https://{GIT_SHA}.crucible.dev</code></td></tr><tr><td align="center"><a href="https://github.com/exile-watch/doryani/blob/main/preview-publish-package/02-update-status-comment-on-success/action.yml"><code>02</code></a></td><td>Update status comment on success</td><td>Once the webapp is deployed, this action updates the status comment created in <code>00</code></td></tr><tr><td align="center"><a href="https://github.com/exile-watch/doryani/blob/main/preview-publish-package/03-update-status-comment-on-failure/action.yml"><code>03</code></a></td><td>Update status comment on failure</td><td>If <code>00</code> or <code>01</code> action fails, this action updates the status created in <code>00</code></td></tr><tr><td align="center"><a href="https://github.com/exile-watch/doryani/blob/main/preview-publish-package/04-remove-preview-publish-label/action.yml"><code>04</code></a></td><td>Remove preview publish deploy</td><td>Removes <code>preview-deploy</code> label from PR once <code>00</code> is completed</td></tr></tbody></table>


# voidstone

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

**Voidstone** upgrades your monorepo like Voidstones upgrade the Atlas.

***

In *Path of Exile*, [Voidstones](https://www.poewiki.net/wiki/Voidstone) transform and expand the Atlas, unlocking greater potential.\
Similarly, `@exile-watch/voidstone` empowers monorepos, managing versioning, releasing, and publishing.


# Contributing

@exile-watch/voidstone setup & contribution guide

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

## [Prerequisites](/development/prerequisites)

## Development

### 1. [Fork @exile-watch/voidstone repo](https://github.com/exile-watch/voidstone)

### 2. [Create GitHub PAT token](/development/generating-github-pat)

### 3. [Create .npmrc file](/development/.npmrc-file)&#x20;

### 4. Install dependencies

```bash
# project root
$: nvm use # uses node version that's defined in .nvmrc
$: npm i # install dependencies
```


# Commit message guidelines

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch</p></figcaption></figure>

{% hint style="danger" %}
Your contributions will be rejected if you won't follow this guideline.
{% endhint %}

## About

{% hint style="info" %}
We have very precise rules over how our git commit messages can be formatted.&#x20;

We use the git commit messages to **generate @exile-watch/{project} change logs via** [**@exile-watch/conventional-changelog-config**](https://github.com/exile-watch/splinters/pkgs/npm/conventional-changelog-config).

This also leads to **more readable messages** that are easy to follow when looking through the **project history**.&#x20;
{% endhint %}

```
<type>[optional scope]: <description>
```

The commit contains the following structural elements, to communicate intent to the consumers of our libraries:

1. **fix:** a commit of the *type* `fix` patches a bug in your codebase (this correlates with [`PATCH`](http://semver.org/#summary) in Semantic Versioning).
2. **feat:** a commit of the *type* `feat` introduces a new feature to the codebase (this correlates with [`MINOR`](http://semver.org/#summary) in Semantic Versioning).
3. **BREAKING CHANGE:** a commit that appends a `!` after the type/scope, introduces a breaking API change (correlating with [`MAJOR`](http://semver.org/#summary) in Semantic Versioning). A BREAKING CHANGE can be part of commits of any *type*.
4. other *types* that are supported:
   * `build:`&#x20;
   * `chore:`&#x20;
   * `ci:`
   * `docs:`&#x20;
   * `style:`
   * `refactor:`&#x20;
   * `perf:`&#x20;
   * `test:`

## Examples

tl;dr: [https://www.conventionalcommits.org/examples](https://www.conventionalcommits.org/en/v1.0.0/#examples)

### Commit message with scope <a href="#commit-message-with-scope" id="commit-message-with-scope"></a>

```
feat(lang): add Polish language
```

### Commit message with no scope <a href="#commit-message-with--to-draw-attention-to-breaking-change" id="commit-message-with--to-draw-attention-to-breaking-change"></a>

```
docs: update README.md
```

### Commit message with `!` to draw attention to breaking change <a href="#commit-message-with--to-draw-attention-to-breaking-change" id="commit-message-with--to-draw-attention-to-breaking-change"></a>

```
feat!: send an email to the customer when a product is shipped
```

## References

* [Conventional Commits specification](https://www.conventionalcommits.org/en/about/)
* [Angular convention](https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md)
* [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/master/%40commitlint/config-conventional)


# Prerequisites

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

1. [Commit message guidelines](/development/commit-message-guidelines)
2. [Node.js](https://nodejs.org/en) >= 20.x
3. [nvm](https://github.com/nvm-sh/nvm?tab=readme-ov-file#readme) (Node Version Manager)
4. `npm` is the package manager we are using


# Generating GitHub PAT

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

{% hint style="info" %}
`exile.watch` packages utilize the `GitHub NPM registry`.

Working with the `GitHub NPM registry` requires tokens with `read` permission. Therefore, a `PAT` is needed, even if you only wish to access public repositories (a.k.a. public packages)
{% endhint %}

Instructions for generating a `GitHub PAT` (Personal Access Token) can be found [here](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-fine-grained-personal-access-token).

Apart from naming your token, no additional modifications are necessary on your part.

Ensure that `Repository access` includes `Public Repositories (read-only)` checked.


# .npmrc file

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

As mentioned in [Generating GitHub PAT](/development/generating-github-pat), in order to use your generated PAT you have to create `.npmrc` file in project's `root` directory.

If you have already generated PAT and have created `.npmrc` file in one project, you can copy the file to other projects

## 1. Create .npmrc file

```bash
$: cd ./crucible
$: touch .npmrc # make .npmrc file in root
```

## 2. Update .npmrc file content

{% hint style="info" %}
.npmrc is in `.gitignore` by default
{% endhint %}

```bash
# .npmrc
//npm.pkg.github.com/:_authToken=PAT_TOKEN_HERE
@exile-watch:registry=https://npm.pkg.github.com/
```


# Dependencies

All exile.watch packages

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

{% @lucid/lucid-component url="<https://lucid.app/lucidchart/61af2682-193e-4b79-85be-f439fc70fb94/view?page=0_0>" %}

## [hideout](https://github.com/exile-watch/hideout)

### [Announcements](https://github.com/exile-watch/hideout/discussions/categories/announcements)

### [Discussions](https://github.com/exile-watch/hideout/discussions)

### [Feature requests](https://github.com/exile-watch/hideout/discussions/categories/ideas)

### [Issues](https://github.com/exile-watch/hideout/issues)

***

## [malachai](https://github.com/exile-watch/malachai)

### [@exile-watch/snap-gyazo-thumbnail](https://github.com/exile-watch/malachai/pkgs/npm/snap-gyazo-thumbnail)

***

## [crucible](https://github.com/exile-watch/crucible)

### <https://engineering.exile.watch/>

### <https://docs.exile.watch/>

### <https://www.exile.watch/>

***

## [writ](https://github.com/exile-watch/writ)

### [@exile-watch/writ-icons](https://github.com/exile-watch/writ/pkgs/npm/writ-icons)

### [@exile-watch/writ-react](https://github.com/exile-watch/writ/pkgs/npm/writ-react)

***

## [splinters](https://github.com/exile-watch/splinters)

### [@exile-watch/vite-config](https://github.com/exile-watch/splinters/pkgs/npm/vite-config)

### [@exile-watch/biome-config](https://github.com/exile-watch/splinters/pkgs/npm/biome-config)

### [@exile-watch/typescript-config](https://github.com/exile-watch/splinters/pkgs/npm/typescript-config)

### [@exile-watch/unit-testing-config](https://github.com/exile-watch/splinters/pkgs/npm/unit-testing-config)

### [@exile-watch/lefthook-config](https://github.com/exile-watch/splinters/pkgs/npm/lefthook-config)

***

## [nucleus](https://github.com/exile-watch/nucleus)

### [@exile-watch/encounter-data](https://github.com/exile-watch/nucleus/pkgs/npm/encounter-data)

### [@exile-watch/seo](https://github.com/exile-watch/nucleus/pkgs/npm/seo)

***

## [voidstone](/voidstone)

### [@exile-watch/voidstone](https://github.com/exile-watch/voidstone/pkgs/npm/voidstone)

***

## [doryani](https://github.com/exile-watch/doryani)


# Tech stack

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

| Dependency                                           | Version | About/role                                                                                                      |
| ---------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------- |
| [React](https://react.dev/)                          | 18.x    | Library for web ui                                                                                              |
| [Next.js](https://nextjs.org/)                       | 14.x    | React framework                                                                                                 |
| [TypeScript](https://www.typescriptlang.org/)        | 5.x     | Typing                                                                                                          |
| [Sass (scss)](https://sass-lang.com/)                | latest  | Styling (css extension)                                                                                         |
| [Mantine UI](https://mantine.dev/) (EOL)             | 7.x     | Reusable React components and hooks                                                                             |
| [yaml](https://en.wikipedia.org/wiki/YAML)           | latest  | Human-readable data serialization language used to define PoE encounter data                                    |
| [Rollup.js](https://rollupjs.org/) (EOL)             | 2.x     | JavaScript module bundler used to compile exile.watch internal packages                                         |
| [Lerna](https://lerna.js.org/) (EOL)                 | 8.x     | Build system for managing and publishing packages from the same repository                                      |
| [nx](https://nx.dev/)                                | 20.x    | Monorepo scaling and maintainability                                                                            |
| [lefthook](https://github.com/evilmartians/lefthook) | 1.x     | A Git hooks manager for Node.js, Ruby and many other types of projects                                          |
| [plasmo](https://docs.plasmo.com/)                   | 0.80.x  | All-in-one platform that makes it easy for browser extension developers to create, test, and publish extensions |
| voidstone                                            | 1.x     | Monorepo package versioning and publishing                                                                      |


# Adoption chart

Visual guide highlighting the widespread use and impact of exile.watch build tools and automation processes across it's projects

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

Chart Legend:

<table><thead><tr><th width="107" align="center">status</th><th>description</th></tr></thead><tbody><tr><td align="center">✅</td><td>Implemented</td></tr><tr><td align="center">❌</td><td>Not yet implemented for whatever reason (most likely not enough hands)</td></tr><tr><td align="center">N/A</td><td>Not applicable - implementation will never apply to this project/package</td></tr></tbody></table>

Below is an informative chart to see which build tools created in [splinters](/projects/splinters) project are implemented in exile.watch projects.

<table><thead><tr><th width="138" align="center"> </th><th width="100" align="center">crucible</th><th width="80" align="center">writ</th><th width="99" align="center">splinters</th><th width="99" align="center">nucleus</th><th width="108" align="center">malachai</th><th align="center">doryani</th></tr></thead><tbody><tr><td align="center">lefthook</td><td align="center">✅</td><td align="center">✅</td><td align="center">✅</td><td align="center">✅</td><td align="center">✅</td><td align="center">✅</td></tr><tr><td align="center">biome</td><td align="center">✅</td><td align="center">✅</td><td align="center">✅</td><td align="center">✅</td><td align="center">❌</td><td align="center">✅</td></tr><tr><td align="center">typescript</td><td align="center">✅</td><td align="center">✅</td><td align="center">✅</td><td align="center">✅</td><td align="center">✅</td><td align="center">N/A</td></tr><tr><td align="center">unit tests</td><td align="center">✅</td><td align="center">❌</td><td align="center">❌</td><td align="center">❌</td><td align="center">❌</td><td align="center">N/A</td></tr><tr><td align="center">e2e tests</td><td align="center">❌</td><td align="center">N/A</td><td align="center">N/A</td><td align="center">N/A</td><td align="center">N/A</td><td align="center">N/A</td></tr><tr><td align="center">nx</td><td align="center">✅</td><td align="center">❌</td><td align="center">✅</td><td align="center">✅</td><td align="center">❌</td><td align="center">❌</td></tr><tr><td align="center">dependabot</td><td align="center">✅</td><td align="center">✅</td><td align="center">✅</td><td align="center">✅</td><td align="center">❌</td><td align="center">✅</td></tr><tr><td align="center">voidstone</td><td align="center">N/A</td><td align="center">❌</td><td align="center">✅</td><td align="center">✅</td><td align="center">❌</td><td align="center">N/A</td></tr></tbody></table>


# GHA workflows web

Visual map detailing how various @exile-watch/doryani actions interconnect and depend on each other within a specific workflow

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

## Actions

You can read more about what each action does here: [Actions](/projects/doryani/actions)

All actions lay in [@exile-watch/doryani](https://github.com/exile-watch/doryani) repo.

## Chart

{% @lucid/lucid-component url="<https://lucid.app/lucidchart/bd936457-484e-4b6a-a220-269fa0994886/view?invitationId=inv_1a3a17b8-118a-4e5d-a002-cf20cba59b24&page=0_0>" %}


# License - FSL, Apache 2.0

## Functional Source License, Version 1.1, Apache 2.0 Future License

### Abbreviation

[FSL-1.1-Apache-2.0](https://fsl.software/)

### Notice

Copyright 2024 exile.watch

### Terms and Conditions

#### Licensor ("We")

The party offering the Software under these Terms and Conditions.

#### The Software

The "Software" is each version of the software that we make available under these Terms and Conditions, as indicated by our inclusion of these Terms and Conditions with the Software.

#### License Grant

Subject to your compliance with this License Grant and the Patents, Redistribution and Trademark clauses below, we hereby grant you the right to use, copy, modify, create derivative works, publicly perform, publicly display and redistribute the Software for any Permitted Purpose identified below.

#### Permitted Purpose

A Permitted Purpose is any purpose other than a Competing Use. A Competing Use means making the Software available to others in a commercial product or service that:

1. substitutes for the Software;
2. substitutes for any other product or service we offer using the Software that exists as of the date we make the Software available; or
3. offers the same or substantially similar functionality as the Software.

Permitted Purposes specifically include using the Software:

1. for your internal use and access;
2. for non-commercial education;
3. for non-commercial research; and
4. in connection with professional services that you provide to a licensee using the Software in accordance with these Terms and Conditions.

#### Patents

To the extent your use for a Permitted Purpose would necessarily infringe our patents, the license grant above includes a license under our patents. If you make a claim against any party that the Software infringes or contributes to the infringement of any patent, then your patent license to the Software ends immediately.

#### Redistribution

The Terms and Conditions apply to all copies, modifications and derivatives of the Software.

If you redistribute any copies, modifications or derivatives of the Software, you must include a copy of or a link to these Terms and Conditions and not remove any copyright notices provided in or with the Software.

#### Disclaimer

THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, TITLE OR NON-INFRINGEMENT.

IN NO EVENT WILL WE HAVE ANY LIABILITY TO YOU ARISING OUT OF OR RELATED TO THE SOFTWARE, INCLUDING INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES, EVEN IF WE HAVE BEEN INFORMED OF THEIR POSSIBILITY IN ADVANCE.

#### Trademarks

Except for displaying the License Details and identifying us as the origin of the Software, you have no right under these Terms and Conditions to use our trademarks, trade names, service marks or product names.

### Grant of Future License

We hereby irrevocably grant you an additional license to use the Software under the Apache License, Version 2.0 that is effective on the second anniversary of the date we make the Software available. On or after that date, you may use the Software under the Apache License, Version 2.0, in which case the following will apply:

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.

You may obtain a copy of the License at

[http://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.


# Non-Affiliation Notice

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

[*exile.watch*](https://exile.watch) is not affiliated with, endorsed, sponsored, or specifically approved by [*Grinding Gear Games*](https://www.grindinggear.com/) (GGG), a New Zealand-based video game developer company, and *Grinding Gear Games* is not responsible for it.&#x20;

All trademarks and copyrights on this website are property of their respective owners. Use of these names, trademarks, and brands does not imply endorsement.


# Code of Conduct

TL;DR - Don't judge others, be nice and treat others the way you want to be treated

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

### Our Pledge <a href="#our-pledge" id="our-pledge"></a>

We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

### Our Standards <a href="#our-standards" id="our-standards"></a>

Examples of behavior that contributes to a positive environment for our community include:

* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
* Focusing on what is best not just for us as individuals, but for the overall community

Examples of unacceptable behavior include:

* The use of sexualized language or imagery, and sexual attention or advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others’ private information, such as a physical or email address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting

### Enforcement Responsibilities <a href="#enforcement-responsibilities" id="enforcement-responsibilities"></a>

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

### Scope <a href="#scope" id="scope"></a>

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official email address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

### Enforcement <a href="#enforcement" id="enforcement"></a>

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement \<TBD discord server>. All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

### Enforcement Guidelines <a href="#enforcement-guidelines" id="enforcement-guidelines"></a>

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

#### 1. Correction <a href="#id-1-correction" id="id-1-correction"></a>

**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

#### 2. Warning <a href="#id-2-warning" id="id-2-warning"></a>

**Community Impact**: A violation through a single incident or series of actions.

**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

#### 3. Temporary Ban <a href="#id-3-temporary-ban" id="id-3-temporary-ban"></a>

**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.

**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

#### 4. Permanent Ban <a href="#id-4-permanent-ban" id="id-4-permanent-ban"></a>

**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

**Consequence**: A permanent ban from any sort of public interaction within the community.

### Attribution <a href="#attribution" id="attribution"></a>

This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/), version 2.1, available at <https://www.contributor-covenant.org/version/2/1/code_of_conduct.html>.

Community Impact Guidelines were inspired by [Mozilla’s code of conduct enforcement ladder](https://github.com/mozilla/diversity).

For answers to common questions about this code of conduct, see the FAQ at <https://www.contributor-covenant.org/faq>. Translations are available at <https://www.contributor-covenant.org/translations>.

<br>


# Privacy Policy

<figure><img src="https://694473604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzA1rSlMPE3i2X5tlqgu%2Fuploads%2FZCdzczA729HO2CsFnhUE%2Fimage.png?alt=media&amp;token=3373666c-de2d-4ae5-985d-8c0be1fbeadd" alt="" width="200"><figcaption><p>exile.watch logo</p></figcaption></figure>

## **Privacy Policy**

[exile.watch](https://github.com/exile-watch) built the [exile.watch](https://www.exile.watch/) app as an Open Source app. This SERVICE is provided by exile.watch at no cost and is intended for use as is.

This page is used to inform visitors regarding our policies with the collection, use, and disclosure of Personal Information if anyone decided to use our Service.

If you choose to use our Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that we collect is used for providing and improving the Service. We will not use or share your information with anyone except as described in this Privacy Policy.

The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which are accessible at exile.watch unless otherwise defined in this Privacy Policy.

**Information Collection and Use**

For a better experience, while using our Service, we may require you to provide us with certain personally identifiable information, including but not limited to Internet Protocol (IP) address, Media access control (MAC), Cookies, Geolocation . The information that we request will be retained by us and used as described in this privacy policy.

The app does use third-party services that may collect information used to identify you.

Link to the privacy policy of third-party service providers used by the app

* [Sentry](https://sentry.io/privacy/)
* [Cloudflare](https://www.cloudflare.com/privacypolicy/)

## **Log Data**

We want to inform you that whenever you use our Service, in a case of an error in the app we collect data and information (through third-party products) on your phone called Log Data. This Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing our Service, the time and date of your use of the Service, and other statistics.

## **Cookies**

Cookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device's internal memory.

This Service does not use these “cookies” explicitly. However, the app may use third-party code and libraries that use “cookies” to collect information and improve their services. You have the option to either accept or refuse these cookies and know when a cookie is being sent to your device. If you choose to refuse our cookies, you may not be able to use some portions of this Service.

## **Service Providers**

We may employ third-party companies and individuals due to the following reasons:

* To facilitate our Service;
* To provide the Service on our behalf;
* To perform Service-related services; or
* To assist us in analyzing how our Service is used.

We want to inform users of this Service that these third parties have access to their Personal Information. The reason is to perform the tasks assigned to them on our behalf. However, they are obligated not to disclose or use the information for any other purpose.

## **Security**

We value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, and we cannot guarantee its absolute security.

## **Links to Other Sites**

This Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by us. Therefore, we strongly advise you to review the Privacy Policy of these websites. We have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services.

## **Children’s Privacy**

These Services do not address anyone under the age of 13. We do not knowingly collect personally identifiable information from children under 13 years of age. In the case we discover that a child under 13 has provided us with personal information, we immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact us so that we will be able to do the necessary actions.

## **Changes to This Privacy Policy**

We may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. We will notify you of any changes by posting the new Privacy Policy on this page.

This policy is effective as of 2024-03-01

## **Contact Us**

If you have any questions or suggestions about our Privacy Policy, do not hesitate to contact us at <https://github.com/exile-watch/hideout/discussions> or <https://discord.com/invite/U3kXS4ej>.


