diff --git a/.gitattributes b/.gitattributes
index d321d7bc..b5ae37b3 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,15 +1,33 @@
-*.db filter=lfs diff=lfs merge=lfs -text
-*.exe filter=lfs diff=lfs merge=lfs -text
-*.gif filter=lfs diff=lfs merge=lfs -text
-*.jpg filter=lfs diff=lfs merge=lfs -text
-*.png filter=lfs diff=lfs merge=lfs -text
-*.PNG filter=lfs diff=lfs merge=lfs -text
-*.mp3 filter=lfs diff=lfs merge=lfs -text
-*.ogg filter=lfs diff=lfs merge=lfs -text
-*.osk filter=lfs diff=lfs merge=lfs -text
-*.osr filter=lfs diff=lfs merge=lfs -text
-*.osz filter=lfs diff=lfs merge=lfs -text
+*.db filter=lfs diff=lfs merge=lfs -text
+*.exe filter=lfs diff=lfs merge=lfs -text
+*.gif filter=lfs diff=lfs merge=lfs -text
+*.jpg filter=lfs diff=lfs merge=lfs -text
+*.JPG filter=lfs diff=lfs merge=lfs -text
+*.png filter=lfs diff=lfs merge=lfs -text
+*.PNG filter=lfs diff=lfs merge=lfs -text
+*.pnG filter=lfs diff=lfs merge=lfs -text
+*.jpeg filter=lfs diff=lfs merge=lfs -text
+*.webp filter=lfs diff=lfs merge=lfs -text
+*.psd filter=lfs diff=lfs merge=lfs -text
+*.xcf filter=lfs diff=lfs merge=lfs -text
+*.pxr filter=lfs diff=lfs merge=lfs -text
+*.mp3 filter=lfs diff=lfs merge=lfs -text
+*.ogg filter=lfs diff=lfs merge=lfs -text
+*.wav filter=lfs diff=lfs merge=lfs -text
+*.WAV filter=lfs diff=lfs merge=lfs -text
+*.wav123321321 filter=lfs diff=lfs merge=lfs -text
+*.sfk filter=lfs diff=lfs merge=lfs -text
+*.zip filter=lfs diff=lfs merge=lfs -text
+*.rar filter=lfs diff=lfs merge=lfs -text
+*.ttf filter=lfs diff=lfs merge=lfs -text
+*.otf filter=lfs diff=lfs merge=lfs -text
+*.lnk filter=lfs diff=lfs merge=lfs -text
+*.pk filter=lfs diff=lfs merge=lfs -text
+*.fig filter=lfs diff=lfs merge=lfs -text
+*.fds filter=lfs diff=lfs merge=lfs -text
+*.pdn filter=lfs diff=lfs merge=lfs -text
+*.osk filter=lfs diff=lfs merge=lfs -text
+*.osr filter=lfs diff=lfs merge=lfs -text
+*.osz filter=lfs diff=lfs merge=lfs -text
*.pack filter=lfs diff=lfs merge=lfs -text
-*.pdn filter=lfs diff=lfs merge=lfs -text
-*.wav filter=lfs diff=lfs merge=lfs -text
-*.WAV filter=lfs diff=lfs merge=lfs -text
+*.mp4 filter=lfs diff=lfs merge=lfs -text
diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml
index d640a221..4742f490 100644
--- a/.gitea/workflows/ci.yml
+++ b/.gitea/workflows/ci.yml
@@ -1,4 +1,4 @@
-name: CI/CD Pipeline
+name: Generate Skin previews, OSK files and per skin documentation
on:
push:
@@ -23,14 +23,16 @@ env:
DANSER_SCREENSHOT_DIR: "/app/danser/screenshots"
SKINS_DIR: "${{ github.workspace }}/Skins"
DANSER_SKINS_DIR: "/app/danser/skins"
- DEFAULT_SKIN_DIR: "${{ github.workspace }}/src/default-skin"
+ DEFAULT_SKIN_DIR: "/app/danser/skins/default-skin"
REPO_SCREENSHOT_DIR: "${{ github.workspace }}/media/gameplay"
REPO_MOD_ICONS_DIR: "${{ github.workspace }}/media/icons"
REPO_RANKING_PANEL_DIR: "${{ github.workspace }}/media/panel"
REPO_THUMBNAIL_DIR: "${{ github.workspace }}/media/thumbnail"
SETTINGS_JSON_PATH: "/app/danser/settings/default.json"
README_PATH: "${{ github.workspace }}/README.md"
- REPLAY_PATH: "${{ github.workspace }}/src/replay.osr"
+ GAMEPLAY_REPLAY_PATH: "/app/danser/custom-replays/yomi_yori.osr"
+ THUMBNAIL_REPLAY_PATH: "/app/danser/custom-replays/combo_colors.osr"
+ PANEL_REPLAY_PATH: "/app/danser/custom-replays/2000_gekis.osr"
OSK_PATH: "${{ github.workspace }}/export"
IMAGE_NAME: osc/skins-image
REGISTRY_URL: "https://${{ vars.CONTAINER_REGISTRY }}"
@@ -40,7 +42,7 @@ env:
jobs:
generate_everything:
name: Full CI/CD Pipeline
- runs-on: ubuntu-latest
+ runs-on: danser
container:
image: ${{ vars.CONTAINER_REGISTRY }}/${{ env.IMAGE_NAME }}:latest
options: >-
@@ -170,7 +172,6 @@ jobs:
echo ""
echo "[Detect Changed Skin Directories Complete — ${#uniq_skins[@]} skins processed, ${#deleted_skins[@]} skins deleted]"
-
- name: Pull Git LFS objects for changed skins (and core assets)
shell: bash
run: |
@@ -291,7 +292,7 @@ jobs:
echo " → Generating video..."
if ! xvfb-run -a "$DANSER_DIR/danser-cli" \
- -replay "$REPLAY_PATH" -record -skip -start=215 -end=230 -noupdatecheck \
+ -replay "$GAMEPLAY_REPLAY_PATH" -record -skip -start=300 -end=307 -noupdatecheck \
-out="$SKIN_NAME" -skin="$SKIN_NAME" >"$LOGFILE" 2>&1; then
echo " ✖ Video failed for $SKIN_NAME"; cat "$LOGFILE"; INDEX=$((INDEX+1)); continue
fi
@@ -299,9 +300,10 @@ jobs:
if [ -f "$DANSER_VIDEO_DIR/$SKIN_NAME.mp4" ]; then
echo " → Trimming MP4 with ffmpeg..."
ffmpeg -hide_banner -loglevel error \
+ -ss 5 -t 6.5 \
-i "$DANSER_VIDEO_DIR/$SKIN_NAME.mp4" \
- -ss 5 -t 10 \
- -c:v h264_nvenc -preset fast -c:a aac -b:a 128k \
+ -c:v h264_nvenc -preset fast \
+ -c:a aac -b:a 128k \
"$DANSER_VIDEO_DIR/${SKIN_NAME}_trimmed.mp4"
if [ -f "$DANSER_VIDEO_DIR/${SKIN_NAME}_trimmed.mp4" ]; then
@@ -318,7 +320,7 @@ jobs:
echo " → Taking screenshot..."
if ! xvfb-run -a "$DANSER_DIR/danser-cli" \
- -replay "$REPLAY_PATH" -skip -noupdatecheck -ss 243 \
+ -replay "$PANEL_REPLAY_PATH" -skip -noupdatecheck -ss 28 \
-out="$SKIN_NAME" -skin="$SKIN_NAME" >>"$LOGFILE" 2>&1; then
echo " ✖ Screenshot failed for $SKIN_NAME"; cat "$LOGFILE"; INDEX=$((INDEX+1)); continue
fi
@@ -333,7 +335,7 @@ jobs:
echo " → Taking thumbnail screenshot..."
if ! xvfb-run -a "$DANSER_DIR/danser-cli" \
- -replay "$REPLAY_PATH" -skip -noupdatecheck -ss 220 \
+ -replay "$THUMBNAIL_REPLAY_PATH" -skip -noupdatecheck -ss 1.3 \
-out="${SKIN_NAME}_thumb" -skin="$SKIN_NAME" >>"$LOGFILE" 2>&1; then
echo " ✖ Thumbnail screenshot failed for $SKIN_NAME"; cat "$LOGFILE"; INDEX=$((INDEX+1)); continue
fi
@@ -491,15 +493,22 @@ jobs:
for group_list in "$group1_icons" "$group2_icons" "$group3_icons"; do
montage_files=()
for icon in $group_list; do
+ file=""
if [ -f "${ICON_FOLDER}/selection-mod-${icon}@2x.png" ]; then
- montage_files+=("${ICON_FOLDER}/selection-mod-${icon}@2x.png")
+ file="${ICON_FOLDER}/selection-mod-${icon}@2x.png"
+ elif [ -f "${ICON_FOLDER}/selection-mod-${icon}.png" ]; then
+ file="${ICON_FOLDER}/selection-mod-${icon}.png"
elif [ -f "${DEFAULT_SKIN_DIR}/selection-mod-${icon}@2x.png" ]; then
- montage_files+=("${DEFAULT_SKIN_DIR}/selection-mod-${icon}@2x.png")
+ file="${DEFAULT_SKIN_DIR}/selection-mod-${icon}@2x.png"
fi
+
+ [ -n "$file" ] && montage_files+=("$file")
done
+
while [ "${#montage_files[@]}" -lt 7 ]; do
montage_files+=("$BLANK_IMAGE")
done
+
magick montage "${montage_files[@]}" \
-tile "7x1" -geometry "160x160+10+10" -background none \
"row_${row_index}.png"
@@ -626,8 +635,7 @@ jobs:
sanitize_filename() {
echo "$1" | \
tr -d '\000-\037' | \
- sed -e 's#[\\/:\*\?"<>|]#-#g' | \
- sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'
+ sed -e 's#[\\/:\*\?"<>|]#-#g' -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'
}
url_encode_path() {
@@ -643,6 +651,7 @@ jobs:
SKINS_JSON_FILE="${{ github.workspace }}/.gitea/workflows/skins.json"
DESC_FILE=$(mktemp)
+
echo "---" > "$README_PATH"
echo "gitea: none" >> "$README_PATH"
echo "include_toc: true" >> "$README_PATH"
@@ -663,25 +672,30 @@ jobs:
jq -r '.order[]?' "$SKINS_JSON_FILE" > order.txt
get_desc() {
- grep -F -m1 -- "$1=" "$DESC_FILE" 2>/dev/null | cut -d '=' -f2-
+ grep -F -m1 -- "$1=" "$DESC_FILE" 2>/dev/null | cut -d '=' -f2- || true
}
declare -A ordered
while IFS= read -r skin; do
+ [ "$skin" = "default-skin" ] && continue
ordered["$skin"]=1
dir="$DANSER_SKINS_DIR/$skin"
[ ! -d "$dir" ] && continue
- ini_file=$(find "$dir" -maxdepth 1 -iname "skin.ini" | head -n1)
+
+ ini_file=$(find "$dir" -maxdepth 1 -iname "skin.ini" | head -n1 || true)
skin_header="$skin"
+
if [ -f "$ini_file" ]; then
- line=$(grep -i '^[[:space:]]*Name:' "$ini_file" | head -n1)
- if [ -n "$line" ]; then
- val="${line#*:}"
+ name_line=$(grep -a -i -m1 'Name[[:space:]]*:' "$ini_file" || true)
+ if [ -n "$name_line" ]; then
+ val="${name_line#*:}"
val="$(echo "$val" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
- if [ -n "$val" ]; then
- skin_header=$(sanitize_filename "$val")
- fi
+ [ -n "$val" ] && skin_header=$(sanitize_filename "$val")
+ else
+ skin_header=$(sanitize_filename "$skin")
fi
+ else
+ continue
fi
raw_path="$(printf "%s/%s" "$skin" "$skin_header" | sed 's/^ *//;s/ *$//')"
@@ -693,28 +707,38 @@ jobs:
desc=$(get_desc "$skin")
[ -n "$desc" ] && { echo "$desc" >> "$README_PATH"; echo "" >> "$README_PATH"; }
+ if [ -f "$ini_file" ]; then
+ author_line=$(grep -i '^[[:space:]]*Author:' "$ini_file" | head -n1 || true)
+ if [ -n "$author_line" ]; then
+ author=$(echo "$author_line" | cut -d ':' -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
+ [ -n "$author" ] && { echo "**Author:** $author" >> "$README_PATH"; echo "" >> "$README_PATH"; }
+ fi
+ fi
+
echo "[](/docs/${base_path}.md)" >> "$README_PATH"
echo "" >> "$README_PATH"
done < order.txt
- echo "Adding extra skins not in order.json..."
-
for dir in "$DANSER_SKINS_DIR"/*; do
[ -d "$dir" ] || continue
- skin=$(basename "$dir")
+ skin="$(basename "$dir")"
+ [ "$skin" = "default-skin" ] && continue
[[ -n "${ordered[$skin]}" ]] && continue
ini_file=$(find "$dir" -maxdepth 1 -iname "skin.ini" | head -n1 || true)
skin_header="$skin"
+
if [ -f "$ini_file" ]; then
- line=$(grep -i '^[[:space:]]*Name:' "$ini_file" | head -n1 || true)
- if [ -n "$line" ]; then
- val="${line#*:}"
+ name_line=$(grep -a -i -m1 'Name[[:space:]]*:' "$ini_file" || true)
+ if [ -n "$name_line" ]; then
+ val="${name_line#*:}"
val="$(echo "$val" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
- if [ -n "$val" ]; then
- skin_header=$(sanitize_filename "$val")
- fi
+ [ -n "$val" ] && skin_header=$(sanitize_filename "$val")
+ else
+ skin_header=$(sanitize_filename "$skin")
fi
+ else
+ continue
fi
raw_path="$(printf "%s/%s" "$skin" "$skin_header" | sed 's/^ *//;s/ *$//')"
@@ -722,6 +746,15 @@ jobs:
echo "## [$skin_header]($REGISTRY_URL/$USER_REPOSITORY/media/tag/$new_tag/export/${base_path}.osk)" >> "$README_PATH"
echo "" >> "$README_PATH"
+
+ if [ -f "$ini_file" ]; then
+ author_line=$(grep -i '^[[:space:]]*Author:' "$ini_file" | head -n1 || true)
+ if [ -n "$author_line" ]; then
+ author=$(echo "$author_line" | cut -d ':' -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
+ [ -n "$author" ] && { echo "**Author:** $author" >> "$README_PATH"; echo "" >> "$README_PATH"; }
+ fi
+ fi
+
echo "[](/docs/${base_path}.md)" >> "$README_PATH"
echo "" >> "$README_PATH"
done
@@ -774,6 +807,7 @@ jobs:
[ -d "$dir" ] || continue
skin=$(basename "$dir")
+ [ "$skin" = "default-skin" ] && continue
ini_file=$(find "$dir" -maxdepth 1 -iname "skin.ini" | head -n1 || true)
skin_header="$skin"
@@ -797,15 +831,53 @@ jobs:
video_url="$REGISTRY_URL/$USER_REPOSITORY/raw/tag/$new_tag/media/gameplay/${base_path}.mp4"
+ author=""
+ if [ -f "$ini_file" ]; then
+ author_line=$(grep -i '^[[:space:]]*Author:' "$ini_file" | head -n1 || true)
+ if [ -n "$author_line" ]; then
+ author=$(echo "$author_line" | cut -d ':' -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
+ fi
+ fi
+
{
echo "# [$skin_header]($osk_url)"
echo ""
+ [ -n "$author" ] && echo "**Author:** $author"
+ [ -n "$author" ] && echo ""
+
+ echo "## Hitsounds"
echo ""
echo ""
+
+ echo "## Ranking Panel"
echo ""
echo ""
+
+ echo "## Mod Icons"
echo ""
+
+ echo ""
+ echo "## Build History"
+ echo ""
+ echo "| Version | Date |"
+ echo "| ------- | ---- |"
+
+ current_commit_date=$(TZ="Europe/Zurich" date -d "$(git log -1 --format=%cI)" "+%d.%m.%Y %H:%M:%S")
+ echo "| [\`$new_tag (Current)\`]($REGISTRY_URL/$USER_REPOSITORY/src/tag/$new_tag/docs/${base_path}.md) | $current_commit_date |"
+
+ old_tags=$(git tag --sort=-v:refname | grep -v "^$new_tag$" | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' || true)
+ if [ -n "$old_tags" ]; then
+ echo "$old_tags" | while read -r tag; do
+ raw_osk_path="export/${skin}/${skin_header}.osk"
+ if git ls-tree -r --name-only "$tag" | grep -Fx -- "$raw_osk_path" >/dev/null; then
+ tag_date=$(git log -1 --format=%ci "$tag")
+ formatted_date=$(TZ="Europe/Zurich" date -d "$tag_date" "+%d.%m.%Y %H:%M:%S")
+ echo "| [\`$tag\`]($REGISTRY_URL/$USER_REPOSITORY/src/tag/$tag/docs/${base_path}.md) | $formatted_date |"
+ fi
+ done
+ fi
+
} > "$md_file_path"
echo " → Wrote $md_file_path"
@@ -820,6 +892,8 @@ jobs:
echo "[Cleanup Extra Files Started]"
[ -f how-to-use.md ] && rm -f how-to-use.md
+ [ -f src/replay.osr ] && rm -f src/replay.osr
+ [ -d src/default-skin ] && rm -rf src/default-skin
readarray -t skins <<< "$ALL_SKINS_DIR"
diff --git a/.gitea/workflows/skins.json b/.gitea/workflows/skins.json
index ac2ac916..50c8bded 100644
--- a/.gitea/workflows/skins.json
+++ b/.gitea/workflows/skins.json
@@ -1,45 +1,42 @@
{
- "order": [
- "- ⊹ aia 1",
- "- ⊹ aia 2",
- "- ⊹ aia 3",
- "boop ts",
- "- rafis pinkity edit by henry",
- "_• adidas for3v3r",
- "hddthr_aristia",
- "++scylla funny mix EPIC",
- "Aristia rgby",
- "- + morgan spring",
- "- Seoul v11 Asta Edit",
- "-#-B- RizerAristia V2+ - [NM+Abyssal]",
- "awawawawadesu",
- "bleh",
- "fukari alt",
- "how the sky was",
- "pew2022 LITE",
- "prezes",
- "sora (copy)",
- "--",
- "_• rafisedit",
- "Aleph DT",
- "aлё",
- "BOIIII_idk MIX Skin",
- "mario+bro+⌞DT⌝",
- "Rafis but SZ",
- "心kokoro dt",
- "- ⊹ aia 3 blue hitcircleoverlay",
- "- ⊹ aia 3 red hitcircleoverlay"
-
- ],
- "descriptions": {
- "- ⊹ aia 3 blue hitcircleoverlay": "Experimental Skin",
- "- ⊹ aia 3 red hitcircleoverlay": "Experimental Skin",
- "- ⊹ aia 1": "Main",
- "- ⊹ aia 2": "Main, diff hitcircles",
- "- ⊹ aia 3": "Main, diff hitcircles",
- "boop ts": "Triple Stacked Rafis",
- "- rafis pinkity edit by henry": "Main Rafis Edit"
-
-
- }
+ "order": [
+ "- ⊹ aia 1",
+ "- ⊹ aia 2",
+ "- ⊹ aia 3",
+ "boop ts",
+ "- rafis pinkity edit by henry",
+ "_• adidas for3v3r",
+ "hddthr_aristia",
+ "++scylla funny mix EPIC",
+ "Aristia rgby",
+ "- + morgan spring",
+ "- Seoul v11 Asta Edit",
+ "-#-B- RizerAristia V2+ - [NM+Abyssal]",
+ "awawawawadesu",
+ "bleh",
+ "fukari alt",
+ "how the sky was",
+ "pew2022 LITE",
+ "prezes",
+ "sora (copy)",
+ "--",
+ "_• rafisedit",
+ "Aleph DT",
+ "aлё",
+ "BOIIII_idk MIX Skin",
+ "mario+bro+⌞DT⌝",
+ "Rafis but SZ",
+ "心kokoro dt",
+ "- ⊹ aia 3 blue hitcircleoverlay",
+ "- ⊹ aia 3 red hitcircleoverlay"
+ ],
+ "descriptions": {
+ "- ⊹ aia 3 blue hitcircleoverlay": "Experimental Skin",
+ "- ⊹ aia 3 red hitcircleoverlay": "Experimental Skin",
+ "- ⊹ aia 1": "Main",
+ "- ⊹ aia 2": "Main, diff hitcircles",
+ "- ⊹ aia 3": "Main, diff hitcircles",
+ "boop ts": "Triple Stacked Rafis",
+ "- rafis pinkity edit by henry": "Main Rafis Edit"
+ }
}
diff --git a/README.md b/README.md
index 33e7c61e..27576179 100644
--- a/README.md
+++ b/README.md
@@ -13,107 +13,201 @@ osuid: 8040245
**Click on the Skin name to download it, or click on the thumbnail to see more about the skin, including a video preview, screenshots, and mod icons.**
-## [++scylla funny mix EPIC](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/%2B%2Bscylla%20funny%20mix%20EPIC/%2B%2Bscylla%20funny%20mix%20EPIC.osk)
+## [aia edit 1](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/-%20%E2%8A%B9%20aia%201/aia%20edit%201.osk)
-[](/docs/%2B%2Bscylla%20funny%20mix%20EPIC/%2B%2Bscylla%20funny%20mix%20EPIC.md)
+Main
-## [- Seoul v11 Asta Edit](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/-%20Seoul%20v11%20Asta%20Edit/-%20Seoul%20v11%20Asta%20Edit.osk)
+**Author:** Skellers
-[](/docs/-%20Seoul%20v11%20Asta%20Edit/-%20Seoul%20v11%20Asta%20Edit.md)
+[](/docs/-%20%E2%8A%B9%20aia%201/aia%20edit%201.md)
-## [no](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/-%20rafis%20pinkity%20edit%20by%20henry/no.osk)
+## [aia edit 2](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/-%20%E2%8A%B9%20aia%202/aia%20edit%202.osk)
-[](/docs/-%20rafis%20pinkity%20edit%20by%20henry/no.md)
+Main, diff hitcircles
-## [- ⊹ aia](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/-%20%E2%8A%B9%20aia%20-%20Copy/-%20%20%20%E2%8A%B9%20aia.osk)
+**Author:** Skellers
-[](/docs/-%20%E2%8A%B9%20aia%20-%20Copy/-%20%20%20%E2%8A%B9%20aia.md)
+[](/docs/-%20%E2%8A%B9%20aia%202/aia%20edit%202.md)
-## [-#-B- RizerAristia V2+ - [NM]](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/-%23-B-%20RizerAristia%20V2%2B%20-%20%5BNM%2BAbyssal%5D/-%23-B-%20RizerAristia%20V2%2B%20-%20%5BNM%5D.osk)
+## [aia edit 3](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/-%20%E2%8A%B9%20aia%203/aia%20edit%203.osk)
-[![-#-B- RizerAristia V2+ - [NM] Thumbnail](media/thumbnail/-%23-B-%20RizerAristia%20V2%2B%20-%20%5BNM%2BAbyssal%5D/-%23-B-%20RizerAristia%20V2%2B%20-%20%5BNM%5D.webp)](/docs/-%23-B-%20RizerAristia%20V2%2B%20-%20%5BNM%2BAbyssal%5D/-%23-B-%20RizerAristia%20V2%2B%20-%20%5BNM%5D.md)
+Main, diff hitcircles
-## [Utami (WubWoofWolf)](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/--/Utami%20%28WubWoofWolf%29.osk)
+**Author:** Skellers
-[](/docs/--/Utami%20%28WubWoofWolf%29.md)
+[](/docs/-%20%E2%8A%B9%20aia%203/aia%20edit%203.md)
-## [Aleph DT](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/Aleph%20DT/Aleph%20DT.osk)
+## [boop ts](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/boop%20ts/boop%20ts.osk)
-[](/docs/Aleph%20DT/Aleph%20DT.md)
+Triple Stacked Rafis
-## [Aristia rgby](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/Aristia%20rgby/Aristia%20rgby.osk)
-
-[](/docs/Aristia%20rgby/Aristia%20rgby.md)
-
-## [BOIIII_idk MIX Skin](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/BOIIII_idk%20MIX%20Skin/BOIIII_idk%20MIX%20Skin.osk)
-
-[](/docs/BOIIII_idk%20MIX%20Skin/BOIIII_idk%20MIX%20Skin.md)
-
-## [Rafis but SZ](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/Rafis%20but%20SZ/Rafis%20but%20SZ.osk)
-
-[](/docs/Rafis%20but%20SZ/Rafis%20but%20SZ.md)
-
-## [adidas for3v3r](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/_%E2%80%A2%20adidas%20for3v3r/adidas%20for3v3r.osk)
-
-[](/docs/_%E2%80%A2%20adidas%20for3v3r/adidas%20for3v3r.md)
-
-## [rafisedit](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/_%E2%80%A2%20rafisedit/rafisedit.osk)
-
-[](/docs/_%E2%80%A2%20rafisedit/rafisedit.md)
-
-## [awawawawadesu](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/awawawawadesu/awawawawadesu.osk)
-
-[](/docs/awawawawadesu/awawawawadesu.md)
-
-## [019](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/a%D0%BB%D1%91/019.osk)
-
-[](/docs/a%D0%BB%D1%91/019.md)
-
-## [bleh](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/bleh/bleh.osk)
-
-[](/docs/bleh/bleh.md)
-
-## [boop ts](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/boop%20ts/boop%20ts.osk)
+**Author:** ieth
[](/docs/boop%20ts/boop%20ts.md)
-## [fukari alt](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/fukari%20alt/fukari%20alt.osk)
+## [no](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/-%20rafis%20pinkity%20edit%20by%20henry/no.osk)
-[](/docs/fukari%20alt/fukari%20alt.md)
+Main Rafis Edit
-## [hddthr aristia](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/hddthr_aristia/hddthr%20aristia.osk)
+**Author:** henry
+
+[](/docs/-%20rafis%20pinkity%20edit%20by%20henry/no.md)
+
+## [adidas for3v3r](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/_%E2%80%A2%20adidas%20for3v3r/adidas%20for3v3r.osk)
+
+**Author:** adidas pocan
+
+[](/docs/_%E2%80%A2%20adidas%20for3v3r/adidas%20for3v3r.md)
+
+## [hddthr aristia](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/hddthr_aristia/hddthr%20aristia.osk)
+
+**Author:** some osu players
[](/docs/hddthr_aristia/hddthr%20aristia.md)
-## [how the sky was](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/how%20the%20sky%20was/how%20the%20sky%20was.osk)
+## [++scylla funny mix EPIC](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/%2B%2Bscylla%20funny%20mix%20EPIC/%2B%2Bscylla%20funny%20mix%20EPIC.osk)
+
+[](/docs/%2B%2Bscylla%20funny%20mix%20EPIC/%2B%2Bscylla%20funny%20mix%20EPIC.md)
+
+## [Aristia rgby](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/Aristia%20rgby/Aristia%20rgby.osk)
+
+**Author:** [Garin] + Aristia + Various
+
+[](/docs/Aristia%20rgby/Aristia%20rgby.md)
+
+## [- + morgan spring](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/-%20%2B%20morgan%20spring/-%20%2B%20morgan%20spring.osk)
+
+[](/docs/-%20%2B%20morgan%20spring/-%20%2B%20morgan%20spring.md)
+
+## [- Seoul v11 Asta Edit](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/-%20Seoul%20v11%20Asta%20Edit/-%20Seoul%20v11%20Asta%20Edit.osk)
+
+**Author:** Seouless
+
+[](/docs/-%20Seoul%20v11%20Asta%20Edit/-%20Seoul%20v11%20Asta%20Edit.md)
+
+## [-#-B- RizerAristia V2+ - [NM]](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/-%23-B-%20RizerAristia%20V2%2B%20-%20%5BNM%2BAbyssal%5D/-%23-B-%20RizerAristia%20V2%2B%20-%20%5BNM%5D.osk)
+
+**Author:** [Garin] + Aristia + Various+ BekkusU
+
+[![-#-B- RizerAristia V2+ - [NM] Thumbnail](media/thumbnail/-%23-B-%20RizerAristia%20V2%2B%20-%20%5BNM%2BAbyssal%5D/-%23-B-%20RizerAristia%20V2%2B%20-%20%5BNM%5D.webp)](/docs/-%23-B-%20RizerAristia%20V2%2B%20-%20%5BNM%2BAbyssal%5D/-%23-B-%20RizerAristia%20V2%2B%20-%20%5BNM%5D.md)
+
+## [awawawawadesu](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/awawawawadesu/awawawawadesu.osk)
+
+**Author:** -duff
+
+[](/docs/awawawawadesu/awawawawadesu.md)
+
+## [bleh](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/bleh/bleh.osk)
+
+**Author:** :p
+
+[](/docs/bleh/bleh.md)
+
+## [fukari alt](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/fukari%20alt/fukari%20alt.osk)
+
+**Author:** Fukari-tan
+
+[](/docs/fukari%20alt/fukari%20alt.md)
+
+## [how the sky was](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/how%20the%20sky%20was/how%20the%20sky%20was.osk)
+
+**Author:** Forever
[](/docs/how%20the%20sky%20was/how%20the%20sky%20was.md)
-## [mario bro ⌞DT⌝](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/mario%2Bbro%2B%E2%8C%9EDT%E2%8C%9D/mario%20bro%20%E2%8C%9EDT%E2%8C%9D.osk)
-
-[](/docs/mario%2Bbro%2B%E2%8C%9EDT%E2%8C%9D/mario%20bro%20%E2%8C%9EDT%E2%8C%9D.md)
-
-## [pew2022 LITE](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/pew2022%20LITE/pew2022%20LITE.osk)
+## [pew2022 LITE](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/pew2022%20LITE/pew2022%20LITE.osk)
[](/docs/pew2022%20LITE/pew2022%20LITE.md)
-## [prezes](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/prezes/prezes.osk)
+## [prezes](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/prezes/prezes.osk)
[](/docs/prezes/prezes.md)
-## [sora](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/sora%20%28copy%29/sora.osk)
+## [sora](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/sora%20%28copy%29/sora.osk)
+
+**Author:** Hidoi (onnneetti helped too)
[](/docs/sora%20%28copy%29/sora.md)
-## [# 心 Kokoro 「3.0」 DT](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/%E5%BF%83kokoro%20dt/%23%20%E5%BF%83%20Kokoro%20%E3%80%8C3.0%E3%80%8D%20DT.osk)
+## [Utami (WubWoofWolf)](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/--/Utami%20%28WubWoofWolf%29.osk)
+
+**Author:** Various Artists
+
+[](/docs/--/Utami%20%28WubWoofWolf%29.md)
+
+## [rafisedit](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/_%E2%80%A2%20rafisedit/rafisedit.osk)
+
+**Author:** draingang remake - https://github.com/thepro2k/Maliszewski-osu-skins/blob/main/skin.md
+
+[](/docs/_%E2%80%A2%20rafisedit/rafisedit.md)
+
+## [Aleph DT](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/Aleph%20DT/Aleph%20DT.osk)
+
+**Author:** various
+
+[](/docs/Aleph%20DT/Aleph%20DT.md)
+
+## [019](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/a%D0%BB%D1%91/019.osk)
+
+[](/docs/a%D0%BB%D1%91/019.md)
+
+## [BOIIII_idk MIX Skin](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/BOIIII_idk%20MIX%20Skin/BOIIII_idk%20MIX%20Skin.osk)
+
+**Author:** Various Artists
+
+[](/docs/BOIIII_idk%20MIX%20Skin/BOIIII_idk%20MIX%20Skin.md)
+
+## [mario bro ⌞DT⌝](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/mario%2Bbro%2B%E2%8C%9EDT%E2%8C%9D/mario%20bro%20%E2%8C%9EDT%E2%8C%9D.osk)
+
+**Author:** i forgor
+
+[](/docs/mario%2Bbro%2B%E2%8C%9EDT%E2%8C%9D/mario%20bro%20%E2%8C%9EDT%E2%8C%9D.md)
+
+## [Rafis but SZ](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/Rafis%20but%20SZ/Rafis%20but%20SZ.osk)
+
+**Author:** DDK RPK
+
+[](/docs/Rafis%20but%20SZ/Rafis%20but%20SZ.md)
+
+## [# 心 Kokoro 「3.0」 DT](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/%E5%BF%83kokoro%20dt/%23%20%E5%BF%83%20Kokoro%20%E3%80%8C3.0%E3%80%8D%20DT.osk)
+
+**Author:** Duckyzie
[](/docs/%E5%BF%83kokoro%20dt/%23%20%E5%BF%83%20Kokoro%20%E3%80%8C3.0%E3%80%8D%20DT.md)
+## [aia edit 3](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/-%20%E2%8A%B9%20aia%203%20blue%20hitcircleoverlay/aia%20edit%203.osk)
+
+Experimental Skin
+
+**Author:** Skellers
+
+[](/docs/-%20%E2%8A%B9%20aia%203%20blue%20hitcircleoverlay/aia%20edit%203.md)
+
+## [aia edit 3](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/-%20%E2%8A%B9%20aia%203%20red%20hitcircleoverlay/aia%20edit%203.osk)
+
+Experimental Skin
+
+**Author:** Skellers
+
+[](/docs/-%20%E2%8A%B9%20aia%203%20red%20hitcircleoverlay/aia%20edit%203.md)
+
+## [Default](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/default-skin/Default.osk)
+
+**Author:** Developers
+
+[](/docs/default-skin/Default.md)
+
# Build History
| Version | Date |
| ------- | ---- |
-| [`v1.3.0 (Current)`](https://git.sulejmani.xyz/Skellers/ooga_booga/src/tag/v1.3.0/README.md) | 17.06.2025 16:32:30 |
-| [`v1.2.0`](https://git.sulejmani.xyz/Skellers/ooga_booga/src/tag/v1.2.0/README.md) | 17.06.2025 16:32:30 |
+| [`v1.9.0 (Current)`](https://git.sulejmani.xyz/Skellers/ooga_booga/src/tag/v1.9.0/README.md) | 04.07.2025 15:45:13 |
+| [`v1.8.0`](https://git.sulejmani.xyz/Skellers/ooga_booga/src/tag/v1.8.0/README.md) | 30.06.2025 12:55:54 |
+| [`v1.7.0`](https://git.sulejmani.xyz/Skellers/ooga_booga/src/tag/v1.7.0/README.md) | 27.06.2025 11:55:56 |
+| [`v1.6.0`](https://git.sulejmani.xyz/Skellers/ooga_booga/src/tag/v1.6.0/README.md) | 27.06.2025 10:55:41 |
+| [`v1.5.0`](https://git.sulejmani.xyz/Skellers/ooga_booga/src/tag/v1.5.0/README.md) | 25.06.2025 12:58:30 |
+| [`v1.4.0`](https://git.sulejmani.xyz/Skellers/ooga_booga/src/tag/v1.4.0/README.md) | 25.06.2025 12:39:10 |
+| [`v1.3.0`](https://git.sulejmani.xyz/Skellers/ooga_booga/src/tag/v1.3.0/README.md) | 22.06.2025 11:18:28 |
+| [`v1.2.0`](https://git.sulejmani.xyz/Skellers/ooga_booga/src/tag/v1.2.0/README.md) | 20.06.2025 13:14:49 |
| [`v1.1.0`](https://git.sulejmani.xyz/Skellers/ooga_booga/src/tag/v1.1.0/README.md) | 17.06.2025 16:13:13 |
| [`v1.0.0`](https://git.sulejmani.xyz/Skellers/ooga_booga/src/tag/v1.0.0/README.md) | 16.06.2025 10:51:47 |
diff --git a/docs/++scylla funny mix EPIC/++scylla funny mix EPIC.md b/docs/++scylla funny mix EPIC/++scylla funny mix EPIC.md
index b3d4e396..860ae253 100644
--- a/docs/++scylla funny mix EPIC/++scylla funny mix EPIC.md
+++ b/docs/++scylla funny mix EPIC/++scylla funny mix EPIC.md
@@ -1,8 +1,26 @@
-# [++scylla funny mix EPIC](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.3.0/export/%2B%2Bscylla%20funny%20mix%20EPIC/%2B%2Bscylla%20funny%20mix%20EPIC.osk)
+# [++scylla funny mix EPIC](https://git.sulejmani.xyz/Skellers/ooga_booga/media/tag/v1.9.0/export/%2B%2Bscylla%20funny%20mix%20EPIC/%2B%2Bscylla%20funny%20mix%20EPIC.osk)
-