Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@ name: Deploy to Cloudflare Pages
on:
push:
branches: [main]
workflow_dispatch:

jobs:
deploy:
if: vars.PRODUCTION_RELEASE_GUARD_CONFIGURED == 'true'
runs-on: ubuntu-latest
timeout-minutes: 20
environment:
name: production
url: https://exilecrafter.com
concurrency:
group: pages-${{ github.ref }}
cancel-in-progress: false
Expand All @@ -25,11 +28,8 @@ jobs:
- name: Install
run: npm ci --no-audit --no-fund

- name: Refresh poe2db data
run: npm run refresh

- name: Build static site
run: npm run build
- name: Verify approved source and build static site
run: npm run check

- name: Publish to Cloudflare Pages
uses: cloudflare/pages-action@v1
Expand Down
25 changes: 25 additions & 0 deletions .github/workflows/quality.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Quality

on:
pull_request:
workflow_dispatch:

jobs:
check:
runs-on: ubuntu-latest
timeout-minutes: 20
permissions:
contents: read
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm

- name: Install
run: npm ci --no-audit --no-fund

- name: Build and verify
run: npm run check
23 changes: 17 additions & 6 deletions .github/workflows/refresh.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@ on:
schedule:
# Every Sunday at 06:00 UTC (after typical GGG patch windows)
- cron: '0 6 * * 0'
workflow_dispatch: # allow manual trigger

jobs:
refresh:
runs-on: ubuntu-latest
timeout-minutes: 20
permissions:
contents: write
pull-requests: write
steps:
- uses: actions/checkout@v4

Expand All @@ -23,17 +25,26 @@ jobs:
- name: Refresh poe2db data
run: npm run refresh

- name: Build site
run: npm run build
- name: Verify refreshed data and build site
run: npm run check

- name: Commit updated data
- name: Propose updated data for review
env:
GH_TOKEN: ${{ github.token }}
run: |
git config user.name "craftclass-bot"
git config user.email "craftclass-bot@users.noreply.github.com"
git add data/processed/
git add data/processed/ public/data/ public/images/
if git diff --staged --quiet; then
echo "No data changes to commit."
else
branch="automation/poe2db-refresh-${GITHUB_RUN_ID}"
git switch -c "$branch"
git commit -m "chore(data): weekly poe2db refresh"
git push
git push origin "$branch"
gh pr create \
--base main \
--head "$branch" \
--title "chore(data): weekly poe2db refresh" \
--body "Automated poe2db refresh. The complete build, SEO verifier, and simulator e2e test passed before this review request was opened."
fi
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ node_modules/
# Build output
dist/
dist.zip
.seo-cache/

# Astro/Vite cache (auto-generated, safe to delete)
.astro/
Expand Down Expand Up @@ -52,4 +53,4 @@ _*.txt

# Build-time prices (replaced by live CF Pages Function at /api/prices)
data/processed/prices.json
public/data/prices.json
public/data/prices.json
16 changes: 9 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
# Exile Crafter

A visual crafting companion for **Path of Exile 2**. Browse every base, modifier, currency, and omen, then run live crafting simulations with keyboard shortcuts, in-game style item tooltips, and probability calculations.
A visual crafting companion for **Path of Exile 2**. Browse base, modifier, currency, and omen reference data, then run live crafting simulations with keyboard shortcuts, in-game style item tooltips, and probability calculations.

Hosted at [exilecrafter.com](https://exilecrafter.com). Built as a fully static site for [Cloudflare Pages](https://pages.cloudflare.com/). Zero server runtime.

## Features

- **368 base items** across 17 equipment slots (helmets, body armours, gloves, boots, belts, amulets, rings, shields, weapons, foci, quivers, waystones, jewels, tablets, relics, charms, flasks) — each with stat attributes and affix slot counts
- **97 modifiers** with tier, level gate, tag classification, and stat ranges scraped from poe2db
- **135 currency items** — all standard orbs (lesser/normal/greater/perfect tiers), essences (all 4 tiers × 14 families), liquid emotions, catalysts, desecration bones, alloys, breachstones — all with real poe2db icons
- **1,690 base items** across 17 equipment slots (helmets, body armours, gloves, boots, belts, amulets, rings, shields, weapons, foci, quivers, waystones, jewels, tablets, relics, charms, flasks) — each with stat attributes and affix slot counts
- **2,064 modifiers** with tier, level gate, tag classification, and stat ranges scraped from poe2db
- **200 currency items** — all standard orbs (lesser/normal/greater/perfect tiers), essences (all 4 tiers × 14 families), liquid emotions, catalysts, desecration bones, alloys, breachstones — all with real poe2db icons
- **50 omens** with effect descriptions, grouped by category (Alchemy, Exaltation, Annulment, Coronation, Erasure, etc.)
- **Interactive Simulator** with keyboard shortcuts (`T` Transmute, `A` Alchemy, `R` Regal, `E` Exalt, `X` Annul, `C` Chaos, `D` Divine, `Z` Undo), only-valid-currency display, omen toggles via popover, full activity log, mod pool summary, cost tracking
- **Probability Calculator** using a Web Worker for mod pool math (UI never freezes)
- **Paste Import** — copy an item from PoE2 (Ctrl+C) and paste it into the simulator to load its exact state, including implicit, prefix, suffix, desecrated, and crafted mods
- **In-game style item tooltip** — rarity-colored name, tier indicators (111/11/1), mod tags colored by damage type, gold separators, implicit/prefix/suffix sections
- **Crafting guides** — 7 curated step-by-step paths for common goals
- **Crafting guides** — 8 curated step-by-step paths for common goals
- **i18n-ready** — easy to add languages by dropping a JSON file

## Quick start
Expand All @@ -25,6 +25,8 @@ npm run refresh # scrape poe2db.tw, produce data/processed/*.json
npm run weights # optional: bake in community weight data
npm run dev # local dev server at http://localhost:4321
npm run build # static build → dist/
npm run seo:audit # machine-readable rendered SEO snapshot
npm run check # build + deterministic SEO validation
npm run preview # preview the built site
npm run e2e # end-to-end paste import test
```
Expand Down Expand Up @@ -122,7 +124,7 @@ CRAFTCLASS_WEIGHTS_URL=https://example.com/poe2-weights.json npm run weights

## Tech

- **Astro 5** — static site generator with island architecture
- **Astro 7** — static site generator with island architecture
- **Tailwind 4** (via Vite plugin)
- **TypeScript** strict
- **Cheerio** for HTML parsing in build scripts
Expand All @@ -142,4 +144,4 @@ Exile Crafter is an unofficial fan tool and is not affiliated with or endorsed b

## License

MIT — see [LICENSE](./LICENSE).
MIT — see [LICENSE](./LICENSE).
8 changes: 6 additions & 2 deletions astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,18 @@ import tailwindcss from '@tailwindcss/vite';
export default defineConfig({
site: 'https://exilecrafter.com',
output: 'static',
trailingSlash: 'ignore',
trailingSlash: 'always',
vite: {
plugins: [tailwindcss()],
worker: {
format: 'es',
},
},
integrations: [sitemap()],
integrations: [
sitemap({
filter: (page) => page !== 'https://exilecrafter.com/optimizer/',
}),
],
server: {
port: 4321,
},
Expand Down
Loading