diff --git a/icons/title.svg b/icon.svg
similarity index 100%
rename from icons/title.svg
rename to icon.svg
diff --git a/icons/Logotype.tsx b/icons/Logotype.tsx
deleted file mode 100644
index b087a56..0000000
--- a/icons/Logotype.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-import React from 'react'
-import Svg, {Path, SvgProps, PathProps} from 'react-native-svg'
-
-import {usePalette} from '#/lib/hooks/usePalette'
-
-const ratio = 17 / 64
-
-export function Logotype({
- fill,
- ...rest
-}: {fill?: PathProps['fill']} & SvgProps) {
- const pal = usePalette('default')
- // @ts-ignore it's fiiiiine
- const size = parseInt(rest.width || 32)
-
- return (
-
- )
-}
diff --git a/install.zsh b/install.zsh
index 89834ea..59eec59 100755
--- a/install.zsh
+++ b/install.zsh
@@ -1,24 +1,26 @@
#!/bin/zsh
-# ./install.zsh $HOST
-repos_v='{}'
function at-repos-env() {
- host=$1
- if [ -z "$1" ];then
- host=syu.is
- fi
+ host=syu.is
did=did:plc:6qyecktefllvenje24fcxnie
- icon=https://git.syui.ai/ai/at/raw/branch/main/icons/Logotype.tsx
repos=(
- https://github.com/did-method-plc/did-method-plc
- https://github.com/bluesky-social/indigo
- https://github.com/bluesky-social/atproto
- https://github.com/bluesky-social/social-app
- https://github.com/bluesky-social/feed-generator
- https://github.com/bluesky-social/ozone
- https://github.com/bluesky-social/jetstream
+ "https://github.com/did-method-plc/did-method-plc"
+ "https://github.com/bluesky-social/indigo"
+ "https://github.com/bluesky-social/atproto"
+ "https://github.com/bluesky-social/social-app"
+ "https://github.com/bluesky-social/feed-generator"
+ "https://github.com/bluesky-social/ozone"
+ "https://github.com/bluesky-social/jetstream"
+ )
+ services=(
+ "bsky"
+ "plc"
+ "pds"
+ "jetstream"
+ "bgs"
+ "ozone"
+ "social-app"
)
- services=( bsky plc pds jetstream bgs ozone social-app )
d=${0:a:h}
dh=${0:a:h:h}
name=${host%%.*}
@@ -26,28 +28,24 @@ function at-repos-env() {
dport=5000
}
-function at-repos-json() {
- f=~/.config/atproto/token.json
- j="{ \"did\": \"did:plc:6qyecktefllvenje24fcxnie\", \"didDoc\": { \"service\": [ { \"serviceEndpoint\": \"https://syu.is\" } ] }, \"handle\": \"ai.syu.is\", \"accessJwt\": \"xxx\" }"
- if [ ! -f "$f" ];then
- mkdir -p ~/.config/atproto
- echo $j >> $f
- fi
- echo $f
-}
+# Arrays for patch management
+typeset -a FAILED_PATCHES
-function at-repos-token() {
- at-repos-json
- if [ -z "$host" ] && [ -f $f ];then
- host=`cat $f|jq -r ".didDoc.service.[].serviceEndpoint"`
- handle=`cat $f|jq -r ".handle"`
- did=`cat $f|jq -r ".did"`
- token=`cat $f|jq -r ".token"`
- host=${host##*/}
- fi
- name=${host%%.*}
- domain=${host##*.}
-}
+# Patch file lists
+typeset -a PATCH_FILES_CURL
+PATCH_FILES_CURL=(
+ "4367-atproto-services-bsky-api.diff:https://raw.githubusercontent.com/bluesky-social/atproto/refs/heads/main/services/bsky/api.js:services/bsky/api.js"
+ "4367-atproto-services-pds-index.diff:https://raw.githubusercontent.com/bluesky-social/atproto/refs/heads/main/services/pds/index.js:services/pds/index.js"
+)
+
+typeset -a PATCH_FILES
+PATCH_FILES=(
+ "170-pds-oauth-same-site-fix.patch"
+ "8980-social-app-disable-proxy.diff"
+ "disable-statsig-sdk.diff"
+ "140-social-app-yarn-network-timeout.patch"
+ "130-atproto-ozone-enable-daemon-v2.patch"
+)
function at-repos-clone() {
if [ ! -d $d/repos ];then
@@ -90,18 +88,6 @@ function at-repos-pull() {
cd $d
}
-function at-repos-social-app-icon() {
- curl -sL https://raw.githubusercontent.com/bluesky-social/social-app/main/src/view/icons/Logotype.tsx -o $d/repos/social-app/src/view/icons/Logotype.tsx
- if [ -d $d/icons ];then
- mkdir -p $d/icons
- fi
- cp -rf $d/repos/social-app/src/view/icons/Logotype.tsx $d/icons/
-}
-
-function at-repos-social-app-icon-origin() {
- curl -sL $icon -o $d/icons/Logotype.tsx
-}
-
function at-repos-social-app-avatar-write() {
did_admin=did:plc:6qyecktefllvenje24fcxnie
dt=$d/repos/social-app/src
@@ -128,155 +114,185 @@ function at-repos-social-app-avatar-write() {
grep -R $did_admin .|cut -d : -f 1|sort -u|xargs sed -i "s/${did_admin}/${did}/g"
}
-function at-repos-atproto-service-bsky-api-patch() {
- # https://github.com/itaru2622/bluesky-selfhost-env/blob/master/patching/105-atproto-services-for-docker.diff
- f=$d/repos/atproto/services/bsky/api.js
- curl -sL https://raw.githubusercontent.com/bluesky-social/atproto/refs/heads/main/services/bsky/api.js -o $f
- d_=$d/repos/atproto
- p_=$d/patching/4367-atproto-services-bsky-api.diff
- echo "applying patch: under ${f} for ${p_}"
- pushd ${d_}
- patch -p1 < ${p_}
- popd
+# Common patch function with status detection
+function apply-patch() {
+ local patch_name=$1
+ local target_dir=$2
+ local patch_file=$3
+
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
+ echo "📝 Patch: ${patch_name}"
+ echo " Target: ${target_dir}"
+ echo " File: ${patch_file}"
+
+ pushd ${target_dir} > /dev/null
+
+ # Check if patch is already applied (reverse dry-run succeeds)
+ if patch --dry-run -p1 -R < ${patch_file} > /dev/null 2>&1; then
+ echo "✅ Already applied - skipping"
+ popd > /dev/null
+ echo ""
+ return 0
+ fi
+
+ # Check if patch can be applied (forward dry-run succeeds)
+ if patch --dry-run -p1 < ${patch_file} > /dev/null 2>&1; then
+ echo "🔧 Applying patch..."
+ if patch -p1 < ${patch_file}; then
+ echo "✅ Applied successfully"
+ popd > /dev/null
+ echo ""
+ return 0
+ else
+ echo "❌ Failed to apply"
+ FAILED_PATCHES+=("${patch_name} (${patch_file})")
+ popd > /dev/null
+ echo ""
+ return 1
+ fi
+ else
+ echo "⚠️ Cannot apply - file may have been modified"
+ echo " Please check manually"
+ FAILED_PATCHES+=("${patch_name} (${patch_file}) - file modified")
+ popd > /dev/null
+ echo ""
+ return 1
+ fi
}
-function at-repos-atproto-service-pds-index-patch() {
- f=$d/repos/atproto/services/pds/index.js
- curl -sL https://raw.githubusercontent.com/bluesky-social/atproto/refs/heads/main/services/pds/index.js -o $f
- d_=$d/repos/atproto
- p_=$d/patching/4367-atproto-services-pds-index.diff
- echo "applying patch: under ${f} for ${p_}"
- pushd ${d_}
- patch -p1 < ${p_}
- popd
+# Function to display failed patches summary
+function show-failed-patches() {
+ if [ ${#FAILED_PATCHES[@]} -eq 0 ]; then
+ echo ""
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
+ echo "✅ All patches applied successfully!"
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
+ echo ""
+ return 0
+ fi
+
+ echo ""
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
+ echo "⚠️ FAILED PATCHES SUMMARY"
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
+ echo ""
+ echo "The following patches could not be applied:"
+ echo ""
+ for failed_patch in "${FAILED_PATCHES[@]}"; do
+ echo " ❌ ${failed_patch}"
+ done
+ echo ""
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
+ echo ""
}
-function at-repos-atproto-oauth-same-site-patch() {
- f=$d/repos/atproto/packages/oauth/oauth-provider/src/router/create-authorization-page-middleware.ts
- d_=$d/repos/atproto
- p_=$d/patching/170-pds-oauth-same-site-fix.patch
- echo "applying patch: under ${f} for ${p_}"
- pushd ${d_}
- patch -p1 < ${p_}
- popd
+# Helper function for applying patches
+function patch-apply() {
+ local name=$1
+ local target=$2
+ local patch_file=$3
+ apply-patch "${name}" "$d/repos/${target}" "$d/patching/${patch_file}"
}
-function at-repos-social-app-agent-patch() {
- f=$d/repos/social-app/src/state/session/agent.ts
- p_=$d/patching/8980-social-app-disable-proxy.diff
- d_=$d/repos/social-app
- echo "applying patch: under ${f} for ${p_}"
- pushd ${d_}
- patch -p1 < ${p_}
- popd
+# Helper function for patches with curl download
+function patch-apply-with-curl() {
+ local name=$1
+ local target=$2
+ local patch_file=$3
+ local download_url=$4
+ local download_target=$5
+
+ curl -sL "${download_url}" -o "$d/repos/${target}/${download_target}"
+ apply-patch "${name}" "$d/repos/${target}" "$d/patching/${patch_file}"
}
-function at-repos-social-app-disable-external-services-patch() {
- f=$d/repos/social-app/src/state/geolocation/const.ts
- p_=$d/patching/8980-social-app-disable-external-services.diff
- d_=$d/repos/social-app
- echo "applying patch: under ${f} for ${p_}"
- pushd ${d_}
- patch -p1 < ${p_}
- popd
-}
+# Auto-apply patches from list
+function at-repos-patch-apply-all() {
+ # Apply curl patches
+ for patch_info in "${PATCH_FILES_CURL[@]}"; do
+ local filename="${patch_info%%:*}"
+ local rest="${patch_info#*:}"
+ local download_url="${rest%%:*}"
+ local download_target="${rest#*:}"
-function at-repos-social-app-statsig-patch() {
- f=$d/repos/social-app/src/lib/statsig/statsig.tsx
- p_=$d/patching/disable-statsig-sdk.diff
- d_=$d/repos/social-app
- echo "applying patch: under ${f} for ${p_}"
- pushd ${d_}
- patch -p1 < ${p_}
- popd
-}
+ local title="${filename%.*}"
+ local repo=""
-function at-repos-social-app-dockerfile-yarn-timeout-patch() {
- f=$d/repos/social-app/Dockerfile
- p_=$d/patching/140-social-app-yarn-network-timeout.patch
- d_=$d/repos/social-app
- echo "applying patch: under ${f} for ${p_}"
- pushd ${d_}
- patch -p1 < ${p_}
- popd
-}
+ # Determine repo from filename
+ if [[ $filename == *"atproto"* ]]; then
+ repo="atproto"
+ elif [[ $filename == *"pds"* ]]; then
+ repo="atproto"
+ fi
-function at-repos-atproto-service-ozone-api-patch() {
- f=$d/repos/atproto/services/ozone/api.js
- d_=$d/repos/atproto
- p_=$d/patching/130-atproto-ozone-enable-daemon-v2.patch
- echo "applying patch: under ${f} for ${p_}"
- pushd ${d_}
- patch -p1 < ${p_}
- popd
+ patch-apply-with-curl "$title" "$repo" "$filename" "$download_url" "$download_target"
+ done
+
+ # Apply regular patches
+ for filename in "${PATCH_FILES[@]}"; do
+ local title="${filename%.*}"
+ local repo=""
+
+ # Determine repo from filename
+ if [[ $filename == *"social-app"* || $filename == *"statsig"* ]]; then
+ repo="social-app"
+ elif [[ $filename == *"atproto"* ]]; then
+ repo="atproto"
+ elif [[ $filename == *"pds"* ]]; then
+ repo="atproto"
+ fi
+
+ patch-apply "$title" "$repo" "$filename"
+ done
}
function at-repos-ozone-patch() {
- #DOMAIN=syu.is
cd $d/repos
d_=$d/repos/ozone
rm -rf ${d_}
- p_=$d/patching/120-ozone-runtimeEnvVars.diff
git clone https://github.com/bluesky-social/ozone
- cd ${d_}
- pushd ${d_}
- echo "applying patch: under ${d_} for ${p_}"
- patch -p1 < ${p_}
- popd
- p_=$d/patching/122-ozone-enable-daemon.diff
- echo "applying patch: under ${d_} for ${p_}"
- pushd ${d_}
- patch -p1 < ${p_}
- popd
+ apply-patch "Ozone enable daemon" "${d_}" "$d/patching/122-ozone-enable-daemon.diff"
- p_=$d/patching/130-ozone-skip-did-check.patch
- echo "applying patch: under ${d_} for ${p_}"
- pushd ${d_}
- patch -p1 < ${p_}
- popd
+ if [ -f "$d/patching/150-ozone-plc-fix.patch" ]; then
+ apply-patch "Ozone plc fix" "${d_}" "$d/patching/150-ozone-plc-fix.patch"
+ fi
- p_=$d/patching/150-ozone-plc-fix.patch
- echo "applying patch: under ${d_} for ${p_}"
- pushd ${d_}
- patch -p1 < ${p_}
- popd
+ if [ -f "$d/patching/160-ozone-oauth-redirect-fix.patch" ]; then
+ apply-patch "Ozone oauth redirect fix" "${d_}" "$d/patching/160-ozone-oauth-redirect-fix.patch"
+ fi
- p_=$d/patching/160-ozone-oauth-redirect-fix.patch
- echo "applying patch: under ${d_} for ${p_}"
- pushd ${d_}
- patch -p1 < ${p_}
- popd
+ # Apply constants fix and do additional sed replacements
+ pushd ${d_} > /dev/null
+ if [ -f "$d/patching/121-ozone-constants-fix.patch" ]; then
+ patch -p1 < "$d/patching/121-ozone-constants-fix.patch" 2>/dev/null || true
+ fi
- p_=$d/patching/121-ozone-constants-fix.patch
- echo "applying patch: under ${d_} for ${p_}"
- pushd ${d_}
- patch -p1 < ${p_} || true
# Replace process.env with env()
- sed -i 's/process\.env\.\(NEXT_PUBLIC_[A-Z_]*\)/env('\''\1'\'')/g' lib/constants.ts
- sed -i 's/process\.env\.NODE_ENV/env('\''NODE_ENV'\'')/g' lib/constants.ts
+ sed -i 's/process\.env\.\(NEXT_PUBLIC_[A-Z_]*\)/env('\''\1'\'')/g' lib/constants.ts 2>/dev/null || true
+ sed -i 's/process\.env\.NODE_ENV/env('\''NODE_ENV'\'')/g' lib/constants.ts 2>/dev/null || true
# Add missing SOCIAL_APP_DOMAIN constant after SOCIAL_APP_URL
sed -i '/^export const SOCIAL_APP_URL =/,/^$/{ /^$/a\
export const SOCIAL_APP_DOMAIN =\
env('\''NEXT_PUBLIC_SOCIAL_APP_DOMAIN'\'') || '\''bsky.app'\''\
- }' lib/constants.ts
+ }' lib/constants.ts 2>/dev/null || true
# Fix multiline process.env patterns
sed -i '/^export const NEW_ACCOUNT_MARKER_THRESHOLD_IN_DAYS = process\.env$/,/^ : 7$/ {
s/^export const NEW_ACCOUNT_MARKER_THRESHOLD_IN_DAYS = process\.env$/export const NEW_ACCOUNT_MARKER_THRESHOLD_IN_DAYS = env('\''NEXT_PUBLIC_NEW_ACCOUNT_MARKER_THRESHOLD_IN_DAYS'\'')/
/^ \.NEXT_PUBLIC_NEW_ACCOUNT_MARKER_THRESHOLD_IN_DAYS$/d
- }' lib/constants.ts
+ }' lib/constants.ts 2>/dev/null || true
sed -i '/^export const YOUNG_ACCOUNT_MARKER_THRESHOLD_IN_DAYS = process\.env$/,/^ : 30$/ {
s/^export const YOUNG_ACCOUNT_MARKER_THRESHOLD_IN_DAYS = process\.env$/export const YOUNG_ACCOUNT_MARKER_THRESHOLD_IN_DAYS = env('\''NEXT_PUBLIC_YOUNG_ACCOUNT_MARKER_THRESHOLD_IN_DAYS'\'')/
/^ \.NEXT_PUBLIC_YOUNG_ACCOUNT_MARKER_THRESHOLD_IN_DAYS$/d
- }' lib/constants.ts
+ }' lib/constants.ts 2>/dev/null || true
sed -i '/^export const HIGH_PROFILE_FOLLOWER_THRESHOLD = process\.env$/,/^ : Infinity$/ {
s/^export const HIGH_PROFILE_FOLLOWER_THRESHOLD = process\.env$/export const HIGH_PROFILE_FOLLOWER_THRESHOLD = env('\''NEXT_PUBLIC_HIGH_PROFILE_FOLLOWER_THRESHOLD'\'')/
/^ \.NEXT_PUBLIC_HIGH_PROFILE_FOLLOWER_THRESHOLD$/d
- }' lib/constants.ts
+ }' lib/constants.ts 2>/dev/null || true
# Fix parseInt() to handle undefined by adding || ''
- sed -i "s/parseInt(env('\([^']*\)'))/parseInt(env('\1') || '0')/g" lib/constants.ts
- popd
+ sed -i "s/parseInt(env('\([^']*\)'))/parseInt(env('\1') || '0')/g" lib/constants.ts 2>/dev/null || true
+ popd > /dev/null
}
function at-repos-build-docker-atproto() {
@@ -312,6 +328,10 @@ function at-repos-push-docker() {
service=${services[$i]}
docker tag at-${service}:latest localhost:${dport}/${service}:latest
docker push localhost:${dport}/${service}:latest
+ if [ "$service" == "ozone" ]];then
+ docker tag at-${service}-web:latest localhost:${dport}/${service}-web:latest
+ docker push localhost:${dport}/${service}-web:latest
+ fi
done
else
docker tag at-${1}:latest localhost:${dport}/${1}:latest
@@ -326,38 +346,51 @@ function at-repos-pull-docker() {
}
at-repos-env
+case "$1" in
+ pull)
+ at-repos-clone
+ at-repos-pull
+ exit
+ ;;
+ patch)
+ at-repos-social-app-avatar-write
+ at-repos-patch-apply-all
+ at-repos-ozone-patch
+ show-failed-patches
+ exit
+ ;;
+ build)
+ at-repos-build-docker-atproto $2
+ exit
+ ;;
+ push)
+ at-repos-push-docker $2
+ exit
+ ;;
+ reset)
+ at-repos-push-reset
+ exit
+ ;;
+ down)
+ cd $d;docker compose down
+ exit
+ ;;
+esac
+
case "`cat /etc/hostname`" in
at)
at-repos-pull-docker
exit
;;
*)
- if [ "$1" = "r" ];then
- at-repos-push-reset
- exit
- fi
at-repos-clone
at-repos-pull
- at-repos-social-app-icon
- at-repos-social-app-icon-origin
at-repos-social-app-avatar-write
- at-repos-social-app-agent-patch
- at-repos-social-app-disable-external-services-patch
- at-repos-social-app-statsig-patch
- at-repos-social-app-dockerfile-yarn-timeout-patch
- at-repos-atproto-service-bsky-api-patch
- at-repos-atproto-service-pds-index-patch
- at-repos-atproto-oauth-same-site-patch
- at-repos-atproto-service-ozone-api-patch
+ at-repos-patch-apply-all
at-repos-ozone-patch
- if [ -n "$1" ];then
- at-repos-build-docker-atproto $1
- at-repos-push-docker $1
- exit
- fi
+ show-failed-patches
at-repos-build-docker-atproto
at-repos-push-docker
cd $d; docker compose down
;;
esac
-
diff --git a/patching/180-social-app-logotype.patch b/patching/180-social-app-logotype.patch
new file mode 100644
index 0000000..2003855
--- /dev/null
+++ b/patching/180-social-app-logotype.patch
@@ -0,0 +1,51 @@
+--- src/view/icons/Logotype.tsx 2025-12-03 22:43:39
++++ /Users/syui/ai/at/patching/Logotype.tsx 2025-12-06 13:05:03
+@@ -1,4 +1,5 @@
+-import Svg, {Path, type PathProps, type SvgProps} from 'react-native-svg'
++import React from 'react'
++import Svg, {Path, SvgProps, PathProps} from 'react-native-svg'
+
+ import {usePalette} from '#/lib/hooks/usePalette'
+
+@@ -15,14 +16,37 @@
+ return (
+
+ )
+ }