Compare commits
51 Commits
fixReqVal
...
internal_i
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8378af153b | ||
|
|
7f57fd597c | ||
|
|
f7515f520c | ||
|
|
b0ebbce292 | ||
|
|
3d409ffd77 | ||
|
|
6d45c3c4e5 | ||
|
|
35ca600c4e | ||
|
|
6fcf2732a8 | ||
|
|
311e8f3939 | ||
|
|
da1ff4131c | ||
|
|
d0bbdfec8e | ||
|
|
e5f2ae8ac8 | ||
|
|
a119babe21 | ||
|
|
9dd9a8db80 | ||
|
|
ea4282882e | ||
|
|
862064d2e4 | ||
|
|
191ec62215 | ||
|
|
dabd703803 | ||
|
|
be6bc3747b | ||
|
|
9f9eab3644 | ||
|
|
91499c7775 | ||
|
|
f254a7841b | ||
|
|
e583794d37 | ||
|
|
87df2add67 | ||
|
|
c074f66b38 | ||
|
|
9bdf6305f7 | ||
|
|
e13e27c10e | ||
|
|
d1d7d03af2 | ||
|
|
ba2cf287ce | ||
|
|
619d7676f6 | ||
|
|
0d7cbd3187 | ||
|
|
a292d09d8c | ||
|
|
7450996f4d | ||
|
|
f37d94a2bd | ||
|
|
d48b4392f5 | ||
|
|
8feb69d711 | ||
|
|
24266e9eca | ||
|
|
3419197817 | ||
|
|
6d59e51ffa | ||
|
|
16bc189c2b | ||
|
|
c942257c5f | ||
|
|
bc7d265812 | ||
|
|
f7ee1099c4 | ||
|
|
f6852885b1 | ||
|
|
ee1686370b | ||
|
|
c94e817205 | ||
|
|
4669107647 | ||
|
|
dcf0192257 | ||
|
|
a0686dc8bd | ||
|
|
506fc51675 | ||
|
|
6751648aae |
2
.github/workflows/auth-crowdin-push.yml
vendored
@@ -5,7 +5,7 @@ on:
|
||||
branches: [main]
|
||||
paths:
|
||||
# Run workflow when auth's intl_en.arb is changed
|
||||
- "mobile/apps/auth/lib/l10n/arb/app_en.arb"
|
||||
- "auth/lib/l10n/arb/app_en.arb"
|
||||
# Or the workflow itself is changed
|
||||
- ".github/workflows/auth-crowdin.yml"
|
||||
|
||||
|
||||
2
.github/workflows/auth-internal-release.yml
vendored
@@ -4,7 +4,7 @@ on:
|
||||
workflow_dispatch: # Allow manually running the action
|
||||
|
||||
env:
|
||||
FLUTTER_VERSION: "3.32.8"
|
||||
FLUTTER_VERSION: "3.24.3"
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
4
.github/workflows/auth-lint.yml
vendored
@@ -4,11 +4,11 @@ on:
|
||||
# Run on every pull request (open or push to it) that changes auth/
|
||||
pull_request:
|
||||
paths:
|
||||
- "mobile/apps/auth/**"
|
||||
- "auth/**"
|
||||
- ".github/workflows/auth-lint.yml"
|
||||
|
||||
env:
|
||||
FLUTTER_VERSION: "3.32.8"
|
||||
FLUTTER_VERSION: "3.24.3"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
2
.github/workflows/auth-release.yml
vendored
@@ -29,7 +29,7 @@ on:
|
||||
- "auth-v*"
|
||||
|
||||
env:
|
||||
FLUTTER_VERSION: "3.32.8"
|
||||
FLUTTER_VERSION: "3.24.3"
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
179
.github/workflows/mobile-daily-internal.yml
vendored
@@ -1,179 +0,0 @@
|
||||
name: "Internal release (photos)"
|
||||
|
||||
on:
|
||||
schedule:
|
||||
# Runs daily at 12:30 UTC (6:00 PM IST)
|
||||
- cron: "30 12 * * *"
|
||||
workflow_dispatch: # Allow manual trigger
|
||||
|
||||
env:
|
||||
FLUTTER_VERSION: "3.32.8"
|
||||
RUST_VERSION: "1.86.0"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: mobile/apps/photos
|
||||
|
||||
steps:
|
||||
- name: Checkout code and submodules
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Free up disk space
|
||||
run: |
|
||||
echo "Initial disk usage:"
|
||||
df -h /
|
||||
# Get available space in KB
|
||||
INITIAL=$(df / | awk 'NR==2 {print $4}')
|
||||
|
||||
echo -e "\n=== Removing .NET SDK (~20-25GB) ==="
|
||||
BEFORE=$(df / | awk 'NR==2 {print $4}')
|
||||
START=$(date +%s)
|
||||
sudo rm -rf /usr/share/dotnet
|
||||
END=$(date +%s)
|
||||
AFTER=$(df / | awk 'NR==2 {print $4}')
|
||||
FREED=$(( (AFTER - BEFORE) / 1048576 )) # Convert KB to GB
|
||||
echo "Time: $((END-START))s | Freed: ${FREED}GB"
|
||||
|
||||
echo -e "\n=== Removing cached tools (~5-10GB) ==="
|
||||
BEFORE=$(df / | awk 'NR==2 {print $4}')
|
||||
START=$(date +%s)
|
||||
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
|
||||
END=$(date +%s)
|
||||
AFTER=$(df / | awk 'NR==2 {print $4}')
|
||||
FREED=$(( (AFTER - BEFORE) / 1048576 ))
|
||||
echo "Time: $((END-START))s | Freed: ${FREED}GB"
|
||||
|
||||
echo -e "\n=== Final Summary ==="
|
||||
FINAL=$(df / | awk 'NR==2 {print $4}')
|
||||
TOTAL_FREED=$(( (FINAL - INITIAL) / 1048576 ))
|
||||
echo "Total space freed: ${TOTAL_FREED}GB"
|
||||
echo "Final disk usage:"
|
||||
df -h /
|
||||
|
||||
- name: Setup JDK 17
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: 17
|
||||
|
||||
- name: Install Flutter ${{ env.FLUTTER_VERSION }}
|
||||
uses: subosito/flutter-action@v2
|
||||
with:
|
||||
channel: "stable"
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
cache: true
|
||||
|
||||
- name: Install Flutter Rust Bridge
|
||||
run: cargo install flutter_rust_bridge_codegen
|
||||
|
||||
- name: Generate Rust bindings
|
||||
run: flutter_rust_bridge_codegen generate
|
||||
|
||||
- name: Increment version code for build
|
||||
run: |
|
||||
CURRENT_VERSION=$(grep '^version:' pubspec.yaml | sed 's/version: //')
|
||||
VERSION_NAME=$(echo $CURRENT_VERSION | cut -d'+' -f1)
|
||||
CURRENT_BUILD=$(echo $CURRENT_VERSION | cut -d'+' -f2)
|
||||
NEW_BUILD=$((CURRENT_BUILD + ${{ github.run_number }}))
|
||||
NEW_VERSION="${VERSION_NAME}+${NEW_BUILD}"
|
||||
|
||||
sed -i "s/^version: .*/version: $NEW_VERSION/" pubspec.yaml
|
||||
echo "Building with version ${NEW_VERSION}"
|
||||
|
||||
# Store version for later use
|
||||
echo "NEW_VERSION=${NEW_VERSION}" >> $GITHUB_ENV
|
||||
|
||||
- name: Prepare and validate changelog for Play Store
|
||||
run: |
|
||||
mkdir -p whatsnew
|
||||
CHANGELOG_FILE="scripts/store_changes.txt"
|
||||
DISCORD_FILE="scripts/internal_changes.txt"
|
||||
OUTPUT_FILE="whatsnew/whatsnew-en-US"
|
||||
|
||||
# Use provided changelog or fallback
|
||||
if [ -f "$CHANGELOG_FILE" ]; then
|
||||
head -c 500 "$CHANGELOG_FILE" > "$OUTPUT_FILE"
|
||||
else
|
||||
echo "Bug fixes and improvements" > "$OUTPUT_FILE"
|
||||
fi
|
||||
|
||||
# Validate: file exists
|
||||
if [ ! -s "$OUTPUT_FILE" ]; then
|
||||
echo "❌ Changelog is empty."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Validate: <= 500 chars
|
||||
LENGTH=$(wc -m < "$OUTPUT_FILE")
|
||||
if [ "$LENGTH" -gt 500 ]; then
|
||||
echo "❌ Changelog exceeds 500 characters ($LENGTH)."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Validate: no markdown or HTML
|
||||
if grep -Eq '[\*\_\<\>\[\]\(\)]' "$OUTPUT_FILE"; then
|
||||
echo "❌ Changelog contains markdown/HTML formatting."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ Changelog valid:"
|
||||
cat "$OUTPUT_FILE"
|
||||
|
||||
# Store changelog for Play Store (with escaped newlines)
|
||||
CHANGELOG_PLAYSTORE=$(cat "$OUTPUT_FILE" | sed ':a;N;$!ba;s/\n/\\n/g' | sed 's/"/\\"/g')
|
||||
echo "CHANGELOG=${CHANGELOG_PLAYSTORE}" >> $GITHUB_ENV
|
||||
|
||||
# Store changelog for Discord (with proper newlines)
|
||||
CHANGELOG_DISCORD=$(cat "$DISCORD_FILE" | sed 's/"/\\"/g')
|
||||
echo "CHANGELOG_DISCORD<<EOF" >> $GITHUB_ENV
|
||||
echo "$CHANGELOG_DISCORD" >> $GITHUB_ENV
|
||||
echo "EOF" >> $GITHUB_ENV
|
||||
|
||||
- name: Setup keys
|
||||
uses: timheuer/base64-to-file@v1
|
||||
with:
|
||||
fileName: "keystore/ente_photos_key.jks"
|
||||
encodedString: ${{ secrets.SIGNING_KEY_PHOTOS }}
|
||||
|
||||
- name: Build PlayStore AAB
|
||||
run: |
|
||||
flutter build appbundle --dart-define=cronetHttpNoPlay=true --release --flavor playstore
|
||||
env:
|
||||
SIGNING_KEY_PATH: "/home/runner/work/_temp/keystore/ente_photos_key.jks"
|
||||
SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS_PHOTOS }}
|
||||
SIGNING_KEY_PASSWORD: ${{ secrets.SIGNING_KEY_PASSWORD_PHOTOS }}
|
||||
SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_STORE_PASSWORD_PHOTOS }}
|
||||
|
||||
- name: Upload AAB to PlayStore
|
||||
uses: r0adkll/upload-google-play@v1
|
||||
with:
|
||||
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
|
||||
packageName: io.ente.photos
|
||||
releaseFiles: mobile/apps/photos/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
||||
track: internal
|
||||
whatsNewDirectory: mobile/apps/photos/whatsnew
|
||||
mappingFile: mobile/apps/photos/build/app/outputs/mapping/playstoreRelease/mapping.txt
|
||||
|
||||
- name: Notify Discord
|
||||
uses: sarisia/actions-status-discord@v1
|
||||
with:
|
||||
webhook: ${{ secrets.DISCORD_INTERNAL_RELEASE_WEBHOOK }}
|
||||
nodetail: true
|
||||
title: "🏆 Daily release Photos v${{ env.NEW_VERSION }} (Branch: ${{ github.ref_name }})"
|
||||
description: |
|
||||
**Version:** ${{ env.NEW_VERSION }}
|
||||
**Flutter:** ${{ env.FLUTTER_VERSION }}
|
||||
**Commit:** [${{ github.sha }}](${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }})
|
||||
**Download:** [Play Store](https://play.google.com/store/apps/details?id=io.ente.photos)
|
||||
|
||||
**Changes:**
|
||||
${{ env.CHANGELOG_DISCORD }}
|
||||
color: 0x00ff00
|
||||
77
.github/workflows/mobile-internal-release-rust.yml
vendored
Normal file
@@ -0,0 +1,77 @@
|
||||
name: "Internal release (photos)"
|
||||
|
||||
on:
|
||||
workflow_dispatch: # Allow manually running the action
|
||||
|
||||
env:
|
||||
FLUTTER_VERSION: "3.24.3"
|
||||
RUST_VERSION: "1.85.1"
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: mobile/apps/photos
|
||||
|
||||
steps:
|
||||
- name: Checkout code and submodules
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup JDK 17
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: 17
|
||||
|
||||
- name: Install Flutter ${{ env.FLUTTER_VERSION }}
|
||||
uses: subosito/flutter-action@v2
|
||||
with:
|
||||
channel: "stable"
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
cache: true
|
||||
|
||||
- name: Install Rust ${{ env.RUST_VERSION }}
|
||||
uses: dtolnay/rust-toolchain@master
|
||||
with:
|
||||
toolchain: ${{ env.RUST_VERSION }}
|
||||
|
||||
- name: Install Flutter Rust Bridge
|
||||
run: cargo install flutter_rust_bridge_codegen
|
||||
|
||||
- name: Setup keys
|
||||
uses: timheuer/base64-to-file@v1
|
||||
with:
|
||||
fileName: "keystore/ente_photos_key.jks"
|
||||
encodedString: ${{ secrets.SIGNING_KEY_PHOTOS }}
|
||||
|
||||
- name: Build PlayStore AAB
|
||||
run: |
|
||||
flutter build appbundle --dart-define=cronetHttpNoPlay=true --release --flavor playstore
|
||||
env:
|
||||
SIGNING_KEY_PATH: "/home/runner/work/_temp/keystore/ente_photos_key.jks"
|
||||
SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS_PHOTOS }}
|
||||
SIGNING_KEY_PASSWORD: ${{ secrets.SIGNING_KEY_PASSWORD_PHOTOS }}
|
||||
SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_STORE_PASSWORD_PHOTOS }}
|
||||
|
||||
- name: Upload AAB to PlayStore
|
||||
uses: r0adkll/upload-google-play@v1
|
||||
with:
|
||||
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
|
||||
packageName: io.ente.photos
|
||||
releaseFiles: mobile/apps/photos/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
||||
track: internal
|
||||
|
||||
- name: Notify Discord
|
||||
uses: sarisia/actions-status-discord@v1
|
||||
with:
|
||||
webhook: ${{ secrets.DISCORD_INTERNAL_RELEASE_WEBHOOK }}
|
||||
nodetail: true
|
||||
title: "🏆 Internal release available for Photos"
|
||||
description: "[Download](https://play.google.com/store/apps/details?id=io.ente.photos)"
|
||||
color: 0x00ff00
|
||||
68
.github/workflows/mobile-internal-release.yml
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
name: "Internal release (photos)"
|
||||
|
||||
on:
|
||||
workflow_dispatch: # Allow manually running the action
|
||||
|
||||
env:
|
||||
FLUTTER_VERSION: "3.27.4"
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: mobile/apps/photos
|
||||
|
||||
steps:
|
||||
- name: Checkout code and submodules
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup JDK 17
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: 17
|
||||
|
||||
- name: Install Flutter ${{ env.FLUTTER_VERSION }}
|
||||
uses: subosito/flutter-action@v2
|
||||
with:
|
||||
channel: "stable"
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
cache: true
|
||||
|
||||
- name: Setup keys
|
||||
uses: timheuer/base64-to-file@v1
|
||||
with:
|
||||
fileName: "keystore/ente_photos_key.jks"
|
||||
encodedString: ${{ secrets.SIGNING_KEY_PHOTOS }}
|
||||
|
||||
- name: Build PlayStore AAB
|
||||
run: |
|
||||
flutter build appbundle --dart-define=cronetHttpNoPlay=true --release --flavor playstore
|
||||
env:
|
||||
SIGNING_KEY_PATH: "/home/runner/work/_temp/keystore/ente_photos_key.jks"
|
||||
SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS_PHOTOS }}
|
||||
SIGNING_KEY_PASSWORD: ${{ secrets.SIGNING_KEY_PASSWORD_PHOTOS }}
|
||||
SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_STORE_PASSWORD_PHOTOS }}
|
||||
|
||||
- name: Upload AAB to PlayStore
|
||||
uses: r0adkll/upload-google-play@v1
|
||||
with:
|
||||
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
|
||||
packageName: io.ente.photos
|
||||
releaseFiles: mobile/apps/photos/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
||||
track: internal
|
||||
|
||||
- name: Notify Discord
|
||||
uses: sarisia/actions-status-discord@v1
|
||||
with:
|
||||
webhook: ${{ secrets.DISCORD_INTERNAL_RELEASE_WEBHOOK }}
|
||||
nodetail: true
|
||||
title: "🏆 Internal release Photos (Branch: ${{ github.ref_name }})"
|
||||
description: "[Download](https://play.google.com/store/apps/details?id=io.ente.photos)"
|
||||
color: 0x00ff00
|
||||
16
.github/workflows/mobile-lint.yml
vendored
@@ -8,8 +8,7 @@ on:
|
||||
- ".github/workflows/mobile-lint.yml"
|
||||
|
||||
env:
|
||||
FLUTTER_VERSION: "3.32.8"
|
||||
RUST_VERSION: "1.86.0"
|
||||
FLUTTER_VERSION: "3.27.4"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
@@ -32,18 +31,7 @@ jobs:
|
||||
channel: "stable"
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
cache: true
|
||||
|
||||
|
||||
- run: flutter pub get
|
||||
|
||||
- name: Install Rust ${{ env.RUST_VERSION }}
|
||||
uses: dtolnay/rust-toolchain@master
|
||||
with:
|
||||
toolchain: ${{ env.RUST_VERSION }}
|
||||
|
||||
- name: Install Flutter Rust Bridge
|
||||
run: cargo install flutter_rust_bridge_codegen
|
||||
|
||||
- name: Generate Rust bindings
|
||||
run: flutter_rust_bridge_codegen generate
|
||||
|
||||
- run: flutter analyze --no-fatal-infos
|
||||
|
||||
40
.github/workflows/mobile-release.yml
vendored
@@ -9,7 +9,7 @@ on:
|
||||
- "photos-v*"
|
||||
|
||||
env:
|
||||
FLUTTER_VERSION: "3.32.8"
|
||||
FLUTTER_VERSION: "3.27.4"
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
@@ -28,38 +28,6 @@ jobs:
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Free up disk space
|
||||
run: |
|
||||
echo "Initial disk usage:"
|
||||
df -h /
|
||||
# Get available space in KB
|
||||
INITIAL=$(df / | awk 'NR==2 {print $4}')
|
||||
|
||||
echo -e "\n=== Removing .NET SDK (~20-25GB) ==="
|
||||
BEFORE=$(df / | awk 'NR==2 {print $4}')
|
||||
START=$(date +%s)
|
||||
sudo rm -rf /usr/share/dotnet
|
||||
END=$(date +%s)
|
||||
AFTER=$(df / | awk 'NR==2 {print $4}')
|
||||
FREED=$(( (AFTER - BEFORE) / 1048576 )) # Convert KB to GB
|
||||
echo "Time: $((END-START))s | Freed: ${FREED}GB"
|
||||
|
||||
echo -e "\n=== Removing cached tools (~5-10GB) ==="
|
||||
BEFORE=$(df / | awk 'NR==2 {print $4}')
|
||||
START=$(date +%s)
|
||||
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
|
||||
END=$(date +%s)
|
||||
AFTER=$(df / | awk 'NR==2 {print $4}')
|
||||
FREED=$(( (AFTER - BEFORE) / 1048576 ))
|
||||
echo "Time: $((END-START))s | Freed: ${FREED}GB"
|
||||
|
||||
echo -e "\n=== Final Summary ==="
|
||||
FINAL=$(df / | awk 'NR==2 {print $4}')
|
||||
TOTAL_FREED=$(( (FINAL - INITIAL) / 1048576 ))
|
||||
echo "Total space freed: ${TOTAL_FREED}GB"
|
||||
echo "Final disk usage:"
|
||||
df -h /
|
||||
|
||||
- name: Setup JDK 17
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
@@ -72,12 +40,6 @@ jobs:
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
cache: true
|
||||
|
||||
- name: Install Flutter Rust Bridge
|
||||
run: cargo install flutter_rust_bridge_codegen
|
||||
|
||||
- name: Generate Rust bindings
|
||||
run: flutter_rust_bridge_codegen generate
|
||||
|
||||
- name: Setup keys
|
||||
uses: timheuer/base64-to-file@v1
|
||||
with:
|
||||
|
||||
76
.github/workflows/photos-internal-release.yml
vendored
@@ -4,12 +4,12 @@ on:
|
||||
workflow_dispatch: # Manual trigger only
|
||||
|
||||
env:
|
||||
FLUTTER_VERSION: "3.32.8"
|
||||
FLUTTER_VERSION: "3.27.4"
|
||||
ANDROID_KEYSTORE_PATH: "keystore/ente_photos_key.jks"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: macos-latest # Required for iOS builds
|
||||
runs-on: macos-15 # Required for iOS builds
|
||||
environment: "ios-build"
|
||||
permissions:
|
||||
contents: write
|
||||
@@ -19,12 +19,50 @@ jobs:
|
||||
working-directory: mobile/apps/photos
|
||||
|
||||
steps:
|
||||
# Common Setup
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Install Apple Certificate
|
||||
env:
|
||||
MAC_OS_CERTIFICATE: ${{ secrets.MAC_OS_CERTIFICATE }}
|
||||
MAC_OS_CERTIFICATE_PASSWORD: ${{ secrets.MAC_OS_CERTIFICATE_PASSWORD }}
|
||||
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
|
||||
run: |
|
||||
# Create variables
|
||||
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
|
||||
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
|
||||
|
||||
# Import certificate from secrets
|
||||
echo -n "$MAC_OS_CERTIFICATE" | base64 --decode -o $CERTIFICATE_PATH
|
||||
|
||||
# Create temporary keychain
|
||||
security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
|
||||
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
|
||||
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
|
||||
|
||||
# Import certificate to keychain
|
||||
security import $CERTIFICATE_PATH -P "$MAC_OS_CERTIFICATE_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
|
||||
security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
|
||||
|
||||
# Make the keychain the default
|
||||
security list-keychain -d user -s $KEYCHAIN_PATH
|
||||
|
||||
- name: Add provisioning profiles
|
||||
run: |
|
||||
# Decode and install all provisioning profiles
|
||||
PROFILES_HOME="$HOME/Library/MobileDevice/Provisioning Profiles"
|
||||
mkdir -p "$PROFILES_HOME"
|
||||
IFS=$'\n'
|
||||
for profile in ${{ secrets.MAC_OS_PROFILES_BASE64 }}; do
|
||||
PROFILE_PATH="$(mktemp "$PROFILES_HOME"/$(uuidgen).mobileprovision)"
|
||||
echo "$profile" | base64 --decode > "$PROFILE_PATH"
|
||||
echo "Saved provisioning profile to $PROFILE_PATH"
|
||||
done
|
||||
|
||||
# Common Setup
|
||||
|
||||
- name: Setup JDK 17
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
@@ -35,8 +73,11 @@ jobs:
|
||||
with:
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
cache: true
|
||||
|
||||
- name: Get Flutter dependencies
|
||||
run: flutter pub get
|
||||
|
||||
# Android Build
|
||||
# Android Build
|
||||
- name: Setup Android signing key
|
||||
uses: timheuer/base64-to-file@v1
|
||||
with:
|
||||
@@ -59,6 +100,16 @@ jobs:
|
||||
- name: Install fastlane
|
||||
run: gem install fastlane
|
||||
|
||||
- name: Update CocoaPods Specs
|
||||
run: pod repo update
|
||||
working-directory: mobile/apps/photos/ios
|
||||
|
||||
- name: Install CocoaPods dependencies
|
||||
run: |
|
||||
rm -f Podfile.lock
|
||||
pod install
|
||||
working-directory: mobile/apps/photos/ios
|
||||
|
||||
- name: Create ExportOptions.plist
|
||||
run: |
|
||||
cat <<EOF > ios/ExportOptions.plist
|
||||
@@ -70,10 +121,23 @@ jobs:
|
||||
<string>app-store</string>
|
||||
<key>teamID</key>
|
||||
<string>${{ secrets.IOS_TEAM_ID }}</string>
|
||||
<key>provisioningProfiles</key>
|
||||
<dict>
|
||||
<key>io.ente.photos</key>
|
||||
<string>match AppStore io.ente.photos</string>
|
||||
<key>io.ente.frame</key>
|
||||
<string>match AppStore io.ente.frame</string>
|
||||
<key>io.ente.frame.EntePeopleWidget</key>
|
||||
<string>match AppStore io.ente.frame.EntePeopleWidget</string>
|
||||
<key>io.ente.frame.EnteAlbumWidget</key>
|
||||
<string>match AppStore io.ente.frame.EnteAlbumWidget</string>
|
||||
<key>io.ente.frame.EnteMemoryWidget</key>
|
||||
<string>match AppStore io.ente.frame.EnteMemoryWidget</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
EOF
|
||||
|
||||
|
||||
- name: Setup App Store Connect API Key
|
||||
run: |
|
||||
echo '${{ secrets.IOS_API_KEY }}' > api_key.json
|
||||
@@ -83,7 +147,7 @@ jobs:
|
||||
run: |
|
||||
flutter build ipa \
|
||||
--release \
|
||||
--export-options-plist=ExportOptions.plist \
|
||||
--export-options-plist=ios/ExportOptions.plist \
|
||||
--dart-define=cronetHttpNoPlay=true
|
||||
env:
|
||||
SIGNING_TEAM_ID: ${{ secrets.IOS_TEAM_ID }}
|
||||
|
||||
44
.github/workflows/rust-lint.yml
vendored
@@ -1,44 +0,0 @@
|
||||
name: "Lint (rust)"
|
||||
|
||||
on:
|
||||
# Run on every pull request (open or push to it) that changes rust/
|
||||
pull_request:
|
||||
paths:
|
||||
- "rust/**"
|
||||
- ".github/workflows/rust-lint.yml"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
# Cancel in-progress lint runs when a new commit is pushed.
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
RUSTFLAGS: -D warnings
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
working-directory: rust
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
~/.cargo/registry
|
||||
~/.cargo/git
|
||||
target
|
||||
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
|
||||
|
||||
- run: cargo fmt --check
|
||||
|
||||
- run: cargo clippy --all-targets --all-features
|
||||
|
||||
- run: cargo build
|
||||
4
.github/workflows/web-deploy-one.yml
vendored
@@ -29,8 +29,6 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup node and enable yarn caching
|
||||
uses: actions/setup-node@v4
|
||||
@@ -40,7 +38,7 @@ jobs:
|
||||
cache-dependency-path: "web/yarn.lock"
|
||||
|
||||
- name: Install dependencies
|
||||
run: yarn install --frozen-lockfile
|
||||
run: yarn install
|
||||
|
||||
- name: Build ${{ inputs.app }}
|
||||
run: yarn build:${{ inputs.app }}
|
||||
|
||||
4
.github/workflows/web-deploy-preview.yml
vendored
@@ -29,8 +29,6 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup node and enable yarn caching
|
||||
uses: actions/setup-node@v4
|
||||
@@ -40,7 +38,7 @@ jobs:
|
||||
cache-dependency-path: "web/yarn.lock"
|
||||
|
||||
- name: Install dependencies
|
||||
run: yarn install --frozen-lockfile
|
||||
run: yarn install
|
||||
|
||||
- name: Build ${{ inputs.app }}
|
||||
run: yarn build:${{ inputs.app }}
|
||||
|
||||
3
.github/workflows/web-deploy-staging.yml
vendored
@@ -37,7 +37,6 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ steps.select-branch.outputs.branch }}
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup node and enable yarn caching
|
||||
uses: actions/setup-node@v4
|
||||
@@ -47,7 +46,7 @@ jobs:
|
||||
cache-dependency-path: "web/yarn.lock"
|
||||
|
||||
- name: Install dependencies
|
||||
run: yarn install --frozen-lockfile
|
||||
run: yarn install
|
||||
|
||||
- name: Build photos
|
||||
run: yarn build:photos
|
||||
|
||||
24
.github/workflows/web-deploy.yml
vendored
@@ -33,8 +33,6 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup node and enable yarn caching
|
||||
uses: actions/setup-node@v4
|
||||
@@ -44,15 +42,7 @@ jobs:
|
||||
cache-dependency-path: "web/yarn.lock"
|
||||
|
||||
- name: Install dependencies
|
||||
run: yarn install --frozen-lockfile
|
||||
|
||||
- name: Audit dependencies
|
||||
run: |
|
||||
yarn audit --level critical || exit_code=$?
|
||||
if [[ $exit_code -ge 16 ]]; then
|
||||
echo "::error::Yarn audit found critical issues"
|
||||
exit 1
|
||||
fi
|
||||
run: yarn install
|
||||
|
||||
- name: Build photos
|
||||
run: yarn build:photos
|
||||
@@ -64,18 +54,6 @@ jobs:
|
||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
command: pages deploy --project-name=ente --commit-dirty=true --branch=deploy/photos web/apps/photos/out
|
||||
|
||||
- name: Build custom-albums
|
||||
run: yarn build:photos
|
||||
env:
|
||||
NEXT_PUBLIC_ENTE_ONLY_SERVE_ALBUMS_APP: 1
|
||||
|
||||
- name: Publish custom-albums
|
||||
uses: cloudflare/wrangler-action@v3
|
||||
with:
|
||||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
command: pages deploy --project-name=ente --commit-dirty=true --branch=deploy/custom-albums web/apps/photos/out
|
||||
|
||||
- name: Build accounts
|
||||
run: yarn build:accounts
|
||||
|
||||
|
||||
12
.github/workflows/web-lint.yml
vendored
@@ -24,8 +24,6 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup node and enable yarn caching
|
||||
uses: actions/setup-node@v4
|
||||
@@ -34,14 +32,6 @@ jobs:
|
||||
cache: "yarn"
|
||||
cache-dependency-path: "web/yarn.lock"
|
||||
|
||||
- run: yarn install --frozen-lockfile
|
||||
- run: yarn install
|
||||
|
||||
- run: yarn lint
|
||||
|
||||
- name: Audit dependencies
|
||||
run: |
|
||||
yarn audit --level critical || exit_code=$?
|
||||
if [[ $exit_code -ge 16 ]]; then
|
||||
echo "::error::Yarn audit found critical issues"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -48,11 +48,7 @@ See [docs/](docs/README.md) for how to edit these documents.
|
||||
|
||||
## Code contributions
|
||||
|
||||
If you'd like to contribute code, it is best to start small. Consider some well-scoped changes, say like adding more [custom icons to auth](mobile/apps/auth/docs/adding-icons.md), or fixing a specific bug. There is a (possibly outdated) list of tasks with the ["help wanted" or "good first issue"](<https://github.com/ente-io/ente/issues?q=state%3Aopen%20(label%3A%22good%20first%20issue%22%20OR%20label%3A%22help%20wanted%22%20)>) label too.
|
||||
|
||||
If you use any form of AI assistance, please include a co-author attribution in the commit for transparency.
|
||||
|
||||
In your PR, please include before / after screenshots, and clearly indicate the tests that you performed.
|
||||
If you'd like to contribute code, it is best to start small. Consider some well-scoped changes, say like adding more [custom icons to auth](auth/docs/adding-icons.md), or fixing a specific bug.
|
||||
|
||||
Code that changes the behaviour of the product might not get merged, at least not initially. The PR can serve as a discussion bed, but you might find it easier to just start a discussion instead, or post your perspective in the (likely) existing thread about the behaviour change or new feature you wish for.
|
||||
|
||||
|
||||
@@ -142,22 +142,6 @@ var _updateFreeUserStorage = &cobra.Command{
|
||||
},
|
||||
}
|
||||
|
||||
var _sendMail = &cobra.Command{
|
||||
Use: "send-mail <to-email> <from-email> <from-name>",
|
||||
Args: cobra.ExactArgs(3),
|
||||
Short: "Sends a test mail via the admin api",
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
recoverWithLog()
|
||||
var flags = &model.AdminActionForUser{}
|
||||
cmd.Flags().VisitAll(func(f *pflag.Flag) {
|
||||
if f.Name == "admin-user" {
|
||||
flags.AdminEmail = f.Value.String()
|
||||
}
|
||||
})
|
||||
return ctrl.SendTestMail(context.Background(), *flags, args[0], args[1], args[2])
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
rootCmd.AddCommand(_adminCmd)
|
||||
_ = _userDetailsCmd.MarkFlagRequired("admin-user")
|
||||
@@ -175,6 +159,5 @@ func init() {
|
||||
_updateFreeUserStorage.Flags().StringP("user", "u", "", "The email of the user to update subscription for. (required)")
|
||||
// add a flag with no value --no-limit
|
||||
_updateFreeUserStorage.Flags().String("no-limit", "True", "When true, sets 100TB as storage limit, and expiry to current date + 100 years")
|
||||
_sendMail.Flags().StringP("admin-user", "a", "", "The email of the admin user. ")
|
||||
_adminCmd.AddCommand(_userDetailsCmd, _disable2faCmd, _disablePasskeyCmd, _updateFreeUserStorage, _listUsers, _deleteUser, _sendMail)
|
||||
_adminCmd.AddCommand(_userDetailsCmd, _disable2faCmd, _disablePasskeyCmd, _updateFreeUserStorage, _listUsers, _deleteUser)
|
||||
}
|
||||
|
||||
@@ -2,11 +2,10 @@ package cmd
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"runtime"
|
||||
|
||||
"github.com/ente-io/cli/pkg"
|
||||
"github.com/spf13/cobra/doc"
|
||||
"os"
|
||||
"runtime"
|
||||
|
||||
"github.com/spf13/viper"
|
||||
|
||||
@@ -21,6 +20,11 @@ var ctrl *pkg.ClICtrl
|
||||
var rootCmd = &cobra.Command{
|
||||
Use: "ente",
|
||||
Short: "CLI tool for exporting your photos from ente.io",
|
||||
// Uncomment the following line if your bare application
|
||||
// has an action associated with it:
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
fmt.Sprintf("Hello World")
|
||||
},
|
||||
}
|
||||
|
||||
func GenerateDocs() error {
|
||||
|
||||
@@ -139,28 +139,5 @@ func (c *Client) UpdateFreePlanSub(ctx context.Context, userDetails *models.User
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Client) SendTestMail(ctx context.Context, toEmail, fromEmail, fromName string) error {
|
||||
body := map[string]interface{}{
|
||||
"to": []string{toEmail},
|
||||
"fromName": fromName,
|
||||
"fromEmail": fromEmail,
|
||||
"subject": "Test mail from Ente",
|
||||
"body": "This is a test mail from Ente",
|
||||
}
|
||||
r, err := c.restClient.R().
|
||||
SetContext(ctx).
|
||||
SetBody(body).
|
||||
Post("/admin/mail")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if r.IsError() {
|
||||
return &ApiError{
|
||||
StatusCode: r.StatusCode(),
|
||||
Message: r.String(),
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -156,23 +156,6 @@ func (c *ClICtrl) UpdateFreeStorage(ctx context.Context, params model.AdminActio
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *ClICtrl) SendTestMail(ctx context.Context, params model.AdminActionForUser, to, from, fromName string) error {
|
||||
accountCtx, err := c.buildAdminContext(ctx, params.AdminEmail)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = c.Client.SendTestMail(accountCtx, to, from, fromName)
|
||||
if err != nil {
|
||||
if apiErr, ok := err.(*api.ApiError); ok && apiErr.StatusCode == 400 && strings.Contains(apiErr.Message, "Token is too old") {
|
||||
fmt.Printf("Error: old admin token, please re-authenticate using `ente account add` \n")
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
}
|
||||
fmt.Printf("Successfully sent test email to %s\n", to)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *ClICtrl) buildAdminContext(ctx context.Context, adminEmail string) (context.Context, error) {
|
||||
accounts, err := c.GetAccounts(ctx)
|
||||
if err != nil {
|
||||
|
||||
@@ -44,7 +44,8 @@ jobs:
|
||||
# If triggered by a tag, checkout photosd-$tag from the source
|
||||
# repository. Otherwise checkout $source (default: "main").
|
||||
repository: ente-io/ente
|
||||
ref: "${{ startsWith(github.ref, 'refs/tags/v') &&
|
||||
ref:
|
||||
"${{ startsWith(github.ref, 'refs/tags/v') &&
|
||||
format('photosd-{0}', github.ref_name) || ( inputs.source
|
||||
|| 'main' ) }}"
|
||||
|
||||
@@ -109,7 +110,8 @@ jobs:
|
||||
env:
|
||||
# macOS notarization credentials key details
|
||||
APPLE_ID: ${{ secrets.APPLE_ID }}
|
||||
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
|
||||
APPLE_APP_SPECIFIC_PASSWORD:
|
||||
${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
|
||||
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
||||
# Windows Azure Trusted Signing related values
|
||||
# https://www.electron.build/code-signing-win#using-azure-trusted-signing-beta
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"tabWidth": 4,
|
||||
"proseWrap": "always",
|
||||
"objectWrap": "collapse",
|
||||
"plugins": [
|
||||
"prettier-plugin-organize-imports",
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
|
||||
## v1.7.15 (Unreleased)
|
||||
|
||||
- Custom domains.
|
||||
- Support Czech translations.
|
||||
- .
|
||||
|
||||
## v1.7.14
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
{
|
||||
"tabWidth": 4
|
||||
"tabWidth": 4,
|
||||
"proseWrap": "always"
|
||||
}
|
||||
|
||||
@@ -26,10 +26,6 @@ export const sidebar = [
|
||||
text: "Collecting photos",
|
||||
link: "/photos/features/collect",
|
||||
},
|
||||
{
|
||||
text: "Custom domains",
|
||||
link: "/photos/features/custom-domains/",
|
||||
},
|
||||
{
|
||||
text: "Deduplicate",
|
||||
link: "/photos/features/deduplicate",
|
||||
@@ -346,17 +342,13 @@ export const sidebar = [
|
||||
text: "General",
|
||||
link: "/self-hosting/troubleshooting/misc",
|
||||
},
|
||||
{
|
||||
text: "Docker / quickstart",
|
||||
link: "/self-hosting/troubleshooting/docker",
|
||||
},
|
||||
{
|
||||
text: "Uploads",
|
||||
link: "/self-hosting/troubleshooting/uploads",
|
||||
},
|
||||
{
|
||||
text: "Ente CLI",
|
||||
link: "/self-hosting/troubleshooting/cli",
|
||||
text: "Docker / quickstart",
|
||||
link: "/self-hosting/troubleshooting/docker",
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Migrating to Ente Auth
|
||||
description: Guides for migrating your existing 2FA tokens into or out of Ente Auth
|
||||
description:
|
||||
Guides for migrating your existing 2FA tokens into or out of Ente Auth
|
||||
---
|
||||
|
||||
# Migrating to/from Ente Auth
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Desktop app FAQ
|
||||
description: An assortment of frequently asked questions about Ente Photos desktop app
|
||||
description:
|
||||
An assortment of frequently asked questions about Ente Photos desktop app
|
||||
---
|
||||
|
||||
# Desktop app FAQ
|
||||
|
||||
@@ -67,7 +67,7 @@ reliable as any one can be.
|
||||
If you would like to fund the development of this project, please consider
|
||||
[subscribing](https://ente.io/download).
|
||||
|
||||
## How do I pronounce Ente?
|
||||
## How do I pronounce ente?
|
||||
|
||||
It's like cafe 😊. kaf-_ay_. en-_tay_.
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Security and Privacy FAQ
|
||||
description: Comprehensive information about security and privacy measures in Ente Photos
|
||||
description:
|
||||
Comprehensive information about security and privacy measures in Ente Photos
|
||||
---
|
||||
|
||||
# Security and Privacy FAQ
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Cast
|
||||
description: Casting your photos on to a large screen or a TV or a Chromecast device
|
||||
description:
|
||||
Casting your photos on to a large screen or a TV or a Chromecast device
|
||||
---
|
||||
|
||||
# Cast
|
||||
|
||||
|
Before Width: | Height: | Size: 74 KiB |
@@ -1,109 +0,0 @@
|
||||
---
|
||||
title: Custom domains
|
||||
description: Use your own domain when sharing photos and videos stored in Ente Photos
|
||||
---
|
||||
|
||||
# Custom domains
|
||||
|
||||
Custom domains allow you to serve your public links with your own personalized domain.
|
||||
|
||||
For example, if I have an Ente album and wish to share it with my friends, I can go to the album's sharing settings and create a public link. When I copy this link, it will of the form of
|
||||
|
||||
```
|
||||
https://albums.ente.io/?t=...
|
||||
```
|
||||
|
||||
The custom domains feature allows you to instead create a link that uses your own domain, say
|
||||
|
||||
```
|
||||
https://pics.example.org/?t=...
|
||||
```
|
||||
|
||||
You don't need to run any servers or manage any services, Ente will still host and serve your album for you, the only thing that changes is that you can serve your links using your personalized domain.
|
||||
|
||||
## Availability
|
||||
|
||||
The custom domains feature requires the ability to publicly share albums which for abuse prevention reasons can only be done by people with an active Ente subscription.
|
||||
|
||||
## Setup
|
||||
|
||||
The setup involves two steps:
|
||||
|
||||
1. Letting Ente know about the domain you wish to use for serving your public links
|
||||
2. Updating your DNS settings to point your domain (or subdomain) to **my.ente.io**
|
||||
|
||||
For people who are comfortable with changing DNS settings on their domain provider, this entire process is very simple will take a minute. For people who are not comfortable with changing DNS, we will provide a more detailed breakdown below.
|
||||
|
||||
Let's dive in.
|
||||
|
||||
To make the process concrete, let's assume we're trying to use _pics.example.org_ as our custom domain. Note that there is no restriction to use a subdomain, a top level domain can be used as a custom domain too. That is, either of _example.org_ or _subdomain.example.org_ is fine, Ente will work with both.
|
||||
|
||||
### Step 1 - Link your domain
|
||||
|
||||
The first step is to let Ente know about the domain or subdomain you wish to use by linking it to your account.
|
||||
|
||||
> [!WARNING]
|
||||
>
|
||||
> Currently (Sep 2025) the ability to link a custom domain is only present in Ente's web app, [web.ente.io](https://web.ente.io).
|
||||
|
||||
Head over to Preferences > Custom domains, in the domain field enter "pics.example.org" (replace with your subdomain) and press "Save". That's it. The linking is done.
|
||||
|
||||
### Step 2 - Add DNS entry
|
||||
|
||||
The second step is to add a CNAME entry in your DNS provider that forwards requests for pics.example.org (replace with your subdomain) to **my.ente.io**.
|
||||
|
||||
Specifically, you need to add a `CNAME record` from the domain (or subdomain) of your choice to `my.ente.io`. You can leave the `TTL` at its default.
|
||||
|
||||
| Record Type | Name | Value | TTL |
|
||||
| ----------- | :------------------------: | -----------: | -------------- |
|
||||
| CNAME | Your subdomain, e.g `pics` | `my.ente.io` | Auto (default) |
|
||||
|
||||
The exact steps for doing this depend on the DNS provider that you're using.
|
||||
|
||||
> Your DNS provider usually is the service from which you bought your domain. The domain name seller will provide some sort of an admin panel where you can configure your DNS settings.
|
||||
|
||||
As concrete examples, here is how this step would look for Cloudflare:
|
||||
|
||||

|
||||
|
||||
Note that orange proxy option is off. And here is how it would look for Namecheap:
|
||||
|
||||

|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> The examples are using "pics" as the subdomain, but that's just an example, you can use anything you like (or use "@" if you'd like to use the root domain itself).
|
||||
|
||||
The time it takes for DNS records to update is dependent on your DNS provider. Usually the changes should start reflecting within a few minutes, and should almost always reflect within an hour.
|
||||
|
||||
Once the DNS changes have been applied, then you can take any public link to your shared albums, replace `albums.ente.io` with your choice (e.g. `pics.example.org`), and the link will still work.
|
||||
|
||||
You don't need to do this manually though, the apps will do it for you. More on this in the next section. But first, some troubleshooting tips.
|
||||
|
||||
### Troubleshooting
|
||||
|
||||
If your domain is not working, go through the following checklist.
|
||||
|
||||
- The CNAME should be from your domain to my.ente.io, not the other way around. That is, `pics.example.org => my.ente.io`.
|
||||
|
||||
- If you're using Cloudflare DNS, make sure that the "Orange" proxy status toggle is off, and the Proxy status is the "Grey" DNS only.
|
||||
|
||||
## Using
|
||||
|
||||
Using is trivial. When you go to an album's sharing options and copy the link to it, Ente will automatically copy the link that uses your configured domain.
|
||||
|
||||
> [!WARNING]
|
||||
>
|
||||
> Currently (Sep 2025) the ability to automatically substitute your custom domain is present in Ente's web and mobile apps, but not in the desktop app (The next desktop version to be released will have that ability too).
|
||||
|
||||
## Unsetting
|
||||
|
||||
To stop using your custom domain, we need to undo the two steps we did during setup.
|
||||
|
||||
1. Unlink your domain in Ente. This can be done just by going to Preferences > Custom Domains, clearing the value in the "Domain" input and pressing "Update".
|
||||
|
||||
2. Remove the CNAME record you added during setup in your DNS provider.
|
||||
|
||||
## Implementation
|
||||
|
||||
Our engineers also wrote [explainer](https://ente.io/blog/custom-domains/) of how this works behind the scenes.
|
||||
|
Before Width: | Height: | Size: 41 KiB |
@@ -6,7 +6,7 @@ description: Removing duplicates photos using Ente Photos
|
||||
# Deduplicate
|
||||
|
||||
Ente performs two different duplicate detections: one during uploads, and one
|
||||
that can be manually run afterwards to remove duplicates and very similar files across albums.
|
||||
that can be manually run afterwards to remove duplicates across albums.
|
||||
|
||||
## During uploads
|
||||
|
||||
@@ -16,7 +16,7 @@ When uploading, Ente will ignore exact duplicate files. This allows you to
|
||||
resume interrupted uploads, or drag and drop the same folder, or reinstall the
|
||||
app, and expect Ente to automatically skip duplicates and only add new files.
|
||||
|
||||
The duplicate detection works slightly differently on each platform, to cater to
|
||||
The duplicate detection works slightly different on each platform, to cater to
|
||||
the platform's nuances.
|
||||
|
||||
#### Mobile
|
||||
@@ -48,7 +48,7 @@ to album", and the actual files are not re-uploaded.
|
||||
|
||||
## Manual deduplication
|
||||
|
||||
Ente provides a tool for manual de-duplication in _Settings → Backup → Free up space →
|
||||
Ente also provides a tool for manual de-duplication in _Settings → Backup →
|
||||
Remove duplicates_. This is useful if you have an existing library with
|
||||
duplicates across different albums, but wish to keep only one copy.
|
||||
|
||||
@@ -57,13 +57,6 @@ single copy, and add symlinks to this copy within all existing albums. So your
|
||||
existing album structure remains unchanged, while the space consumed by the
|
||||
duplicate data is freed up.
|
||||
|
||||
## Filtering similar images
|
||||
|
||||
Ente also provides a tool for manual removal of images that are similar, but not the exact same, using our private ML. This feature can be found in _Settings → Backup → Free up space →
|
||||
Similar images_. This is useful if you've taken a lot of similar photos, potentiall even in different albums, and want to keep only the best ones.
|
||||
|
||||
During this filtering process you can choose which photos to keep and which to delete for each set of similar images. Ente will then automatically add symlinks for the kept photos to any albums that only had the deleted images. This way you can easily prune similar images, without worrying about accidentally removing the best ones from a certain album.
|
||||
|
||||
## Adding to Ente album creates symlinks
|
||||
|
||||
Note that once a file is in Ente, adding it to another Ente album will create a
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Family plans
|
||||
description: Share your Ente Photos plan with your family members with no extra cost
|
||||
description:
|
||||
Share your Ente Photos plan with your family members with no extra cost
|
||||
---
|
||||
|
||||
# Family plans
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Watch folder
|
||||
description: Automatic syncing of selected folders using the Ente Photos desktop app
|
||||
description:
|
||||
Automatic syncing of selected folders using the Ente Photos desktop app
|
||||
---
|
||||
|
||||
# Watch folders
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Import from local hard disk
|
||||
description: Migrating to Ente Photos by importing data from your local hard disk
|
||||
description:
|
||||
Migrating to Ente Photos by importing data from your local hard disk
|
||||
---
|
||||
|
||||
# Import photos from your local hard disk
|
||||
|
||||
@@ -99,17 +99,3 @@ If you do want to run it from the command line, you can do so by passing the
|
||||
|
||||
For more details, see this upstream issue on
|
||||
[electron](https://github.com/electron/electron/issues/17972).
|
||||
|
||||
### Application reporting offline despite Internet connectivity
|
||||
|
||||
Due to unreliability of usage of `navigator.onLine` in Linux, the app may report that you are offline, even though the internet connection is functional.
|
||||
|
||||
You can resolve the issue by adding a dummy network interface using the following command:
|
||||
|
||||
```shell
|
||||
ip link add dummy0 type dummy
|
||||
ip addr add 10.10.10.1/24 dev dummy0
|
||||
ip link set dummy0 up
|
||||
```
|
||||
|
||||
Once the interface is up, Ente correctly detects that the system is online.
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Files not uploading
|
||||
description: Troubleshooting when files are not uploading from your Ente Photos app
|
||||
description:
|
||||
Troubleshooting when files are not uploading from your Ente Photos app
|
||||
---
|
||||
|
||||
# Files not uploading
|
||||
|
||||
@@ -8,12 +8,6 @@ description: Guide to configuring Ente CLI for Self Hosted Instance
|
||||
If you are self-hosting, you can configure Ente CLI to export data & perform
|
||||
basic administrative actions.
|
||||
|
||||
::: tip Installing Ente CLI
|
||||
|
||||
For instructions on installing the Ente CLI, see the [README available on Github](https://github.com/ente-io/ente/tree/main/cli/README.md).
|
||||
|
||||
:::
|
||||
|
||||
## Step 1: Configure endpoint
|
||||
|
||||
To do this, first configure the CLI to use your server's endpoint.
|
||||
|
||||
@@ -63,15 +63,12 @@ It has no relation to Backblaze, Wasabi or Scaleway.
|
||||
Each bucket's endpoint, region, key and secret should be configured accordingly
|
||||
if using an external bucket.
|
||||
|
||||
If a bucket has SSL support enabled, set `s3.are_local_buckets` to `false`. Enable path-style URL by setting `s3.use_path_style_urls` to `true`.
|
||||
Additionally, you can enable SSL and path-style URL for specific buckets, which
|
||||
provides flexibility for storage. If this is not configured, top level
|
||||
configuration (`s3.are_local_buckets` and `s3.use_path_style_urls`) is used.
|
||||
|
||||
::: note
|
||||
|
||||
You can configure this for individual buckets over defining top-level configuration if you are using the latest server image (August 2025)
|
||||
|
||||
:::
|
||||
|
||||
A sample configuration for `b2-eu-cen` is provided, which can be used for other 2 buckets as well:
|
||||
A sample configuration for `b2-eu-cen` is provided, which can be used for other
|
||||
2 buckets as well:
|
||||
|
||||
```yaml
|
||||
b2-eu-cen:
|
||||
|
||||
@@ -89,7 +89,7 @@ cast.ente.yourdomain.tld {
|
||||
Reload Caddy for changes to take effect.
|
||||
|
||||
```shell
|
||||
sudo systemctl reload caddy
|
||||
sudo systemctl caddy reload
|
||||
```
|
||||
|
||||
## Step 4: Verify the setup
|
||||
|
||||
@@ -22,7 +22,8 @@ can achieve this the following steps:
|
||||
# Change the DB name and DB user name if you use different
|
||||
# values.
|
||||
# If using Docker
|
||||
docker exec -it <postgres-ente-container-name> sh
|
||||
|
||||
docker exec -it <postgres-ente-container-name>
|
||||
psql -U pguser -d ente_db
|
||||
|
||||
# Or when using psql directly
|
||||
@@ -107,11 +108,24 @@ emails having @example.com as suffix.
|
||||
|
||||
### Send email with verification code
|
||||
|
||||
You can configure SMTP for sending verification code e-mails to users, if you do
|
||||
not wish to hardcode OTTs and have larger audience.
|
||||
You can configure SMTP for sending verification code e-mails to users, which is
|
||||
efficient if you do not know mail addresses of people for who you want to
|
||||
hardcode OTTs or if you are serving larger audience.
|
||||
|
||||
For more information on configuring email, check out the
|
||||
[email configuration](/self-hosting/installation/config#email) section.
|
||||
Set the host and port accordingly with your credentials in `museum.yaml`
|
||||
|
||||
```yaml
|
||||
smtp:
|
||||
host:
|
||||
port:
|
||||
# Optional username and password if using local relay server
|
||||
username:
|
||||
password:
|
||||
# Email address used for sending emails (this mail's credentials have to be provided)
|
||||
email:
|
||||
# Optional name for sender
|
||||
sender-name:
|
||||
```
|
||||
|
||||
## Disable registrations
|
||||
|
||||
|
||||
@@ -7,8 +7,8 @@ description: Getting started with self-hosting Ente
|
||||
|
||||
If you're looking to spin up Ente on your server, you are in the right place!
|
||||
|
||||
Our entire source code,
|
||||
[including the server](https://ente.io/blog/open-sourcing-our-server/) is open
|
||||
Our entire source code
|
||||
([including the server](https://ente.io/blog/open-sourcing-our-server/)) is open
|
||||
source. This is the same code we use on production.
|
||||
|
||||
For a quick preview, make sure your system meets the requirements mentioned
|
||||
@@ -35,12 +35,9 @@ This creates a directory `my-ente` in the current working directory, prompts to
|
||||
start the cluster with needed containers after pulling the images required to
|
||||
run Ente.
|
||||
|
||||
::: info
|
||||
|
||||
Make sure to modify the default values in `compose.yaml` and `museum.yaml` if
|
||||
you wish to change endpoints, bucket configuration or server configuration.
|
||||
|
||||
:::
|
||||
::: note Make sure to modify the default values in `compose.yaml` and
|
||||
`museum.yaml` if you wish to change endpoints, bucket configuration or server
|
||||
configuration. :::
|
||||
|
||||
## Try the web app
|
||||
|
||||
|
||||
@@ -45,25 +45,6 @@ cp example.yaml museum.yaml
|
||||
Change the values present in `.env` file along with `museum.yaml` file
|
||||
accordingly.
|
||||
|
||||
::: tip
|
||||
|
||||
Make sure to enter the correct values for the database and object storage.
|
||||
|
||||
You should consider generating values for JWT and encryption keys for emails if
|
||||
you intend to use for long-term needs.
|
||||
|
||||
You can do by running the following command inside `ente/server`, assuming you
|
||||
cloned the repository to `ente`:
|
||||
|
||||
```shell
|
||||
# Change into the ente/server
|
||||
cd ente/server
|
||||
# Generate secrets
|
||||
go run tools/gen-random-keys/main.go
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
## Step 3: Start the cluster
|
||||
|
||||
Start the cluster by running the following command:
|
||||
|
||||
@@ -78,9 +78,6 @@ used for Compose and quickstart for ease of use.)
|
||||
|
||||
### Database
|
||||
|
||||
The `db` section is used for configuring database connectivity. Ensure you
|
||||
provide correct credentials for proper connectivity within Museum.
|
||||
|
||||
| Variable | Description | Default |
|
||||
| ------------- | -------------------------- | ----------- |
|
||||
| `db.host` | DB hostname | `localhost` |
|
||||
@@ -96,14 +93,11 @@ provide correct credentials for proper connectivity within Museum.
|
||||
The `s3` section within `museum.yaml` is by default configured to use local
|
||||
MinIO buckets when using `quickstart.sh` or Docker Compose.
|
||||
|
||||
If you wish to use an external S3 provider with SSL, you can edit the configuration with
|
||||
your provider's credentials, and set `s3.are_local_buckets` to `false`. Additionally, you can configure this for specific buckets in the corresponding bucket sections in the Compose file.
|
||||
If you wish to use an external S3 provider, you can edit the configuration with
|
||||
your provider's credentials, and set `are_local_buckets` to `false`.
|
||||
|
||||
If you are using default MinIO, it is accessible at port `3200`. Web Console can
|
||||
be accessed by enabling port `3201` in the Compose file.
|
||||
|
||||
For more information on object storage configuration, check our
|
||||
[documentation](/self-hosting/administration/object-storage).
|
||||
MinIO uses the port `3200` for API Endpoints. Web Console can be accessed at
|
||||
http://localhost:3201 by enabling port `3201` in the Compose file.
|
||||
|
||||
If you face any issues related to uploads then check out
|
||||
[CORS](/self-hosting/administration/object-storage#cors-cross-origin-resource-sharing)
|
||||
@@ -111,11 +105,11 @@ and [troubleshooting](/self-hosting/troubleshooting/uploads) sections.
|
||||
|
||||
| Variable | Description | Default |
|
||||
| -------------------------------------- | -------------------------------------------- | ------- |
|
||||
| `s3.b2-eu-cen` | Primary hot storage bucket configuration | |
|
||||
| `s3.b2-eu-cen` | Primary hot storage S3 config | |
|
||||
| `s3.wasabi-eu-central-2-v3.compliance` | Whether to disable compliance lock on delete | `true` |
|
||||
| `s3.scw-eu-fr-v3` | Cold storage bucket configuration | |
|
||||
| `s3.wasabi-eu-central-2-v3` | Secondary hot storage configuration | |
|
||||
| `s3.are_local_buckets` | | `true` |
|
||||
| `s3.scw-eu-fr-v3` | Optional secondary S3 config | |
|
||||
| `s3.wasabi-eu-central-2-derived` | Derived data storage | |
|
||||
| `s3.are_local_buckets` | Use local MinIO-compatible storage | `false` |
|
||||
| `s3.use_path_style_urls` | Enable path-style URLs for MinIO | `false` |
|
||||
|
||||
### Encryption Keys
|
||||
@@ -152,29 +146,6 @@ go run tools/gen-random-keys/main.go
|
||||
|
||||
### Email
|
||||
|
||||
You may wish to send emails for verification codes instead of
|
||||
[hardcoding them](/self-hosting/administration/users#use-hardcoded-otts). In
|
||||
such cases, you can configure SMTP (or Zoho Transmail, for bulk emails).
|
||||
|
||||
Set the host and port accordingly with your credentials in `museum.yaml`
|
||||
|
||||
You may skip the username and password if using a local relay server.
|
||||
|
||||
```yaml
|
||||
smtp:
|
||||
host:
|
||||
port:
|
||||
# Optional username and password if using local relay server
|
||||
username:
|
||||
password:
|
||||
# Email address used for sending emails (this mail's credentials have to be provided)
|
||||
email:
|
||||
# Optional name for sender
|
||||
sender-name:
|
||||
# Optional encryption
|
||||
encryption:
|
||||
```
|
||||
|
||||
| Variable | Description | Default |
|
||||
| ------------------ | ---------------------------- | ------- |
|
||||
| `smtp.host` | SMTP server host | |
|
||||
@@ -183,7 +154,6 @@ smtp:
|
||||
| `smtp.password` | SMTP auth password | |
|
||||
| `smtp.email` | Sender email address | |
|
||||
| `smtp.sender-name` | Custom name for email sender | |
|
||||
| `smtp.encryption` | Encryption method (tls, ssl) | |
|
||||
| `transmail.key` | Zeptomail API key | |
|
||||
|
||||
### WebAuthn Passkey Support
|
||||
|
||||
@@ -92,9 +92,9 @@ git clone https://github.com/ente-io/ente
|
||||
2. Build the server. The server binary should be available as `./main` relative
|
||||
to `server` directory
|
||||
|
||||
```shell
|
||||
go build cmd/museum/main.go
|
||||
```
|
||||
``` shell
|
||||
go build cmd/museum/main.go
|
||||
```
|
||||
|
||||
3. Create `museum.yaml` file inside `server` for configuring the needed
|
||||
variables. You can copy the templated configuration file for editing with
|
||||
@@ -104,25 +104,6 @@ git clone https://github.com/ente-io/ente
|
||||
cp config/example.yaml ./museum.yaml
|
||||
```
|
||||
|
||||
::: tip
|
||||
|
||||
Make sure to enter the correct values for the database and object storage.
|
||||
|
||||
You should consider generating values for JWT and encryption keys for emails
|
||||
if you intend to use for long-term needs.
|
||||
|
||||
You can do by running the following command inside `ente/server`, assuming
|
||||
you cloned the repository to `ente`:
|
||||
|
||||
```shell
|
||||
# Change into the ente/server
|
||||
cd ente/server
|
||||
# Generate secrets
|
||||
go run tools/gen-random-keys/main.go
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
4. Run the server
|
||||
|
||||
```shell
|
||||
|
||||
@@ -46,7 +46,7 @@ If running Museum without Docker, the code should be visible in the terminal
|
||||
# Change the DB name and DB user name if you use different
|
||||
# values.
|
||||
|
||||
# If using Docker docker exec -it <postgres-ente-container-name> sh
|
||||
# If using Docker docker exec -it <postgres-ente-container-name>
|
||||
psql -U pguser -d ente_db
|
||||
|
||||
# Or when using psql directly
|
||||
@@ -159,7 +159,7 @@ apps](web-dev-settings.png){width=400px}
|
||||
## Step 7: Configure Ente CLI
|
||||
|
||||
You can download Ente CLI from
|
||||
[here](https://github.com/ente-io/ente/releases?q=tag%3Acli).
|
||||
[here](https://github.com/ente-io/ente/releases?q=tag%3Acli)
|
||||
|
||||
Check our [documentation](/self-hosting/administration/cli) on how to use Ente
|
||||
CLI for managing self-hosted instances.
|
||||
|
||||
@@ -1,52 +0,0 @@
|
||||
---
|
||||
title: Ente CLI - Self-hosting
|
||||
description: A quick hotfix for keyring errors while running Ente CLI.
|
||||
---
|
||||
|
||||
# Ente CLI
|
||||
|
||||
## Secrets
|
||||
|
||||
Ente CLI makes use of your system keyring for storing sensitive information such
|
||||
as passwords.
|
||||
|
||||
There are 2 ways to address keyring-related error:
|
||||
|
||||
### Install system keyring
|
||||
|
||||
This is the recommended method as it is considerably secure than the latter.
|
||||
|
||||
If you are using Linux for accessing Ente CLI with, you can install a system
|
||||
keyring manager such as `gnome-keyring`, `kwallet`, etc. via your distribution's
|
||||
package manager.
|
||||
|
||||
For Ubuntu/Debian based distributions, you can install `gnome-keyring` via `apt`
|
||||
|
||||
```shell
|
||||
sudo apt install gnome-keyring
|
||||
```
|
||||
|
||||
Now you can use Ente CLI for adding account, which will trigger your system's
|
||||
keyring.
|
||||
|
||||
### Configure secrets path
|
||||
|
||||
In case of using Ente CLI on server environment, you may not be able to install
|
||||
system keyring. In such cases, you can configure Ente CLI to use a text file for
|
||||
saving the secrets.
|
||||
|
||||
Set `ENTE_CLI_SECRETS_PATH` environment variable in your shell's configuration
|
||||
file (`~/.bashrc`, `~/.zshrc`, or other corresponding file)
|
||||
|
||||
```shell
|
||||
# Replace ./secrets.txt with the path to secrets file
|
||||
# that you are using for saving.
|
||||
# IMPORTANT: Make sure it is stored in a secure place.
|
||||
export ENTE_CLI_SECRETS_PATH=./secrets.txt
|
||||
```
|
||||
|
||||
When you run Ente CLI, and if the file doesn't exist, Ente CLI will create it
|
||||
and fill it with a random 32 character encryption key.
|
||||
|
||||
If you create the file, please fill it with a cryptographically generated 32
|
||||
byte string.
|
||||
@@ -17,20 +17,19 @@ description: Fixing Docker-related errors when trying to self-host Ente
|
||||
|
||||
## post_start
|
||||
|
||||
The Docker compose file used if relying on quickstart script or installation
|
||||
using Docker Compose uses the "post_start" lifecycle hook to provision the MinIO
|
||||
instance.
|
||||
The `server/compose.yaml` Docker compose file uses the "post_start" lifecycle
|
||||
hook to provision the MinIO instance.
|
||||
|
||||
The lifecycle hook **requires Docker Compose version 2.30.0+**, and if you're
|
||||
using an older version of Docker Compose you will see an error like this:
|
||||
using an older version of docker compose you will see an error like this:
|
||||
|
||||
```
|
||||
validating compose.yaml: services.minio Additional property post_start is not allowed
|
||||
```
|
||||
|
||||
The easiest way to resolve this is to upgrade your Docker Compose.
|
||||
The easiest way to resolve this is to upgrade your Docker compose.
|
||||
|
||||
If you cannot update your Docker Compose version, then alternatively you can
|
||||
If you cannot update your Docker compose version, then alternatively you can
|
||||
perform the same configuration by removing the "post_start" hook, and adding a
|
||||
new service definition:
|
||||
|
||||
@@ -71,11 +70,11 @@ supports the `start_interval` property on the health check.
|
||||
|
||||
## Postgres authentication failed
|
||||
|
||||
If you are getting Postgres password authentication failures when starting your
|
||||
If you're getting Postgres password authentication failures when starting your
|
||||
cluster, then you might be using a stale Docker volume.
|
||||
|
||||
If you are getting an error of the following form (pasting a full example for
|
||||
easier greppability):
|
||||
In more detail, if you're getting an error of the following form (pasting a full
|
||||
example for easier greppability):
|
||||
|
||||
```
|
||||
museum-1 | panic: pq: password authentication failed for user "pguser"
|
||||
@@ -93,13 +92,9 @@ is expecting.
|
||||
|
||||
There are 2 possibilities:
|
||||
|
||||
1. If you are using Docker Compose for running Ente from source, you might not
|
||||
have set the same credentials in `.env` and `museum.yaml` inside
|
||||
`server/config` directory. Edit the values to make sure the correct
|
||||
credentials are being used.
|
||||
2. When you have created a cluster in `my-ente` directory on running
|
||||
`quickstart.sh` and later deleted it, only to create another cluster with
|
||||
same `my-ente` directory.
|
||||
1. When you have created a cluster in `my-ente` directory on running
|
||||
`quickstart.sh` and later deleted it, only to create another cluster with
|
||||
same `my-ente` directory.
|
||||
|
||||
However, by deleting the directory, the Docker volumes are not deleted.
|
||||
|
||||
@@ -134,7 +129,12 @@ There are 2 possibilities:
|
||||
|
||||
## MinIO provisioning error
|
||||
|
||||
If you encounter similar logs while starting your Docker Compose cluster
|
||||
MinIO has deprecated the `mc config` command in favor of `mc alias set`
|
||||
resulting in failure in execution of the command for creating bucket using
|
||||
`post_start` hook.
|
||||
|
||||
You may encounter similar logs while trying to start the cluster if you are
|
||||
using the older command (provided by default in `quickstart.sh`):
|
||||
|
||||
```
|
||||
my-ente-minio-1 -> | Waiting for minio...
|
||||
@@ -142,8 +142,9 @@ my-ente-minio-1 -> | Waiting for minio...
|
||||
my-ente-minio-1 -> | Waiting for minio...
|
||||
```
|
||||
|
||||
This could be due to usage of deprecated MinIO `mc config` command. Changing
|
||||
`mc config host h0 add` to `mc alias set h0` resolves this.
|
||||
This can be resolved by changing
|
||||
`mc config host h0 add http://minio:3200 $minio_user $minio_pass` to
|
||||
`mc alias set h0 http://minio:3200 $minio_user $minio_pass`
|
||||
|
||||
Thus the updated `post_start` will look as follows for `minio` service:
|
||||
|
||||
@@ -155,6 +156,13 @@ Thus the updated `post_start` will look as follows for `minio` service:
|
||||
sh -c '
|
||||
#!/bin/sh
|
||||
while ! mc alias set h0 http://minio:3200 your_minio_user your_minio_pass 2>/dev/null
|
||||
...
|
||||
do
|
||||
echo "Waiting for minio..."
|
||||
sleep 0.5
|
||||
done
|
||||
cd /data
|
||||
mc mb -p b2-eu-cen
|
||||
mc mb -p wasabi-eu-central-2-v3
|
||||
mc mb -p scw-eu-fr-v3
|
||||
'
|
||||
```
|
||||
|
||||
38
docs/docs/self-hosting/troubleshooting/keyring.md
Normal file
@@ -0,0 +1,38 @@
|
||||
---
|
||||
title: Ente CLI Secrets - Self-hosting
|
||||
description: A quick hotfix for keyring errors while running Ente CLI.
|
||||
---
|
||||
|
||||
# Ente CLI Secrets
|
||||
|
||||
Ente CLI makes use of system keyring for storing sensitive information like your
|
||||
passwords. And running the CLI straight out of the box might give you some
|
||||
errors related to keyrings in some case.
|
||||
|
||||
Follow the below steps to run Ente CLI and also avoid keyrings errors.
|
||||
|
||||
Run:
|
||||
|
||||
```shell
|
||||
# export the secrets path
|
||||
export ENTE_CLI_SECRETS_PATH=./<path-to-secrets.txt>
|
||||
|
||||
./ente-cli
|
||||
```
|
||||
|
||||
You can also add the above line to your shell's rc file, to prevent the need to
|
||||
export manually every time.
|
||||
|
||||
Then one of the following:
|
||||
|
||||
1. If the file doesn't exist, Ente CLI will create it and fill it with a random
|
||||
32 character encryption key.
|
||||
2. If you do create the file, please fill it with a cryptographically generated
|
||||
32 byte string.
|
||||
|
||||
And you are good to go.
|
||||
|
||||
## References
|
||||
|
||||
- [Ente CLI Secrets Path](https://www.reddit.com/r/selfhosted/comments/1gc09il/comment/lu2hox2/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button)
|
||||
- [Keyrings](https://man7.org/linux/man-pages/man7/keyrings.7.html)
|
||||
@@ -1,167 +0,0 @@
|
||||
# Ente Log Viewer
|
||||
|
||||
A web-based log viewer for analyzing Ente application logs. This tool provides similar functionality to the mobile log viewer, allowing you to upload, filter, and analyze log files from customer support requests.
|
||||
|
||||
## Features
|
||||
|
||||
### 📁 File Upload
|
||||
- Drag and drop ZIP files containing log files
|
||||
- Automatic extraction and parsing of log files
|
||||
- Support for daily log files format (YYYY-M-D.log)
|
||||
|
||||
### 🔍 Search and Filtering
|
||||
- **Text Search**: Search through log messages, logger names, and error content
|
||||
- **Logger Filtering**: Use `logger:ServiceName` syntax to filter by specific loggers
|
||||
- **Wildcard Support**: Use `logger:Auth*` to match all loggers starting with "Auth"
|
||||
- **Level Filtering**: Filter by log levels (SEVERE, WARNING, INFO, etc.)
|
||||
- **Process Filtering**: Filter by foreground/background processes
|
||||
- **Timeline Filtering**: Filter by date/time ranges
|
||||
|
||||
### 📊 Analytics
|
||||
- Logger statistics showing most active components
|
||||
- Log level distribution charts
|
||||
- Click-to-filter from analytics charts
|
||||
|
||||
### 🎨 UI Features
|
||||
- **Color-coded log levels**: Red for SEVERE, orange for WARNING, etc.
|
||||
- **Process indicators**: Visual distinction between foreground and background processes
|
||||
- **Active filter chips**: Visual indication of applied filters with easy removal
|
||||
- **Log detail view**: Click any log entry for detailed information
|
||||
- **Sort options**: Sort by newest first or oldest first
|
||||
- **Responsive design**: Works on desktop and mobile devices
|
||||
|
||||
### 📤 Export
|
||||
- Export filtered logs as text files
|
||||
- Copy individual log entries to clipboard
|
||||
- Maintain original formatting and error details
|
||||
|
||||
## Usage
|
||||
|
||||
### Starting the Application
|
||||
|
||||
1. **Local Development**:
|
||||
```bash
|
||||
cd infra/experiments/logs-viewer
|
||||
python3 -m http.server 8080
|
||||
```
|
||||
Open http://localhost:8080 in your browser
|
||||
|
||||
2. **Upload Log Files**:
|
||||
- Drag and drop a ZIP file containing `.log` files
|
||||
- Or click "Choose ZIP File" to browse for files
|
||||
|
||||
### Log Format Support
|
||||
|
||||
The viewer understands the Ente log format as generated by `super_logging.dart`:
|
||||
|
||||
```
|
||||
[process] [loggerName] [LEVEL] [timestamp] message
|
||||
```
|
||||
|
||||
**Examples**:
|
||||
- `[bg] [SyncService] [INFO] [2025-08-24 01:36:03.677678] Syncing started`
|
||||
- `[CollectionsService] [WARNING] [2025-08-24 01:36:04.123456] Connection failed`
|
||||
|
||||
**Multi-line Error Support**:
|
||||
- Automatically parses `⤷` error detail lines
|
||||
- Extracts stack traces and error IDs
|
||||
- Handles inline error messages and exceptions
|
||||
|
||||
### Filtering Examples
|
||||
|
||||
- **Search by text**: `connection failed`
|
||||
- **Filter by logger**: `logger:SyncService`
|
||||
- **Multiple loggers**: `logger:Sync* logger:Collection*`
|
||||
- **Combined search**: `logger:Auth* login failed`
|
||||
|
||||
### Keyboard Shortcuts
|
||||
|
||||
- **Search**: Click search bar or start typing
|
||||
- **Clear search**: Click X button or clear the input
|
||||
- **Sort toggle**: Click sort arrow button
|
||||
- **Filter dialog**: Click filter button
|
||||
|
||||
## Technical Details
|
||||
|
||||
### Supported Log Levels
|
||||
- **SHOUT**: Purple - Highest priority
|
||||
- **SEVERE**: Red - Errors and exceptions
|
||||
- **WARNING**: Orange - Warning conditions
|
||||
- **INFO**: Blue - Informational messages
|
||||
- **CONFIG**: Green - Configuration messages
|
||||
- **FINE/FINER/FINEST**: Gray - Debug messages
|
||||
|
||||
### Process Types
|
||||
- **Foreground**: Main app processes
|
||||
- **Background (bg)**: Background tasks
|
||||
- **Firebase Background (fbg)**: Firebase-related background processes
|
||||
|
||||
### Performance
|
||||
- Lazy loading: Only renders visible log entries
|
||||
- Efficient filtering: Client-side filtering with optimized algorithms
|
||||
- Memory management: Handles large log files (tested with 100k+ entries)
|
||||
|
||||
## Sample Log Files
|
||||
|
||||
For testing, you can use any ZIP file containing `.log` files from Ente mobile app logs.
|
||||
|
||||
## Development
|
||||
|
||||
### File Structure
|
||||
```
|
||||
logs-viewer/
|
||||
├── index.html # Main HTML structure
|
||||
├── styles.css # CSS styling
|
||||
├── script.js # JavaScript logic
|
||||
├── README.md # This documentation
|
||||
└── references/ # UI reference screenshots
|
||||
```
|
||||
|
||||
### Key JavaScript Classes
|
||||
- `LogViewer`: Main application class
|
||||
- Log parsing logic in `parseLogFile()` and `parseLogLine()`
|
||||
- Filter management in `applyCurrentFilter()`
|
||||
- UI rendering in `renderLogs()` and `createLogEntryHTML()`
|
||||
|
||||
### Adding Features
|
||||
1. **New Filter Types**: Extend `currentFilter` object and `matchesFilter()` method
|
||||
2. **New Log Formats**: Update parsing patterns in `parseLogLine()`
|
||||
3. **UI Components**: Add HTML elements and CSS classes, wire up in `initializeEventListeners()`
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
1. **ZIP file not loading**:
|
||||
- Ensure ZIP contains `.log` files
|
||||
- Check browser console for errors
|
||||
- Try a smaller file first
|
||||
|
||||
2. **Logs not parsing correctly**:
|
||||
- Check log format matches expected pattern
|
||||
- Look for console warnings about parsing failures
|
||||
- Verify timestamp format is correct
|
||||
|
||||
3. **Performance issues with large files**:
|
||||
- The viewer handles pagination (100 logs at a time)
|
||||
- Use filters to reduce the dataset
|
||||
- Close other browser tabs to free memory
|
||||
|
||||
4. **Search not working**:
|
||||
- Check for typos in logger names
|
||||
- Use wildcard syntax: `logger:Service*`
|
||||
- Search is case-insensitive for message content
|
||||
|
||||
### Browser Compatibility
|
||||
- **Recommended**: Chrome 80+, Firefox 75+, Safari 13+
|
||||
- **Required**: ES6 support, Fetch API, File API
|
||||
- **Dependencies**: JSZip library for ZIP file handling
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
- Real-time log streaming
|
||||
- Advanced regex search
|
||||
- Log correlation and grouping
|
||||
- Performance metrics dashboard
|
||||
- Dark theme support
|
||||
- Export to JSON/CSV formats
|
||||
@@ -1,110 +0,0 @@
|
||||
/* Ente Theme Variables based on web/packages/base/components/utils/theme.ts */
|
||||
:root {
|
||||
/* Light theme colors */
|
||||
--ente-color-accent-photos: #1db954;
|
||||
--ente-color-accent-auth: #9610d6;
|
||||
--ente-color-accent-locker: #5ba8ff;
|
||||
|
||||
/* Background colors */
|
||||
--ente-background-default: #fff;
|
||||
--ente-background-paper: #fff;
|
||||
--ente-background-paper2: #fbfbfb;
|
||||
--ente-background-search: #f3f3f3;
|
||||
|
||||
/* Text colors */
|
||||
--ente-text-base: #000;
|
||||
--ente-text-muted: rgba(0, 0, 0, 0.60);
|
||||
--ente-text-faint: rgba(0, 0, 0, 0.50);
|
||||
|
||||
/* Fill colors */
|
||||
--ente-fill-base: #000;
|
||||
--ente-fill-muted: rgba(0, 0, 0, 0.12);
|
||||
--ente-fill-faint: rgba(0, 0, 0, 0.04);
|
||||
--ente-fill-faint-hover: rgba(0, 0, 0, 0.08);
|
||||
--ente-fill-fainter: rgba(0, 0, 0, 0.02);
|
||||
|
||||
/* Stroke colors */
|
||||
--ente-stroke-base: #000;
|
||||
--ente-stroke-muted: rgba(0, 0, 0, 0.24);
|
||||
--ente-stroke-faint: rgba(0, 0, 0, 0.12);
|
||||
--ente-stroke-fainter: rgba(0, 0, 0, 0.06);
|
||||
|
||||
/* Shadow */
|
||||
--ente-shadow-paper: 0px 0px 10px rgba(0, 0, 0, 0.25);
|
||||
--ente-shadow-menu: 0px 0px 6px rgba(0, 0, 0, 0.16), 0px 3px 6px rgba(0, 0, 0, 0.12);
|
||||
--ente-shadow-button: 0px 4px 4px rgba(0, 0, 0, 0.25);
|
||||
|
||||
/* Fixed colors */
|
||||
--ente-success: #1db954;
|
||||
--ente-warning: #ffc107;
|
||||
--ente-danger: #ea3f3f;
|
||||
--ente-danger-dark: #f53434;
|
||||
--ente-danger-light: #ff6565;
|
||||
|
||||
/* Secondary colors */
|
||||
--ente-secondary-main: #f5f5f5;
|
||||
--ente-secondary-hover: #e9e9e9;
|
||||
|
||||
/* Action colors */
|
||||
--ente-action-hover: rgba(0, 0, 0, 0.08);
|
||||
--ente-action-disabled: rgba(0, 0, 0, 0.50);
|
||||
|
||||
/* Typography */
|
||||
--ente-font-family: "Inter Variable", sans-serif;
|
||||
--ente-font-weight-regular: 500;
|
||||
--ente-font-weight-medium: 600;
|
||||
--ente-font-weight-bold: 700;
|
||||
|
||||
/* Border radius */
|
||||
--ente-border-radius: 8px;
|
||||
--ente-border-radius-small: 4px;
|
||||
|
||||
/* Spacing */
|
||||
--ente-spacing-xs: 4px;
|
||||
--ente-spacing-sm: 8px;
|
||||
--ente-spacing-md: 12px;
|
||||
--ente-spacing-lg: 16px;
|
||||
--ente-spacing-xl: 24px;
|
||||
}
|
||||
|
||||
/* Dark theme */
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
/* Background colors */
|
||||
--ente-background-default: #000;
|
||||
--ente-background-paper: #1b1b1b;
|
||||
--ente-background-paper2: #252525;
|
||||
--ente-background-search: #1b1b1b;
|
||||
|
||||
/* Text colors */
|
||||
--ente-text-base: #fff;
|
||||
--ente-text-muted: rgba(255, 255, 255, 0.70);
|
||||
--ente-text-faint: rgba(255, 255, 255, 0.50);
|
||||
|
||||
/* Fill colors */
|
||||
--ente-fill-base: #fff;
|
||||
--ente-fill-muted: rgba(255, 255, 255, 0.16);
|
||||
--ente-fill-faint: rgba(255, 255, 255, 0.12);
|
||||
--ente-fill-faint-hover: rgba(255, 255, 255, 0.16);
|
||||
--ente-fill-fainter: rgba(255, 255, 255, 0.05);
|
||||
|
||||
/* Stroke colors */
|
||||
--ente-stroke-base: #fff;
|
||||
--ente-stroke-muted: rgba(255, 255, 255, 0.24);
|
||||
--ente-stroke-faint: rgba(255, 255, 255, 0.16);
|
||||
--ente-stroke-fainter: rgba(255, 255, 255, 0.12);
|
||||
|
||||
/* Shadow */
|
||||
--ente-shadow-paper: 0px 2px 12px rgba(0, 0, 0, 0.75);
|
||||
--ente-shadow-menu: 0px 0px 6px rgba(0, 0, 0, 0.50), 0px 3px 6px rgba(0, 0, 0, 0.25);
|
||||
--ente-shadow-button: 0px 4px 4px rgba(0, 0, 0, 0.75);
|
||||
|
||||
/* Secondary colors */
|
||||
--ente-secondary-main: #2b2b2b;
|
||||
--ente-secondary-hover: #373737;
|
||||
|
||||
/* Action colors */
|
||||
--ente-action-hover: rgba(255, 255, 255, 0.16);
|
||||
--ente-action-disabled: rgba(255, 255, 255, 0.50);
|
||||
}
|
||||
}
|
||||
@@ -1,218 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Ente Log Viewer</title>
|
||||
|
||||
<!-- Material-UI CSS -->
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" />
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons" />
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@mui/material@latest/dist/index.css" />
|
||||
|
||||
<!-- Ente theme -->
|
||||
<link rel="stylesheet" href="ente-theme.css">
|
||||
|
||||
<!-- Custom styles -->
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="app">
|
||||
<!-- Header -->
|
||||
<header class="header">
|
||||
<div class="header-content">
|
||||
<h1>📋 Ente Log Viewer</h1>
|
||||
<div class="header-actions">
|
||||
<button id="filter-btn" class="mui-icon-btn" title="Filter logs">
|
||||
<span class="material-icons">filter_list</span>
|
||||
<span class="filter-count" id="filter-count" style="display: none;"></span>
|
||||
</button>
|
||||
<button id="sort-btn" class="mui-icon-btn" title="Sort order">
|
||||
<span class="material-icons">arrow_downward</span>
|
||||
</button>
|
||||
<div class="dropdown">
|
||||
<button class="mui-icon-btn dropdown-toggle" title="More actions">
|
||||
<span class="material-icons">more_vert</span>
|
||||
</button>
|
||||
<div class="dropdown-menu mui-menu">
|
||||
<button id="analytics-btn" class="dropdown-item mui-menu-item">
|
||||
<span class="material-icons">analytics</span>
|
||||
<span>Analytics</span>
|
||||
</button>
|
||||
<button id="export-btn" class="dropdown-item mui-menu-item">
|
||||
<span class="material-icons">download</span>
|
||||
<span>Export Logs</span>
|
||||
</button>
|
||||
<button id="clear-btn" class="dropdown-item mui-menu-item danger">
|
||||
<span class="material-icons">delete</span>
|
||||
<span>Clear Logs</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Upload Section -->
|
||||
<div class="upload-section" id="upload-section">
|
||||
<div class="upload-area" id="upload-area">
|
||||
<div class="upload-content">
|
||||
<div class="upload-icon">📁</div>
|
||||
<h2>Upload Log Files</h2>
|
||||
<p>Drag and drop a zip file containing log files, or click to browse</p>
|
||||
<input type="file" id="file-input" accept=".zip" hidden>
|
||||
<button id="browse-btn" class="primary-btn">Choose ZIP File</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Main Content -->
|
||||
<div class="main-content" id="main-content" style="display: none;">
|
||||
<!-- Search Bar -->
|
||||
<div class="search-section">
|
||||
<div class="search-bar mui-search-container">
|
||||
<div class="mui-textfield">
|
||||
<input type="text" id="search-input" placeholder="Search logs... (try 'logger:SyncService' or text search)" class="mui-input" />
|
||||
<span class="mui-search-icon material-icons">search</span>
|
||||
<button id="clear-search" class="mui-clear-btn" style="display: none;">
|
||||
<span class="material-icons">clear</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Timeline Filter -->
|
||||
<div class="timeline-section" id="timeline-section" style="display: none;">
|
||||
<div class="timeline-header">
|
||||
<span class="material-icons">timeline</span>
|
||||
<span>Timeline Filter</span>
|
||||
<button id="timeline-toggle" class="mui-icon-btn timeline-btn">
|
||||
<span class="material-icons">timeline</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="timeline-controls" id="timeline-controls" style="display: none;">
|
||||
<div class="timeline-range">
|
||||
<div class="mui-textfield">
|
||||
<input type="datetime-local" id="start-time" class="mui-input" />
|
||||
</div>
|
||||
<span class="range-separator">to</span>
|
||||
<div class="mui-textfield">
|
||||
<input type="datetime-local" id="end-time" class="mui-input" />
|
||||
</div>
|
||||
<button id="reset-timeline" class="mui-button secondary">
|
||||
<span class="material-icons">refresh</span>
|
||||
<span>Reset</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Active Filters -->
|
||||
<div class="active-filters" id="active-filters" style="display: none;">
|
||||
<div class="filter-chips" id="filter-chips"></div>
|
||||
</div>
|
||||
|
||||
<!-- Log Stats -->
|
||||
<div class="log-stats" id="log-stats">
|
||||
<span id="log-count">0 logs loaded</span>
|
||||
<span id="filtered-count"></span>
|
||||
</div>
|
||||
|
||||
<!-- Log List -->
|
||||
<div class="log-list-container">
|
||||
<div class="log-list" id="log-list">
|
||||
<!-- Log entries will be populated here -->
|
||||
</div>
|
||||
<div class="loading" id="loading" style="display: none;">Loading...</div>
|
||||
<div class="load-more" id="load-more" style="display: none;">
|
||||
<button class="secondary-btn">Load More</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Filter Dialog -->
|
||||
<div class="dialog-overlay" id="filter-dialog" style="display: none;">
|
||||
<div class="dialog">
|
||||
<div class="dialog-header">
|
||||
<h2>Filter Logs</h2>
|
||||
<button class="close-btn" id="close-filter">✕</button>
|
||||
</div>
|
||||
<div class="dialog-content">
|
||||
<!-- Log Levels -->
|
||||
<div class="filter-section">
|
||||
<h3>Log Levels</h3>
|
||||
<div class="level-chips" id="level-chips">
|
||||
<!-- Level chips will be populated here -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Process -->
|
||||
<div class="filter-section">
|
||||
<h3>Process</h3>
|
||||
<div class="process-list" id="process-list">
|
||||
<!-- Process checkboxes will be populated here -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Loggers -->
|
||||
<div class="filter-section">
|
||||
<h3>Loggers</h3>
|
||||
<div class="logger-list" id="logger-list">
|
||||
<!-- Logger checkboxes will be populated here -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="dialog-actions">
|
||||
<button id="clear-filters" class="secondary-btn">Clear All</button>
|
||||
<button id="cancel-filter" class="secondary-btn">Cancel</button>
|
||||
<button id="apply-filters" class="primary-btn">Apply</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Analytics Dialog -->
|
||||
<div class="dialog-overlay" id="analytics-dialog" style="display: none;">
|
||||
<div class="dialog">
|
||||
<div class="dialog-header">
|
||||
<h2>Logger Analytics</h2>
|
||||
<button class="close-btn" id="close-analytics">✕</button>
|
||||
</div>
|
||||
<div class="dialog-content">
|
||||
<div id="analytics-content">
|
||||
<!-- Analytics charts will be populated here -->
|
||||
</div>
|
||||
</div>
|
||||
<div class="dialog-actions">
|
||||
<button id="close-analytics-btn" class="secondary-btn">Close</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Log Detail Dialog -->
|
||||
<div class="dialog-overlay" id="detail-dialog" style="display: none;">
|
||||
<div class="dialog large">
|
||||
<div class="dialog-header">
|
||||
<h2>Log Details</h2>
|
||||
<button class="close-btn" id="close-detail">✕</button>
|
||||
</div>
|
||||
<div class="dialog-content">
|
||||
<div id="detail-content">
|
||||
<!-- Log details will be populated here -->
|
||||
</div>
|
||||
</div>
|
||||
<div class="dialog-actions">
|
||||
<button id="copy-log" class="secondary-btn">Copy</button>
|
||||
<button id="close-detail-btn" class="secondary-btn">Close</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Material-UI JavaScript -->
|
||||
<script src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
|
||||
<script src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
|
||||
<script src="https://unpkg.com/@mui/material@latest/umd/material-ui.production.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
|
||||
<script src="script.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,15 +0,0 @@
|
||||
{
|
||||
email custom-domains@ente.io
|
||||
on_demand_tls {
|
||||
ask https://api.ente.io/custom-domain
|
||||
}
|
||||
}
|
||||
|
||||
https:// {
|
||||
tls {
|
||||
on_demand
|
||||
}
|
||||
reverse_proxy https://custom-albums.ente.io {
|
||||
header_up Host {upstream_hostport}
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
# Caddy
|
||||
|
||||
Caddy is used to terminate TLS and manage certificates for custom domains.
|
||||
|
||||
## Installation
|
||||
|
||||
```sh
|
||||
sudo mkdir -p /root/caddy/conf
|
||||
sudo mv Caddyfile /root/caddy/conf
|
||||
sudo chown root:root /root/caddy/conf/Caddyfile
|
||||
```
|
||||
|
||||
Rest of it works like our other systemd services.
|
||||
|
||||
If the Caddyfile changes, the running instance can be updated without restarts by using `sudo systemctl reload caddy`.
|
||||
|
||||
## Backups
|
||||
|
||||
The entire `/root/caddy` directory can be backed up and contains the everything needed to resurrect the same setup.
|
||||
@@ -1,17 +0,0 @@
|
||||
[Unit]
|
||||
Documentation=https://caddyserver.com/docs/running
|
||||
Requires=docker.service
|
||||
After=docker.service
|
||||
|
||||
[Service]
|
||||
ExecStartPre=docker pull caddy
|
||||
ExecStartPre=-docker stop caddy
|
||||
ExecStartPre=-docker rm caddy
|
||||
ExecStart=docker run --name caddy \
|
||||
--cap-add NET_ADMIN \
|
||||
-p 80:80 -p 443:443 -p 443:443/udp \
|
||||
-v /root/caddy/conf:/etc/caddy \
|
||||
-v /root/caddy/data:/data \
|
||||
-v /root/caddy/config:/config \
|
||||
caddy
|
||||
ExecReload=docker exec -w /etc/caddy caddy caddy reload
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"tabWidth": 4,
|
||||
"proseWrap": "always",
|
||||
"plugins": [
|
||||
"prettier-plugin-organize-imports",
|
||||
"prettier-plugin-packagejson"
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
{
|
||||
"tabWidth": 4
|
||||
"tabWidth": 4,
|
||||
"proseWrap": "always"
|
||||
}
|
||||
|
||||
45
mobile/.gitignore
vendored
@@ -1,45 +0,0 @@
|
||||
# Miscellaneous
|
||||
*.class
|
||||
*.log
|
||||
*.pyc
|
||||
*.swp
|
||||
.DS_Store
|
||||
.atom/
|
||||
.buildlog/
|
||||
.history
|
||||
.svn/
|
||||
migrate_working_dir/
|
||||
|
||||
# IntelliJ related
|
||||
*.iml
|
||||
*.ipr
|
||||
*.iws
|
||||
.idea/
|
||||
melos_*.iml
|
||||
|
||||
# The .vscode folder contains launch configuration and tasks you configure in
|
||||
# VS Code which you may wish to be included in version control, so this line
|
||||
# is commented out by default.
|
||||
#.vscode/
|
||||
|
||||
# Flutter/Dart/Pub related
|
||||
**/doc/api/
|
||||
**/ios/Flutter/.last_build_id
|
||||
.dart_tool/
|
||||
.flutter-plugins
|
||||
.flutter-plugins-dependencies
|
||||
.packages
|
||||
.pub-cache/
|
||||
.pub/
|
||||
/build/
|
||||
|
||||
# Symbolication related
|
||||
app.*.symbols
|
||||
|
||||
# Obfuscation related
|
||||
app.*.map.json
|
||||
|
||||
# Android Studio will place build artifacts here
|
||||
/android/app/debug
|
||||
/android/app/profile
|
||||
/android/app/release
|
||||
@@ -1,72 +0,0 @@
|
||||
# For more linters, we can check https://dart-lang.github.io/linter/lints/index.html
|
||||
# or https://pub.dev/packages/lint (Effective dart)
|
||||
# use "flutter analyze ." or "dart analyze ." for running lint checks
|
||||
|
||||
include: package:flutter_lints/flutter.yaml
|
||||
linter:
|
||||
rules:
|
||||
# Ref https://github.com/flutter/packages/blob/master/packages/flutter_lints/lib/flutter.yaml
|
||||
# Ref https://dart-lang.github.io/linter/lints/
|
||||
- avoid_print
|
||||
- avoid_unnecessary_containers
|
||||
- avoid_web_libraries_in_flutter
|
||||
- no_logic_in_create_state
|
||||
- prefer_const_constructors
|
||||
- prefer_const_constructors_in_immutables
|
||||
- prefer_const_declarations
|
||||
- prefer_const_literals_to_create_immutables
|
||||
- prefer_final_locals
|
||||
- require_trailing_commas
|
||||
- sized_box_for_whitespace
|
||||
- use_full_hex_values_for_flutter_colors
|
||||
- use_key_in_widget_constructors
|
||||
- cancel_subscriptions
|
||||
|
||||
|
||||
- avoid_empty_else
|
||||
- exhaustive_cases
|
||||
|
||||
# just style suggestions
|
||||
- sort_pub_dependencies
|
||||
- use_rethrow_when_possible
|
||||
- prefer_double_quotes
|
||||
- directives_ordering
|
||||
- always_use_package_imports
|
||||
- sort_child_properties_last
|
||||
- unawaited_futures
|
||||
|
||||
analyzer:
|
||||
errors:
|
||||
avoid_empty_else: error
|
||||
exhaustive_cases: error
|
||||
curly_braces_in_flow_control_structures: error
|
||||
directives_ordering: error
|
||||
require_trailing_commas: error
|
||||
always_use_package_imports: warning
|
||||
prefer_final_fields: error
|
||||
unused_import: error
|
||||
camel_case_types: error
|
||||
prefer_is_empty: warning
|
||||
use_rethrow_when_possible: info
|
||||
unused_field: warning
|
||||
use_key_in_widget_constructors: warning
|
||||
sort_child_properties_last: warning
|
||||
sort_pub_dependencies: warning
|
||||
library_private_types_in_public_api: warning
|
||||
constant_identifier_names: ignore
|
||||
prefer_const_constructors: warning
|
||||
prefer_const_declarations: warning
|
||||
prefer_const_constructors_in_immutables: warning
|
||||
prefer_final_locals: warning
|
||||
unnecessary_const: error
|
||||
cancel_subscriptions: error
|
||||
unrelated_type_equality_checks: error
|
||||
unnecessary_cast: info
|
||||
|
||||
|
||||
unawaited_futures: warning # convert to warning after fixing existing issues
|
||||
invalid_dependency: info
|
||||
use_build_context_synchronously: ignore # experimental lint, requires many changes
|
||||
prefer_interpolation_to_compose_strings: ignore # later too many warnings
|
||||
prefer_double_quotes: ignore # too many warnings
|
||||
avoid_renaming_method_parameters: ignore # incorrect warnings for `equals` overrides
|
||||
@@ -1,3 +1,3 @@
|
||||
{
|
||||
"flutter": "3.32.8"
|
||||
"flutter": "3.24.3"
|
||||
}
|
||||
3
mobile/apps/auth/.gitignore
vendored
@@ -44,5 +44,4 @@ android/key.properties
|
||||
dist/
|
||||
|
||||
# FVM Version Cache
|
||||
.fvm/
|
||||
lib/l10n/arb/*.dart
|
||||
.fvm/
|
||||
@@ -19,16 +19,16 @@ without relying on third party stores.
|
||||
You can alternatively install the build from PlayStore or F-Droid.
|
||||
|
||||
<a href="https://play.google.com/store/apps/details?id=io.ente.auth">
|
||||
<img height="59" src="../../../.github/assets/play-store-badge.png">
|
||||
<img height="59" src="../.github/assets/play-store-badge.png">
|
||||
</a>
|
||||
<a href="https://f-droid.org/packages/io.ente.auth/">
|
||||
<img height="59" src="../../../.github/assets/f-droid-badge.png">
|
||||
<img height="59" src="../.github/assets/f-droid-badge.png">
|
||||
</a>
|
||||
|
||||
### iOS / Apple Silicon macOS
|
||||
|
||||
<a href="https://apps.apple.com/us/app/ente-authenticator/id6444121398">
|
||||
<img height="59" src="../../../.github/assets/app-store-badge.svg">
|
||||
<img height="59" src="../.github/assets/app-store-badge.svg">
|
||||
</a>
|
||||
|
||||
### Desktop
|
||||
@@ -44,7 +44,7 @@ or managing your secrets, please use our mobile or desktop app.
|
||||
|
||||
## 🧑💻 Build from source
|
||||
|
||||
1. [Install Flutter v3.32.8](https://flutter.dev/docs/get-started/install).
|
||||
1. [Install Flutter](https://flutter.dev/docs/get-started/install)
|
||||
|
||||
2. Pull in all submodules with `git submodule update --init --recursive`
|
||||
|
||||
@@ -98,7 +98,7 @@ more, see [docs/adding-icons](docs/adding-icons.md).
|
||||
The best way to support this project is by checking out [Ente
|
||||
Photos](../mobile/README.md) or spreading the word.
|
||||
|
||||
For more ways to contribute, see [../../../CONTRIBUTING.md](../../../CONTRIBUTING.md).
|
||||
For more ways to contribute, see [../CONTRIBUTING.md](../CONTRIBUTING.md).
|
||||
|
||||
## Certificate Fingerprints
|
||||
|
||||
@@ -113,4 +113,4 @@ apksigner verify --print-certs <path_to_apk>
|
||||
## ⭐️ About
|
||||
|
||||
To know more about Ente and the ways to get in touch or seek help, see [our main
|
||||
README](../../../README.md) or visit [ente.io](https://ente.io).
|
||||
README](../README.md) or visit [ente.io](https://ente.io).
|
||||
|
||||
@@ -30,13 +30,10 @@ if (keystorePropertiesFile.exists()) {
|
||||
|
||||
android {
|
||||
namespace "io.ente.auth"
|
||||
compileSdk 36
|
||||
compileSdk 34
|
||||
ndkVersion flutter.ndkVersion
|
||||
|
||||
compileOptions {
|
||||
// Flag to enable support for the new language APIs
|
||||
coreLibraryDesugaringEnabled true
|
||||
// Sets Java compatibility to Java 8
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
@@ -59,8 +56,8 @@ android {
|
||||
applicationId "io.ente.auth"
|
||||
// You can update the following values to match your application needs.
|
||||
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
||||
minSdkVersion 22
|
||||
targetSdkVersion 35
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 34
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
@@ -118,7 +115,4 @@ flutter {
|
||||
source '../..'
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// For AGP 7.4+
|
||||
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.4")
|
||||
}
|
||||
dependencies {}
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
# Please add these rules to your existing keep rules in order to suppress warnings.
|
||||
# This is generated automatically by the Android Gradle plugin.
|
||||
-dontwarn com.google.errorprone.annotations.CanIgnoreReturnValue
|
||||
-dontwarn com.google.errorprone.annotations.CheckReturnValue
|
||||
-dontwarn com.google.errorprone.annotations.Immutable
|
||||
-dontwarn com.google.errorprone.annotations.RestrictedApi
|
||||
@@ -6,19 +6,6 @@ allprojects {
|
||||
}
|
||||
|
||||
rootProject.buildDir = '../build'
|
||||
|
||||
subprojects {
|
||||
afterEvaluate { project ->
|
||||
if (project.hasProperty('android')) {
|
||||
project.android {
|
||||
if (namespace == null) {
|
||||
namespace project.group
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
subprojects {
|
||||
project.buildDir = "${rootProject.buildDir}/${project.name}"
|
||||
}
|
||||
|
||||
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip
|
||||
|
||||
@@ -19,8 +19,8 @@ pluginManagement {
|
||||
|
||||
plugins {
|
||||
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
||||
id "com.android.application" version "8.6.0" apply false
|
||||
id "org.jetbrains.kotlin.android" version "2.1.10" apply false
|
||||
id "com.android.application" version "7.3.0" apply false
|
||||
id "org.jetbrains.kotlin.android" version "1.8.22" apply false
|
||||
}
|
||||
|
||||
include ":app"
|
||||
|
||||
@@ -10,15 +10,6 @@
|
||||
{
|
||||
"title": "3Commas"
|
||||
},
|
||||
{
|
||||
"title": "Aadhaar",
|
||||
"slug": "aadhaar",
|
||||
"altNames": [
|
||||
"uidai",
|
||||
"UIDAI",
|
||||
"Unique Identification Authority of India"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Accredible",
|
||||
"slug": "accredible",
|
||||
@@ -54,19 +45,6 @@
|
||||
{
|
||||
"title": "Amazon"
|
||||
},
|
||||
{
|
||||
"title": "Amtrak",
|
||||
"slug": "amtrak"
|
||||
},
|
||||
{
|
||||
"title": "Animal Crossing",
|
||||
"slug:": "animal_crossing",
|
||||
"altNames": [
|
||||
"AnimalCrossing",
|
||||
"Bell Tree Forums",
|
||||
"BellTree Forums"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Ankama",
|
||||
"slug": "ankama"
|
||||
@@ -113,10 +91,6 @@
|
||||
{
|
||||
"title": "availity"
|
||||
},
|
||||
{
|
||||
"title": "AvistaZ.to",
|
||||
"slug": "avistaz"
|
||||
},
|
||||
{
|
||||
"title": "AzurHosts",
|
||||
"slug": "azurhosts",
|
||||
@@ -156,6 +130,14 @@
|
||||
"Blizzard"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "BBS.NGA",
|
||||
"slug": "bbs_nga",
|
||||
"altNames": [
|
||||
"NGA玩家社区",
|
||||
"NGA社区"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Belo"
|
||||
},
|
||||
@@ -298,24 +280,12 @@
|
||||
{
|
||||
"title": "Caixa"
|
||||
},
|
||||
{
|
||||
"title": "Caltrain",
|
||||
"slug": "caltrain"
|
||||
},
|
||||
{
|
||||
"title": "Canva"
|
||||
},
|
||||
{
|
||||
"title": "Capacities"
|
||||
},
|
||||
{
|
||||
"title": "Capcom",
|
||||
"slug": "capcom",
|
||||
"hex": "0D4DA2",
|
||||
"altNames": [
|
||||
"Capcom Co., Ltd."
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Carta",
|
||||
"altNames": [
|
||||
@@ -336,37 +306,11 @@
|
||||
{
|
||||
"title": "ChangeNOW"
|
||||
},
|
||||
{
|
||||
"title": "Charles Schwab",
|
||||
"slug": "charles_schwab",
|
||||
"altNames": [
|
||||
"schwab",
|
||||
"charles-schwab",
|
||||
"charles schwab"
|
||||
],
|
||||
"hex": "01A0E0"
|
||||
},
|
||||
{
|
||||
"title": "Channel Island Hosting",
|
||||
"slug": "cih",
|
||||
"hex": "D14633"
|
||||
},
|
||||
{
|
||||
"title": "Chucklefish"
|
||||
},
|
||||
{
|
||||
"title": "CinemaZ.to",
|
||||
"slug": "cinemaz"
|
||||
},
|
||||
{
|
||||
"title": "Clipper",
|
||||
"slug": "clippercard",
|
||||
"altNames": [
|
||||
"ClipperCard",
|
||||
"clipper-card",
|
||||
"Clipper Card"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "CloudAMQP"
|
||||
},
|
||||
@@ -382,11 +326,6 @@
|
||||
{
|
||||
"title": "CoinDCX"
|
||||
},
|
||||
{
|
||||
"title": "CoinTracking",
|
||||
"slug": "cointracking",
|
||||
"altNames": ["cointracking.info", "Coin Tracking"]
|
||||
},
|
||||
{
|
||||
"title": "colorado",
|
||||
"altNames": [
|
||||
@@ -413,10 +352,6 @@
|
||||
"title": "Control D",
|
||||
"slug": "controld"
|
||||
},
|
||||
{
|
||||
"title": "Coolify",
|
||||
"slug": "coolify"
|
||||
},
|
||||
{
|
||||
"title": "Crowdpear"
|
||||
},
|
||||
@@ -447,10 +382,6 @@
|
||||
"title": "CSGORoll",
|
||||
"slug": "csgoroll"
|
||||
},
|
||||
{
|
||||
"title": "CrowdSec",
|
||||
"slug": "crowdsec"
|
||||
},
|
||||
{
|
||||
"title": "Cryptee",
|
||||
"slug": "cryptee"
|
||||
@@ -470,11 +401,6 @@
|
||||
"Digital Combat Simulator"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "DeepSeek",
|
||||
"slug": "deepseek",
|
||||
"hex": "4D6BFE"
|
||||
},
|
||||
{
|
||||
"title": "DEGIRO"
|
||||
},
|
||||
@@ -503,14 +429,6 @@
|
||||
{
|
||||
"title": "DocuSeal"
|
||||
},
|
||||
{
|
||||
"title": "Dominos",
|
||||
"slug": "dominos",
|
||||
"altNames": [
|
||||
"Domino's",
|
||||
"Domino's Pizza"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Doppler"
|
||||
},
|
||||
@@ -525,15 +443,6 @@
|
||||
"title": "dus.net",
|
||||
"slug": "dusnet"
|
||||
},
|
||||
{
|
||||
"title": "Dunkin' Donuts",
|
||||
"slug": "dunkindonuts",
|
||||
"altNames": [
|
||||
"Dunkin'",
|
||||
"Dunkin",
|
||||
"Dunkin Donuts"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "eBay"
|
||||
},
|
||||
@@ -584,22 +493,6 @@
|
||||
],
|
||||
"hex": "858585"
|
||||
},
|
||||
{
|
||||
"title": "exaroton",
|
||||
"slug": "exaroton",
|
||||
"altNames": [
|
||||
"Exaroton"
|
||||
],
|
||||
"hex": "17AB17"
|
||||
},
|
||||
{
|
||||
"title": "ExoticaZ.to",
|
||||
"slug": "exoticaz"
|
||||
},
|
||||
{
|
||||
"title": "Experian",
|
||||
"slug": "experian"
|
||||
},
|
||||
{
|
||||
"title": "Fanatical",
|
||||
"slug": "fanatical",
|
||||
@@ -625,10 +518,6 @@
|
||||
"Fidelity Investments"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "FileCloud",
|
||||
"slug": "filecloud"
|
||||
},
|
||||
{
|
||||
"title": "Filen"
|
||||
},
|
||||
@@ -716,14 +605,6 @@
|
||||
"Canada Revenue Agency"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Green Man Gaming",
|
||||
"slug": "greenmangaming",
|
||||
"altNames": [
|
||||
"green man gaming",
|
||||
"gmg"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Guideline"
|
||||
},
|
||||
@@ -740,20 +621,6 @@
|
||||
{
|
||||
"title": "Hivelocity"
|
||||
},
|
||||
{
|
||||
"title": "HRDocumentBox",
|
||||
"slug": "hrdocumentbox",
|
||||
"altNames": ["HRDocumentBox", "HR Document Box"]
|
||||
},
|
||||
{
|
||||
"title": "HSA Bank",
|
||||
"slug": "hsa_bank",
|
||||
"altNames": [
|
||||
"hsa bank",
|
||||
"hsabank"
|
||||
],
|
||||
"hex": "00FF85"
|
||||
},
|
||||
{
|
||||
"title": "HTX"
|
||||
},
|
||||
@@ -763,11 +630,6 @@
|
||||
"Hugging Face"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Hulu",
|
||||
"slug": "hulu",
|
||||
"hex": "1CE783"
|
||||
},
|
||||
{
|
||||
"title": "IBKR",
|
||||
"slug": "ibkr",
|
||||
@@ -814,15 +676,6 @@
|
||||
{
|
||||
"title": "INWX"
|
||||
},
|
||||
{
|
||||
"title": "IRCTC",
|
||||
"slug": "irctc",
|
||||
"altNames": [
|
||||
"Indian Railway Catering and Tourism Corporation",
|
||||
"Indian Railways"
|
||||
],
|
||||
"hex": "000075"
|
||||
},
|
||||
{
|
||||
"title": "Itch",
|
||||
"slug": "itch_io",
|
||||
@@ -836,13 +689,6 @@
|
||||
"title": "Jagex",
|
||||
"hex": "D3D800"
|
||||
},
|
||||
{
|
||||
"title": "JetBrains YouTrack",
|
||||
"slug": "jetbrains-youtrack",
|
||||
"altNames": [
|
||||
"YouTrack"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "jianguoyun",
|
||||
"altNames": [
|
||||
@@ -852,10 +698,6 @@
|
||||
{
|
||||
"title": "Kagi"
|
||||
},
|
||||
{
|
||||
"title": "Kayak",
|
||||
"slug": "kayak"
|
||||
},
|
||||
{
|
||||
"title": "Keygen",
|
||||
"altNames": [
|
||||
@@ -974,14 +816,6 @@
|
||||
"lu.ma"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "MailCow",
|
||||
"slug": "mailcow",
|
||||
"altNames": [
|
||||
"mailcow",
|
||||
"mailcow UI"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "MangaDex",
|
||||
"slug": "mangadex"
|
||||
@@ -1050,13 +884,6 @@
|
||||
"MistralAI"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Mobile01",
|
||||
"slug": "mobile01",
|
||||
"altNames": [
|
||||
"M01"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Mozilla"
|
||||
},
|
||||
@@ -1143,10 +970,6 @@
|
||||
{
|
||||
"title": "Nelnet"
|
||||
},
|
||||
{
|
||||
"title": "NetBird",
|
||||
"slug": "netbird"
|
||||
},
|
||||
{
|
||||
"title": "nintendo",
|
||||
"altNames": [
|
||||
@@ -1157,13 +980,6 @@
|
||||
{
|
||||
"title": "Njalla"
|
||||
},
|
||||
{
|
||||
"title": "NJTransit",
|
||||
"slug": "njtransit",
|
||||
"altNames": [
|
||||
"NJ Transit"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "nordvpn",
|
||||
"slug": "nordaccount",
|
||||
@@ -1187,11 +1003,6 @@
|
||||
{
|
||||
"title": "Notion"
|
||||
},
|
||||
{
|
||||
"title": "NumberBarn",
|
||||
"slug": "numberbarn",
|
||||
"hex": "1c5787"
|
||||
},
|
||||
{
|
||||
"title": "NuCommunity"
|
||||
},
|
||||
@@ -1236,12 +1047,6 @@
|
||||
"title": "Parqet",
|
||||
"slug": "parqet"
|
||||
},
|
||||
{
|
||||
"title": "Parallels",
|
||||
"slug": "parallels",
|
||||
"hex": "#E61E25",
|
||||
"altNames": ["Parallels Desktop", "Parallels VM"]
|
||||
},
|
||||
{
|
||||
"title": "Parsec"
|
||||
},
|
||||
@@ -1268,13 +1073,6 @@
|
||||
"Pebble Host"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "PCPartPicker",
|
||||
"slug": "pcpartpicker",
|
||||
"altNames": [
|
||||
"PC Part Picker"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Peerberry"
|
||||
},
|
||||
@@ -1328,10 +1126,6 @@
|
||||
"title": "Privacy.com",
|
||||
"slug": "privacy"
|
||||
},
|
||||
{
|
||||
"title": "PrivateHD.to",
|
||||
"slug": "privatehd"
|
||||
},
|
||||
{
|
||||
"title": "Proton"
|
||||
},
|
||||
@@ -1381,13 +1175,6 @@
|
||||
"r10.net"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "RaiderIO",
|
||||
"slug": "raider_io",
|
||||
"altNames": [
|
||||
"raider.io"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Raindrop.io",
|
||||
"slug": "raindrop_io",
|
||||
@@ -1453,18 +1240,6 @@
|
||||
"title": "Rockstar Games",
|
||||
"slug": "rockstar_games"
|
||||
},
|
||||
{
|
||||
"title": "Rose-Hulman Institute of Technology",
|
||||
"slug": "rose_hulman",
|
||||
"altNames": [
|
||||
"rose-hulman",
|
||||
"Rose-Hulman",
|
||||
"Rose Hulman",
|
||||
"Rose Hulman Institute of Technology",
|
||||
"RHIT"
|
||||
],
|
||||
"hex": "800000"
|
||||
},
|
||||
{
|
||||
"title": "RuneMate"
|
||||
},
|
||||
@@ -1484,14 +1259,6 @@
|
||||
"title": "Seafile",
|
||||
"slug": "seafile"
|
||||
},
|
||||
{
|
||||
"title": "SBI",
|
||||
"slug": "sbi",
|
||||
"altNames": [
|
||||
"onlinesbi",
|
||||
"State Bank of India"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "SEI",
|
||||
"altNames": [
|
||||
@@ -1531,10 +1298,6 @@
|
||||
{
|
||||
"title": "Skinport"
|
||||
},
|
||||
{
|
||||
"title": "Skyscanner",
|
||||
"hex": "0770E3"
|
||||
},
|
||||
{
|
||||
"title": "SMSPool",
|
||||
"slug": "sms_pool_net",
|
||||
@@ -1569,14 +1332,6 @@
|
||||
"title": "Startmail",
|
||||
"slug": "startmail"
|
||||
},
|
||||
{
|
||||
"title": "State Farm",
|
||||
"slug": "state_farm",
|
||||
"altNames": [
|
||||
"StateFarm"
|
||||
],
|
||||
"hex": "EDA920"
|
||||
},
|
||||
{
|
||||
"title": "Stripchat",
|
||||
"slug": "stripchat",
|
||||
@@ -1590,10 +1345,6 @@
|
||||
"title": "STRATO",
|
||||
"hex": "FF8800"
|
||||
},
|
||||
{
|
||||
"title": "Supercell",
|
||||
"slug": "supercell"
|
||||
},
|
||||
{
|
||||
"title": "Surfshark"
|
||||
},
|
||||
@@ -1611,15 +1362,6 @@
|
||||
{
|
||||
"title": "Tableau"
|
||||
},
|
||||
{
|
||||
"title": "Tally.so",
|
||||
"slug": "tally_so",
|
||||
"altNames": [
|
||||
"Tally Forms",
|
||||
"Tally"
|
||||
],
|
||||
"hex": "000000"
|
||||
},
|
||||
{
|
||||
"title": "TCPShield"
|
||||
},
|
||||
@@ -1669,14 +1411,6 @@
|
||||
"title": "Temu",
|
||||
"slug": "temu"
|
||||
},
|
||||
{
|
||||
"title": "The StoryGraph",
|
||||
"slug": "thestorygraph",
|
||||
"altNames": [
|
||||
"StoryGraph",
|
||||
"TheStoryGraph"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "tianyiyun",
|
||||
"altNames": [
|
||||
@@ -1692,12 +1426,6 @@
|
||||
{
|
||||
"title": "TorGuard"
|
||||
},
|
||||
{
|
||||
"title": "Toyhouse",
|
||||
"altNames": [
|
||||
"Toyhou.se"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Trading 212"
|
||||
},
|
||||
@@ -1719,15 +1447,6 @@
|
||||
"T Rowe Price Group, Inc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "TU Dresden",
|
||||
"slug": "tu_dresden",
|
||||
"altNames": [
|
||||
"Technische Universität Dresden",
|
||||
"Dresden University of Technology"
|
||||
],
|
||||
"hex": "00305d"
|
||||
},
|
||||
{
|
||||
"title": "Tweakers"
|
||||
},
|
||||
@@ -1742,12 +1461,6 @@
|
||||
"Twitch tv"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Twitter",
|
||||
"altNames": [
|
||||
"X"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Ubiquiti",
|
||||
"slug": "ubiquiti",
|
||||
@@ -1796,11 +1509,6 @@
|
||||
"uollet.com.br"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "VHV",
|
||||
"slug": "vhv",
|
||||
"altNames": ["VHV", "VHV Versicherung"]
|
||||
},
|
||||
{
|
||||
"title": "Vikunja"
|
||||
},
|
||||
@@ -1818,7 +1526,7 @@
|
||||
"title": "Warner Bros.",
|
||||
"slug": "warner_bros",
|
||||
"altNames": [
|
||||
"Warner Brothers"
|
||||
"Warner Brothers"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -1831,14 +1539,6 @@
|
||||
"title": "WEB.DE",
|
||||
"slug": "web_de"
|
||||
},
|
||||
{
|
||||
"title": "WeMod",
|
||||
"slug": "wemod",
|
||||
"altNames": [
|
||||
"wemod"
|
||||
],
|
||||
"hex": "4B63FB"
|
||||
},
|
||||
{
|
||||
"title": "WHMCS"
|
||||
},
|
||||
@@ -1848,15 +1548,6 @@
|
||||
{
|
||||
"title": "Wise"
|
||||
},
|
||||
{
|
||||
"title": "WMATA",
|
||||
"slug": "wmata",
|
||||
"altNames": [
|
||||
"Washington Metro",
|
||||
"DC Metro",
|
||||
"Washington Metropolitan Area Transit Authority"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Wolvesville"
|
||||
},
|
||||
@@ -1959,26 +1650,6 @@
|
||||
{
|
||||
"title": "Co-Wheels",
|
||||
"slug": "cowheels"
|
||||
},
|
||||
{
|
||||
"title": "Zivver",
|
||||
"slug": "zivver"
|
||||
},
|
||||
{
|
||||
"title": "Meesman Indexbeleggen",
|
||||
"slug": "meesman"
|
||||
},
|
||||
{
|
||||
"title": "Scouting Nederland",
|
||||
"slug": "scoutingnederland"
|
||||
},
|
||||
{
|
||||
"title": "ISC2",
|
||||
"slug": "isc2"
|
||||
},
|
||||
{
|
||||
"title": "Allegro",
|
||||
"slug": "allegro"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 5.7 KiB |
@@ -1,8 +0,0 @@
|
||||
<svg version="1.2" baseProfile="tiny-ps" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1386 1594" width="1386" height="1594">
|
||||
<title>logo (15)-svg copy-svg</title>
|
||||
<style>
|
||||
tspan { white-space:pre }
|
||||
.shp0 { fill: #ff5a00 }
|
||||
</style>
|
||||
<path id="Layer" fill-rule="evenodd" class="shp0" d="M1385.14 634.99L1385.14 1547.13C1385.14 1553.03 1384.01 1558.88 1381.76 1564.35C1379.45 1569.82 1376.13 1574.75 1372 1578.93C1367.82 1583.11 1362.83 1586.44 1357.36 1588.69C1351.89 1590.94 1346.04 1592.12 1340.14 1592.12L570.51 1592.12C534.63 1594.16 498.65 1593.2 462.98 1589.23C427.26 1585.26 391.98 1578.29 357.44 1568.42C322.9 1558.55 289.28 1545.79 256.88 1530.35C224.49 1514.85 193.44 1496.67 164.05 1475.97C137.02 1453.77 112.73 1428.52 91.6 1400.63C70.47 1372.8 52.66 1342.56 38.61 1310.54C24.56 1278.53 14.32 1244.96 8.1 1210.59C1.82 1176.16 -0.32 1141.14 1.61 1106.29L1.61 1101.41C1.61 641.05 502.94 580.24 666.61 580.24L1046.9 580.24L1046.9 546.83C1047.7 524.84 1045.5 502.8 1040.36 481.41C1035.21 460.01 1027.22 439.42 1016.54 420.17C1005.87 400.92 992.63 383.17 977.23 367.51C961.79 351.8 944.25 338.28 925.21 327.29C785.88 256.77 512.11 282.89 283.91 423.38C278.5 428.1 271.85 431.32 264.77 432.66C257.69 434 250.34 433.47 243.53 431.05C236.72 428.64 230.66 424.46 225.99 418.93C221.38 413.41 218.27 406.76 216.98 399.63L202.99 171.03C202.99 168.08 203.31 165.18 204.06 162.34C204.76 159.5 205.88 156.77 207.33 154.19C208.73 151.67 210.5 149.31 212.53 147.22C214.62 145.13 216.93 143.31 219.45 141.8C259.67 118.58 301.4 97.99 344.3 80.24C387.26 62.49 431.29 47.59 476.17 35.63C521.12 23.67 566.75 14.71 612.82 8.76C658.89 2.86 705.33 -0.03 751.78 0.13C937.98 0.13 1138.77 54.24 1238.52 163.09C1338.32 271.95 1384.55 429.44 1384.55 636.81L1385.14 634.99ZM1046.9 858.76L687.31 858.76C410.48 858.76 355.13 1022.96 355.13 1105.05C354.87 1119.64 356.37 1134.17 359.64 1148.38C362.91 1162.59 367.9 1176.32 374.49 1189.3C381.09 1202.33 389.24 1214.45 398.84 1225.44C408.39 1236.49 419.22 1246.25 431.18 1254.61C442.71 1263.35 454.94 1271.18 467.7 1277.99C480.47 1284.8 493.71 1290.65 507.39 1295.47C521.01 1300.25 535.06 1304 549.27 1306.63C563.48 1309.26 577.91 1310.76 592.39 1311.19L1046.9 1311.19L1046.9 858.76Z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.2 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" id="Layer_1" x="0" y="0" style="enable-background:new 0 0 119.2 40.4" version="1.1" viewBox="0 0 119.2 40.4"><style>.st0{fill:#004d6e}</style><path d="M119 0C85.4 9.2 64 16 48.7 32.4c7.4 3 15.1 5.9 21.9 7.9C78.5 24.7 92.8 12.1 119.2.6L119 0zM75.7 4c-4-.3-8.4-1.2-11.9-2.2C56.3 1.5 17.3.5 0 7.9c4.7 2.9 9.6 5.7 15.6 8.9C33 8.7 55.1 5.9 75.7 4.7V4z" class="st0"/><path d="M100.7 3.9c-5.4.7-14 1-19.2 1C66 6.6 38.8 11 23.3 20.5c5.7 2.9 11.4 5.7 17.5 8.2C57 14.8 78.7 8.6 100.7 4.4v-.5z" class="st0"/></svg>
|
||||
|
Before Width: | Height: | Size: 564 B |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 326.24 311.07"><path fill="#1aae5e" d="M266.38 1.26c-.93 9.12-7.71 47.21-27.28 83.44a1 1 0 0 1-1.7-.06c-4-8.24-24.86-44.58-79.29-44.91C96.71 39.35 66.67 87 66.67 87s-23.45 32.93-33.49 94.89-22.61 79-22.61 79L.39 277a2.54 2.54 0 0 0 1.11 3.67c13 5.81 72.68 30.38 151.68 30.38 53.8 0 70-7.58 74.25-10.55a.61.61 0 0 0-.35-1.12c-10.55 1.16-51.2-5.26-51.2-44 0-34.79 25.3-51.62 51.81-52.83 12.56-.58 39.35 4.74 47.72 29.3 7 20.66-2.31 39.15-5.45 44.5a.62.62 0 0 0 .77.89c9.52-3.84 53.71-25.77 55.47-93.95 1.55-59.91-47.64-85.62-70.8-86.71a1.18 1.18 0 0 1-1-1.62c6.23-15.94 45-57.27 51.84-64.46a1.57 1.57 0 0 0 0-2.17A159.05 159.05 0 0 0 268.46.17a1.42 1.42 0 0 0-2.08 1.09Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 730 B |
|
After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 18 KiB |
1
mobile/apps/auth/assets/custom-icons/icons/bbs_nga.svg
Normal file
|
After Width: | Height: | Size: 23 KiB |
@@ -1,13 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="584.48486" >
|
||||
<g transform="translate(-137.5,-22.390163)">
|
||||
<path style="fill:#1c252c" d="m 137.5,29.631487 0,252.320873 132.1114,0 c 51.99819,0 100.05059,-18.25003 100.05059,-71.85789 0,-36.24066 -26.10767,-52.7841 -54.82326,-61.4437 17.4955,-7.01771 37.3423,-21.76056 37.3423,-52.666034 0,-39.55613 -39.24823,-66.353249 -92.09117,-66.353249 l -122.58986,0 z m 80.93311,58.76577 29.75482,0 c 12.11271,0 21.34908,9.487931 21.34908,19.117473 0,8.94677 -9.59745,18.52237 -21.34908,18.52237 l -29.75482,0 0,-37.639843 z m 0,90.008333 39.27636,0 c 13.71131,0 25.21721,10.41366 25.21721,22.31611 0,12.63921 -10.76115,23.13438 -27.59759,23.13438 l -36.89598,0 0,-45.45049 z" id="path2998" />
|
||||
<path id="path3005" d="m 202.9606,309.47481 0,252.32088 132.11141,0 c 51.99819,0 100.05058,-18.25004 100.05058,-71.8579 0,-36.24065 -26.10766,-52.78409 -54.82326,-61.4437 17.4955,-7.01771 37.3423,-21.76056 37.3423,-52.66603 0,-39.55613 -39.24822,-66.35325 -92.09117,-66.35325 l -122.58986,0 z m 80.93312,58.76577 29.75482,0 c 12.11271,0 21.34908,9.48793 21.34908,19.11747 0,8.94678 -9.59745,18.52238 -21.34908,18.52238 l -29.75482,0 0,-37.63985 z m 0,90.00833 39.27636,0 c 13.71131,0 25.21721,10.41366 25.21721,22.31612 0,12.6392 -10.76115,23.13437 -27.5976,23.13437 l -36.89597,0 0,-45.45049 z" style="fill:#1c252c" />
|
||||
<path style="fill:#1c252c" d="m 376.01464,281.92185 0,-252.32088 203.52297,0 0,60.937872 -122.8279,0 0,33.087358 99.73816,0 0,57.12926 -99.73816,0 0,40.46655 122.8279,0 0,60.69984 z" id="path3007"/>
|
||||
<path style="fill:#1c252c" d="m 689.78812,289.1442 c 57.28767,0 103.11071,-32.67744 103.11071,-85.63169 0,-85.46143 -111.17753,-72.31037 -111.17753,-98.91916 0,-10.278288 10.80934,-15.732656 21.89462,-15.732656 19.10438,0 32.9075,12.586126 32.9075,12.586126 L 784.35446,55.903565 C 765.2233,37.697019 735.00886,22.390163 694.30743,22.390163 c -61.12759,0 -101.11859,36.280243 -101.11859,80.044867 0,86.54828 109.57491,73.98694 109.57491,101.14304 0,9.51935 -9.15835,19.09619 -25.76901,19.09619 -18.85922,0 -33.79879,-11.38479 -45.42578,-21.04418 l -48.11128,45.86837 c 19.37303,18.87022 50.47517,41.64575 106.33044,41.64575 z" id="path3009" />
|
||||
<path style="fill:#1c252c" d="m 855.18627,281.92185 0,-191.621047 -66.6508,0 0,-60.699833 214.23473,0 0,60.699833 -66.65082,0 0,191.621047 z" id="path3011" />
|
||||
<path style="fill:#1c252c" d="m 437.90467,309.29628 80.69507,0 0,151.15449 c 0,15.34925 15.27608,29.49386 31.20285,29.49386 15.02419,0 30.2111,-12.77313 30.2111,-30.30098 l 0,-150.34737 80.45703,0 0,149.31902 c 0,59.25051 -49.19276,106.51359 -112.80036,106.51359 -63.96969,0 -109.76569,-51.43651 -109.76569,-109.74208 z" id="path3013" />
|
||||
<path style="fill:#1c252c;fill-opacity:1;stroke:none" d="m 759.97084,561.61716 0,-90.16156 -94.84461,-162.15932 81.6448,0 53.66637,86.88408 53.85177,-86.88408 81.83021,0 -95.21543,163.08638 0,89.2345 z" id="path3015" />
|
||||
<path style="fill:#ffed31" d="m 936.11938,447.38916 -47.60772,47.60772 0,64.27041 47.60772,47.60771 201.38062,0 0,-159.48584 z" id="path3017" />
|
||||
<path style="fill:#1c252c" id="path3024" d="m 469,573.36218 c 0,2.20914 -1.79086,4 -4,4 -2.20914,0 -4,-1.79086 -4,-4 0,-2.20914 1.79086,-4 4,-4 2.20914,0 4,1.79086 4,4 z" transform="matrix(2.6779338,0,0,2.6779338,-327.65077,-1008.3244)" />
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.3 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="113.088"><path fill="#010202" d="M74.686 72.818H63.827l7.316-37.63h10.858l-7.315 37.63M51.347 72.818c-.029-1.263.119-2.579.372-3.894-2.821 3.235-6.185 4.442-10.023 4.442-5.212 0-9.211-2.855-8.122-8.449.862-4.445 4.896-7.405 9.024-8.613 3.778-1.095 7.65-1.536 11.368-1.756l.042-.216c.493-2.525.024-3.511-2.607-3.511-2.141 0-4.292.946-5.08 3.306l-8.331.008c1.524-7.289 8.331-9.896 15.019-9.896 3.292 0 7.429.435 9.788 2.413 3.177 2.578 2.03 6.2 1.255 10.202l-1.909 9.82c-.406 2.085-.756 4.171-.319 6.146H51.347m1.616-13.112c-2.687.274-7.234 1.097-7.896 4.498-.351 1.809.651 2.576 2.352 2.576 4.112 0 4.84-3.456 5.436-6.527l.108-.547z"/><path fill="#E31837" d="M85.378 57.216c-.512 2.657-1.031 5.336-1.031 5.336l-.042.221c-.306 1.563-.656 3.04-.601 4.403.005.129-.023.234-.145.255-.016-.074-.026-.15-.04-.224v.013a56.074 56.074 0 0 1-.78-15.303h3.926l-1.287 5.299m47.624 6.989c-.355 1.809.649 2.578 2.35 2.578 4.115 0 4.84-3.456 5.438-6.527l.108-.551c-2.686.277-7.237 1.099-7.896 4.5zm-48.881 5.273c.011.111.056.248.143.469.105.192.227.382.361.564 1.695 2.307 4.31 3.238 7.292 2.855l6.577-.825 1.524-7.84c-1.094.271-2.18.493-3.222.493-2.578 0-2.051-1.592-1.655-3.623l1.879-9.654h5.484l1.387-7.134h-5.597l1.824-9.601H90.88l-2.399 9.601h-4.667C89.287 19.691 111.632.894 138.366.894c26.742 0 49.093 18.802 54.558 43.904-1.139-.39-2.409-.562-3.633-.562-3.4 0-6.894 1.316-8.831 4.498h-.105l.764-3.952h-10.258l-5.446 28.034h10.859l3.145-16.182c.448-2.304 1.224-4.882 4.242-4.882 2.359 0 1.9 2.357 1.571 4.06l-3.307 17.004h9.926c-6.907 22.996-28.237 39.752-53.484 39.752-26.041 0-47.922-17.83-54.096-41.951a45.902 45.902 0 0 0-.398-1.292c.111-.024.213.039.248.153zM157.707 42.1h10.861l1.452-7.461h-10.863l-1.45 7.461zm-36.763 12.011c.714 0 1.373 0 2.235.016l1.911-9.778-1.46-.111c-4.271-.33-6.831 2.413-8.523 6.309h-.11l1.12-5.763h-9.27l-5.449 28.034h10.862l2.367-12.18c.318-1.645.672-3.454 1.705-4.824 1.19-1.592 2.859-1.703 4.612-1.703zm29.131 12.561 1.908-9.817c.778-4.004 1.919-7.626-1.252-10.205-2.359-1.972-6.499-2.413-9.791-2.413-6.686 0-13.492 2.607-15.017 9.896l8.331-.008c.788-2.356 2.939-3.306 5.08-3.306 2.631 0 3.098.986 2.607 3.511l-.043.216c-3.717.223-7.59.661-11.367 1.758-4.128 1.208-8.162 4.168-9.026 8.61-1.086 5.594 2.91 8.449 8.125 8.449 3.838 0 7.199-1.208 10.022-4.445-.255 1.318-.403 2.634-.374 3.896h10.479c-.436-1.974-.088-4.056.318-6.142zm12.522 6.146 5.449-28.034h-10.861l-5.449 28.034h10.861z"/><path fill="#010202" d="M22.016 34.639c-11.847 0-18.81 8.995-20.921 19.856-2.08 10.695 2.257 18.871 13.556 18.871 8.668 0 16.063-5.597 18.749-14.948H22.812c-1.163 3.578-3.108 6.282-6.422 6.282-5.209 0-4.181-6.422-3.448-10.205.693-3.564 2.438-11.41 7.54-11.41 3.648 0 4.255 3.512 3.601 7.334h10.703l.119-.696h.032c1.054-9.381-3.323-15.084-12.921-15.084"/><path fill="#E31837" d="M191.954 75.952c0-2.111 1.711-3.667 3.733-3.667 2.001 0 3.712 1.556 3.712 3.667 0 2.125-1.711 3.68-3.712 3.68-2.022 0-3.733-1.555-3.733-3.68m3.734 3.069c1.661 0 2.971-1.302 2.971-3.069 0-1.743-1.31-3.055-2.971-3.055-1.682 0-2.995 1.313-2.995 3.055-.001 1.767 1.313 3.069 2.995 3.069zm-.778-.944h-.644v-4.236h1.616c1.002 0 1.494.369 1.494 1.205 0 .759-.475 1.089-1.099 1.168l1.207 1.864h-.723l-1.114-1.835h-.738v1.834zm.767-2.381c.546 0 1.031-.037 1.031-.69 0-.525-.478-.62-.923-.62h-.875v1.31h.767z"/></svg>
|
||||
|
Before Width: | Height: | Size: 3.3 KiB |
@@ -1,71 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
width="926.65619"
|
||||
height="958.5625"
|
||||
id="svg2"
|
||||
inkscape:version="0.48.1 "
|
||||
sodipodi:docname="Capcom icon.svg">
|
||||
<metadata
|
||||
id="metadata3015">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1835"
|
||||
inkscape:window-height="1058"
|
||||
id="namedview3013"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.32"
|
||||
inkscape:cx="1623.239"
|
||||
inkscape:cy="170.71783"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0" />
|
||||
<defs
|
||||
id="defs4" />
|
||||
<g
|
||||
transform="translate(2426,-55.799683)"
|
||||
id="layer1">
|
||||
<path
|
||||
d="m -1552.0877,1007.6508 4.1189,-358.25737 -199.9062,0 c -15.7424,43.40396 -59.9402,72.71875 -113.25,72.71875 -28.0932,0 -58.13,-6.62565 -82.4688,-21.25 -31.7176,-19.0581 -55.4185,-41.69206 -74.9375,-81.90625 -15.3567,-37.21359 -27.109,-82.77963 -28.4687,-123.09375 4.6791,-79.72921 28.9019,-108.14789 73.25,-141.03125 9.8313,-7.28971 37.2996,-13.1189 45.2187,-13.15625 17.4221,-0.0822 31.9427,10.48615 39.8125,26.0625 11.4471,22.65651 -5.3079,50.1006 -21.875,69.625 l 161.625,111.34375 249.625,-261.1875 c -87.0859,-138.79748 -246.2201,-231.718747 -428.0937,-231.718747 -275.3534,0 -498.5625,212.989027 -498.5625,475.718747 0,262.72972 216.0662,461.41517 498.5625,482.84377 l 376.5933,-1.6875 c 0.2227,-314.9224 -12.7573,-290.91079 -1.2435,-5.0239 z"
|
||||
id="path3840"
|
||||
style="fill:#0c4da2;fill-opacity:1;stroke:none"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccssccssscccssccc" />
|
||||
<path
|
||||
d="m -1927.7708,145.18332 c -226.9823,1.42857 -412.3662,166.7661 -412.3662,383.05133 0,216.28523 204.6469,402.07109 452.3662,396.47808 l 240.7127,0.6783 0,-189.50724 -45.4634,0 c -14.2837,35.73115 -80.9968,70.68064 -129.3669,70.68064 -25.4902,0 -89.6606,-3.46506 -113.3988,-11.7792 -41.9106,-14.67892 -101.712,-35.75045 -153.7082,-123.14142 -13.9338,-30.6351 -53.1686,-105.28898 -44.4023,-214.19078 4.2456,-65.63495 45.9366,-147.56776 120.7486,-184.67165 32.6212,-16.17886 65.4607,-18.83348 123.1208,-13.60101 41.3957,3.75653 82.5276,32.86328 96.8886,67.79717 11.107,27.01833 7.9153,59.94169 -5.16,78.69532 -0.9328,1.33796 -0.9528,2.52293 -0.7595,3.80017 0.1471,0.97218 1.408,2.592 1.408,2.592 l 22.7845,17.79932 c 0,0 6.4866,4.50696 14.0636,4.30516 4.4004,-0.11719 12.2667,-4.89104 12.2667,-4.89104 l 130.1212,-136.55317 c -80.4452,-108.54703 -223.4056,-147.54198 -309.8556,-147.54198 z"
|
||||
id="path3950"
|
||||
style="fill:#ffcb08;fill-opacity:1;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 16 KiB |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 438 438" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"><rect id="Artboard1" x="0" y="0" width="437.5" height="437.5" style="fill:none;"/><g id="layer101"><path d="M80.861,420.364c-4.353,-1.171 -8.1,-4.433 -10.133,-8.799l-1.102,-2.397l0.27,-99.121c0.291,-94.079 0.36,-100.573 1.396,-103.303c0.216,-0.469 -1.105,-1.372 -5.198,-3.524c-25.794,-13.562 -44.713,-37.051 -52.206,-64.809c-2.864,-10.522 -3.359,-14.797 -3.306,-28.127c0.096,-13.244 0.362,-15.721 3.139,-26.22c4.859,-18.438 14.538,-34.891 28.434,-48.251c15.784,-15.189 35.348,-24.767 57.621,-28.224c6.712,-1.041 23.289,-0.974 30.121,0.164c17.719,2.848 33.842,9.706 47.898,20.401c5.197,3.951 12.219,10.687 16.429,15.746c1.786,2.143 3.359,3.944 3.53,4.03c0.17,0.043 1.457,-1.276 2.831,-2.98c1.374,-1.703 4.464,-5.023 6.823,-7.364c16,-15.872 36.506,-26.044 59.249,-29.328c6.883,-0.998 22.306,-0.936 29.095,0.117c24.21,3.771 45.357,14.964 61.863,32.804c14.591,15.824 23.698,35.557 26.684,57.999c0.705,5.216 0.645,20.34 -0.103,25.635c-3.387,24.211 -13.551,44.465 -30.708,61.272c-8.322,8.17 -17.577,14.713 -27.465,19.501c-1.841,0.89 -2.398,1.358 -2.187,1.871c1.355,3.125 1.433,5.048 1.331,30.426c-0.056,14.056 -0.017,25.549 0.111,25.55c0.128,0 18.029,-10.353 39.741,-22.998c21.712,-12.602 40.555,-23.464 41.839,-24.057c1.969,-0.932 2.952,-1.099 6.199,-1.086c3.29,0.013 4.229,0.188 6.276,1.178c3.241,1.509 6.433,4.598 7.874,7.594l1.186,2.398l-0.204,83.099c-0.171,63.745 -0.335,83.526 -0.726,84.977c-1.733,6.188 -8.375,11.117 -14.998,11.091c-4.742,-0.019 -4.742,-0.019 -46.94,-25.012l-40.62,-24.046l-0.32,26.574c-0.309,23.754 -0.407,26.83 -1.054,28.451c-1.899,4.649 -5.458,7.967 -10.164,9.444c-2.695,0.843 -3.763,0.839 -116.64,0.344c-88.824,-0.356 -114.33,-0.586 -115.866,-1.02Zm140.434,-223.059c-0.256,-0.215 -1.661,-1.331 -3.195,-2.448c-6.858,-5.197 -12.604,-10.732 -18.726,-18.148c-1.021,-1.243 -2,-2.187 -2.128,-2.145c-0.171,0.085 -1.759,1.873 -3.562,4.002c-4.25,5.067 -10.769,11.151 -16.426,15.444l-4.585,3.442l24.524,0.098c13.458,0.054 24.31,-0.073 24.098,-0.245Zm-94.961,-25.46c25.4,-5.495 44.191,-24.646 49.163,-50.005c1.571,-8.239 1.017,-19.307 -1.512,-27.991c-5.519,-19.291 -20.708,-35.245 -39.61,-41.602c-7.594,-2.551 -10.669,-3.033 -19.726,-3.069c-8.673,-0.035 -11.751,0.38 -18.767,2.573c-19.293,5.99 -35.166,22.119 -40.926,41.621c-2.598,8.663 -3.241,19.726 -1.736,27.978c2.552,13.511 8.999,25.415 18.788,34.683c9.024,8.495 19.726,13.836 32.534,16.194c4.355,0.787 17.43,0.583 21.792,-0.382Zm167.009,0.498c5.987,-1.343 8.683,-2.315 14.804,-5.324c17.081,-8.391 28.977,-23.639 33.369,-42.847c0.87,-3.756 1.006,-5.636 1.033,-12.344c0.026,-6.707 -0.094,-8.588 -0.934,-12.351c-5.454,-24.845 -23.837,-43.29 -48.596,-48.773c-5.165,-1.174 -18.751,-1.228 -23.925,-0.096c-25.999,5.536 -45.305,25.454 -49.553,51.114c-0.831,4.91 -0.869,14.31 -0.077,19.226c4.125,26.164 24.251,46.796 50.422,51.686c6.233,1.178 17.642,1.01 23.457,-0.291Z" style="fill:#fff;fill-rule:nonzero;"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 3.2 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" id="Layer_1" x="0" y="0" style="enable-background:new 0 0 83.8 44.2" version="1.1" viewBox="0 0 83.8 44.2"><style>.st0{fill:#006298}</style><g id="clipper_logo" transform="translate(-94.453 -83.393)"><path id="Path_1" d="M136.8 106.2c-.9 1.9-2.7 3.1-4.8 3.1-3 0-5.4-2.3-5.4-5.3s2.3-5.4 5.3-5.4c2.1 0 4 1.2 4.9 3.1h-2.2c-.7-.9-1.7-1.4-2.8-1.4-1.9.1-3.4 1.7-3.4 3.6 0 1.9 1.5 3.5 3.4 3.6 1 0 2-.5 2.6-1.3h2.4z" class="st0"/><path id="Path_2" d="M138.3 98.8h1.9v8.5h3.1v1.8h-5V98.8z" class="st0"/><path id="Path_3" d="M144.8 98.8h1.9v10.3h-1.9V98.8z" class="st0"/><path id="Path_4" d="M148.2 98.8h2.6c1.1-.1 2.1.2 3 .8 1.3 1.3 1.3 3.5 0 4.8-.9.6-1.9.9-3 .8h-.7v3.9h-1.9V98.8zm1.9 4.6h.6c.8 0 2.2-.1 2.2-1.4s-1.3-1.4-2.1-1.4h-.7v2.8z" class="st0"/><path id="Path_5" d="M156.3 98.8h2.6c1.1-.1 2.1.2 3 .8 1.3 1.3 1.3 3.5 0 4.8-.9.6-1.9.9-3 .8h-.7v3.9h-1.9V98.8zm1.9 4.6h.6c.8 0 2.2-.1 2.2-1.4s-1.3-1.4-2.1-1.4h-.7v2.8z" class="st0"/><path id="Path_6" d="M164.3 98.8h5.5v1.8h-3.6v2.5h3.5v1.8h-3.5v2.4h3.6v1.8h-5.5V98.8z" class="st0"/><path id="Path_7" d="M171.3 98.8h3.2c.9-.1 1.8.2 2.5.7.8.6 1.2 1.5 1.2 2.5 0 .9-.4 1.8-1 2.5-.5.4-1.1.7-1.7.8l2.8 3.8H176l-2.7-3.9v3.9h-1.9V98.8h-.1zm2 4.9h1.2c1.6 0 1.8-1 1.8-1.6s-.3-1.6-1.8-1.6h-1.2v3.2z" class="st0"/><path id="Path_8" d="M99.6 86.6c-.1-.2.1-.4.1-.4.2-.3 1.5-1.8 1.8-2.2.1-.1.2-.2.3-.2.2 0 .3.1.3.2.1.1 1.8 2.2 1.8 2.2s.2.2.1.4-.4.2-.4.2H100s-.3 0-.4-.2z" class="st0"/><path id="Path_9" d="M98.5 91.6c-.1-.2.1-.5.2-.6.4-.4 2.3-2.8 2.7-3.3.2-.2.3-.3.5-.3s.4.1.5.3c.1.1 2.7 3.3 2.7 3.3s.3.3.2.6c-.1.2-.4.3-.6.3h-5.5c-.1 0-.6 0-.7-.3z" class="st0"/><path id="Path_10" d="M97.2 98.3c-.2-.3.2-.7.2-.8.5-.6 3.2-3.8 3.8-4.5.1-.3.4-.4.7-.4.4 0 .5.3.6.4.1.1 3.8 4.5 3.8 4.5s.4.5.2.8c-.2.4-.8.4-.8.4H98s-.6 0-.8-.4z" class="st0"/><path id="Path_11" d="M94.5 100.3c-.2.5.3 1.1.4 1.3.8 1 5 6 5.9 7.1.2.4.6.6 1 .6s.8-.2 1-.6c.2-.2 5.9-7.1 5.9-7.1s.6-.7.4-1.3c-.3-.7-1.3-.7-1.3-.7h-12s-1 0-1.3.7z" class="st0"/><path id="Path_12" d="M110 88.2c-.1-.3 0-.5.2-.7.4-.5 2.7-3.2 3.1-3.8.1-.2.4-.3.6-.3.2 0 .4.1.5.3.1.1 3.1 3.8 3.1 3.8s.3.4.2.7c-.1.2-.4.4-.7.3h-6.4c.1.1-.4.1-.6-.3z" class="st0"/><path id="Path_13" d="M108.1 96.9c-.2-.4.2-.9.3-1 .6-.8 4-4.8 4.7-5.7.3-.3.4-.5.8-.5.3 0 .7.2.8.5.1.2 4.7 5.7 4.7 5.7s.5.6.3 1c-.2.3-.6.5-1 .5h-9.6s-.8.1-1-.5z" class="st0"/><path id="Path_14" d="M105.8 108.5c-.3-.6.3-1.3.4-1.4.9-1.1 5.6-6.7 6.6-7.9.4-.5.6-.7 1.2-.7.5 0 .9.3 1.1.7.2.2 6.5 7.9 6.5 7.9s.7.8.4 1.4c-.3.4-.8.7-1.4.7h-13.3c-.6.1-1.2-.2-1.5-.7z" class="st0"/><path id="Path_15" d="M101.2 112c-.2.8 0 1.6.6 2.2 1.4 1.7 8.7 10.5 10.3 12.3.4.6 1.1 1 1.8 1s1.3-.4 1.7-1c.3-.3 10.3-12.3 10.3-12.3s1.1-1.3.6-2.2c-.6-1.2-2.3-1.1-2.3-1.1h-20.9c-.9-.1-1.7.3-2.1 1.1z" class="st0"/><path id="Path_16" d="M121.6 125.7c0 1-.8 1.8-1.8 1.8s-1.8-.8-1.8-1.8.8-1.8 1.8-1.8c.9-.1 1.8.6 1.8 1.6.1.1.1.2 0 .2zm-3.2 0c0 .8.6 1.4 1.4 1.4.8 0 1.4-.6 1.4-1.4s-.6-1.4-1.4-1.4c-.8 0-1.4.6-1.4 1.4zm1.4-1c.2 0 .8 0 .8.6 0 .2-.2.4-.4.4.2 0 .4.2.4.6v.4h-.4v-.4c0-.4 0-.4-.4-.4h-.4v.8h-.4v-2.1l.8.1zm-.4.9h.4c.2 0 .4 0 .4-.4 0-.2-.2-.2-.4-.2h-.4v.6z" class="st0"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 3.1 KiB |
@@ -1,27 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1220.8 227.9" style="enable-background:new 0 0 1220.8 227.9;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#0D253E;}
|
||||
.st1{fill:#008AFB;}
|
||||
</style>
|
||||
<title>CoinTracking light</title>
|
||||
<g id="Layer_2_1_">
|
||||
<g id="Layer_1-2">
|
||||
<path class="st0" d="M198.1,167c-30.2,0-54.7-24.5-54.7-54.7s24.5-54.7,54.7-54.7s54.7,24.5,54.7,54.7l0,0 C252.8,142.5,228.3,167,198.1,167z M198.1,81.6c-17,0-30.7,13.7-30.7,30.7s13.7,30.7,30.7,30.7s30.7-13.7,30.7-30.7l0,0 C228.8,95.4,215,81.6,198.1,81.6z"/>
|
||||
<path class="st0" d="M292.2,59.5h-23.6v107.9h23.6V59.5z"/>
|
||||
<path class="st0" d="M339.5,167.4h-23.8V59.5h23.8v16.2c6.2-12.5,21-18.5,33-18.5c26.1,0,41.1,16.9,41.1,47.3v62.8h-23.8v-60.1 c0-17.1-8.8-26.8-22.6-26.8c-14.1,0-27.7,7.6-27.7,28.9V167.4z"/>
|
||||
<path class="st1" d="M390.6,8.2h151.7v22.9h-65.9v136.3h-25V31.1h-60.9V8.2H390.6z"/>
|
||||
<path class="st1" d="M540.3,167.4h-23.8V59.5h23.8V79c7.4-13.5,15.4-19.5,29.6-21.8c7.5-1.2,15.7,1.8,19.2,4.2l-3.9,22 c-4.9-2.5-10.4-3.8-15.9-3.7c-20.3,0-28.9,20.3-28.9,49L540.3,167.4L540.3,167.4z"/>
|
||||
<path class="st1" d="M680.7,151.9c-7.2,11.8-22.9,17.8-36.3,17.8c-29.1,0-54.8-21.9-54.8-56.4s25.6-56.1,54.8-56.1 c12.9,0,28.9,5.3,36.3,17.5V59.5h23.6v107.9h-23.6V151.9z M647.2,146.6c17.6,0,33.3-12.2,33.3-33.5s-17.1-32.8-33.3-32.8 c-18,0-33,12.9-33,32.8S629.2,146.6,647.2,146.6L647.2,146.6z"/>
|
||||
<path class="st1" d="M778.4,57.2c17.1,0,32.6,6.7,42.7,18.7l-18.5,14.8c-5.8-6.7-14.8-10.4-24.3-10.4c-18,0-34,12.7-34,32.8 s15.9,33.7,34,33.7c9.5,0,18.5-3.9,24.3-10.6l18.7,14.6c-10.2,12-25.6,18.9-43,18.9c-31,0-57.5-22.4-57.5-56.6 S747.4,57.2,778.4,57.2z"/>
|
||||
<path class="st1" d="M860.3,117.2v50.1h-23.6V0.8h23.6V95l34.2-35.6h31.9l-46,46.9l56.4,61h-30.5L860.3,117.2z"/>
|
||||
<path class="st1" d="M967.4,59.5h-23.6v107.9h23.6V59.5z"/>
|
||||
<path class="st1" d="M1014.7,167.4h-23.8V59.5h23.8v16.2c6.2-12.5,21-18.5,33-18.5c26.1,0,41.1,16.9,41.1,47.3v62.8H1065v-60.1 c0-17.1-8.8-26.8-22.6-26.8c-14.1,0-27.7,7.6-27.7,28.9V167.4z"/>
|
||||
<path class="st1" d="M1220.2,111.5c0-12.3-4.5-24.2-12.5-33.6l13-17.1l-19.6-13l-11.9,15.7c-8.3-4.1-17.5-6.2-26.8-6.2 c-31.9,0-57.8,24.4-57.8,54.3s25.9,54.3,57.8,54.3c20.2,0,34.2,10.2,34.2,19.3s-14.1,19.3-34.2,19.3s-34.2-10.2-34.2-19.3h-23.6 c0,24,25.4,42.9,57.8,42.9s57.8-18.8,57.8-42.9c0-13.2-7.7-24.8-19.9-32.6C1212.5,142.5,1220.2,127.8,1220.2,111.5z M1128.2,111.5 c0-16.9,15.4-30.7,34.2-30.7s34.2,13.8,34.2,30.7s-15.4,30.7-34.2,30.7S1128.2,128.4,1128.2,111.5L1128.2,111.5z"/>
|
||||
<path class="st0" d="M81.4,170.5C36.4,170.5,0,134,0,89c0-21.6,8.6-42.3,23.9-57.6c31.8-31.8,83.4-31.8,115.2,0l0,0l-17.7,17.7 C99.3,27,63.6,27,41.5,49.1s-22.1,57.8,0,79.9s57.8,22.1,79.9,0l17.7,17.7C123.8,162,103.1,170.6,81.4,170.5z"/>
|
||||
<circle class="st0" cx="280.7" cy="15.5" r="15.5"/>
|
||||
<circle class="st1" cx="954.7" cy="15.5" r="15.5"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.0 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M63.7-161.7h-90.9v272.8h90.9zm0 363.7h363.7v-90.9H63.7zm0-363.7h363.7v-90.9H63.7z" style="fill:#8c52ff;fill-opacity:.302" transform="translate(84.664 310.016)"/><path d="M48.2-177.1h-90.9V95.6h90.9zm0 363.6h363.7V95.6H48.2zm0-363.6h363.7V-268H48.2z" style="fill:#8c52ff;fill-opacity:.502" transform="translate(71.406 296.758)"/><path d="M32.8-192.6h-90.9V80.2h90.9zm0 363.7h363.7V80.2H32.8zm0-363.7h363.7v-90.9H32.8z" style="fill:#8c52ff" transform="translate(58.147 283.5)"/></svg>
|
||||
|
Before Width: | Height: | Size: 574 B |
|
Before Width: | Height: | Size: 7.4 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 2" viewBox="0 0 377.1 277.86"><path d="M373.15 23.32c-4-1.95-5.72 1.77-8.06 3.66-.79.62-1.47 1.43-2.14 2.14-5.85 6.26-12.67 10.36-21.57 9.86-13.04-.71-24.16 3.38-33.99 13.37-2.09-12.31-9.04-19.66-19.6-24.38-5.54-2.45-11.13-4.9-14.99-10.23-2.71-3.78-3.44-8-4.81-12.16-.85-2.51-1.72-5.09-4.6-5.52-3.13-.5-4.36 2.14-5.58 4.34-4.93 8.99-6.82 18.92-6.65 28.97.43 22.58 9.97 40.56 28.89 53.37 2.16 1.46 2.71 2.95 2.03 5.09-1.29 4.4-2.82 8.68-4.19 13.09-.85 2.82-2.14 3.44-5.15 2.2-10.39-4.34-19.37-10.76-27.29-18.55-13.46-13.02-25.63-27.41-40.81-38.67-3.57-2.64-7.12-5.09-10.81-7.41-15.49-15.07 2.03-27.45 6.08-28.9 4.25-1.52 1.47-6.79-12.23-6.73-13.69.06-26.24 4.65-42.21 10.76-2.34.93-4.79 1.61-7.32 2.14-14.5-2.73-29.55-3.35-45.29-1.58-29.62 3.32-53.28 17.34-70.68 41.28C1.29 88.2-3.63 120.88 2.39 155c6.33 35.91 24.64 65.68 52.8 88.94 29.18 24.1 62.8 35.91 101.15 33.65 23.29-1.33 49.23-4.46 78.48-29.24 7.38 3.66 15.12 5.12 27.97 6.23 9.89.93 19.41-.5 26.79-2.02 11.55-2.45 10.75-13.15 6.58-15.13-33.87-15.78-26.44-9.36-33.2-14.54 17.21-20.41 43.15-41.59 53.3-110.19.79-5.46.11-8.87 0-13.3-.06-2.67.54-3.72 3.61-4.03 8.48-.96 16.72-3.29 24.28-7.47 21.94-12 30.78-31.69 32.87-55.33.31-3.6-.06-7.35-3.86-9.24ZM181.96 235.97c-32.83-25.83-48.74-34.33-55.31-33.96-6.14.34-5.04 7.38-3.69 11.97 1.41 4.53 3.26 7.66 5.85 11.63 1.78 2.64 3.01 6.57-1.78 9.49-10.57 6.58-28.95-2.2-29.82-2.64-21.38-12.59-39.26-29.24-51.87-52.01-12.16-21.92-19.23-45.43-20.39-70.52-.31-6.08 1.47-8.22 7.49-9.3 7.92-1.46 16.11-1.77 24.03-.62 33.49 4.9 62.01 19.91 85.9 43.63 13.65 13.55 23.97 29.71 34.61 45.49 11.3 16.78 23.48 32.75 38.97 45.84 5.46 4.59 9.83 8.09 14 10.67-12.59 1.4-33.62 1.71-47.99-9.68Zm15.73-101.32c0-2.7 2.15-4.84 4.87-4.84.6 0 1.16.12 1.66.31.67.25 1.29.62 1.77 1.18.87.84 1.36 2.08 1.36 3.35 0 2.7-2.15 4.84-4.85 4.84s-4.81-2.14-4.81-4.84Zm48.86 25.12c-3.13 1.27-6.26 2.39-9.27 2.51-4.67.22-9.77-1.68-12.55-4-4.3-3.6-7.36-5.61-8.67-11.94-.54-2.7-.23-6.85.25-9.24 1.12-5.15-.12-8.44-3.74-11.44-2.96-2.45-6.7-3.1-10.82-3.1-1.54 0-2.95-.68-4-1.24-1.72-.87-3.13-3.01-1.78-5.64.43-.84 2.53-2.92 3.02-3.29 5.58-3.19 12.03-2.14 18 .25 5.54 2.26 9.71 6.42 15.72 12.28 6.16 7.1 7.26 9.09 10.76 14.39 2.76 4.19 5.29 8.47 7.01 13.37 1.04 3.04-.31 5.55-3.94 7.1Z" data-name="Layer 1" style="fill:#4d6bfe;stroke-width:0"/></svg>
|
||||
|
Before Width: | Height: | Size: 2.3 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="18.5 18.2 162.9 163.7"><path fill="#FFF" d="m71 70.9 49.6-49.6c3.7-3.7 7.9-4.4 12.4 0l46.1 46.1c3.3 3.3 3 8.3 0 11.3L78.8 178.9c-3.6 3.6-8.3 4.2-12.5 0l-45.1-45.1c-3.6-3.6-3.3-9.3 0-12.6L71 70.9z"/><path fill="#006491" d="m71.8 76 51.9 51.9-47.2 47.2c-2.9 2.9-5.9 3-8.9 0l-43.2-43.2c-2.7-2.7-2.5-5.7 0-8.2L71.8 76z"/><path fill="#E31837" d="M127 124.8 75.1 72.9l47.2-47.2c2.9-2.9 5.9-3 8.9 0l43.2 43.2c2.7 2.7 2.5 5.7 0 8.2L127 124.8z"/><circle cx="126.7" cy="73" r="12.8" fill="#FFF"/><circle cx="90.8" cy="127.9" r="12.8" fill="#FFF"/><circle cx="53.4" cy="127.9" r="12.8" fill="#FFF"/></svg>
|
||||
|
Before Width: | Height: | Size: 664 B |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" id="Layer_1" x="0" y="0" style="enable-background:new 0 0 516.2 100" version="1.1" viewBox="0 0 516.2 100"><style>.st0{fill:#ef6a00}</style><path d="M36.3 2.1H15.4C6.5 2.1 0 8.6 0 17.5v65.1C0 91.5 6.5 98 15.4 98h20.9C66.1 97.9 87 78.2 87 50S66.1 2.1 36.3 2.1zm1 70.4H26.6v-45h10.7c13.6 0 23.1 9.2 23.1 22.5s-9.5 22.5-23.1 22.5zM176.6 13.6C176.6 5.7 171 0 163.3 0 155.6 0 150 5.8 150 13.6v44.7c0 8.6-6.5 15.4-14.8 15.4s-14.8-6.8-14.8-15.4V13.6c0-7.9-5.6-13.6-13.3-13.6-7.7 0-13.3 5.7-13.3 13.6v45.9c0 23.9 17 40.5 41.4 40.5s41.4-16.7 41.4-40.5V13.6zM352.7 75.2l-22.6-25.6 21.1-24.7c3.1-3.6 4.7-7.2 4.7-10.5 0-8-6.2-14.4-14-14.4-4 0-7.7 2.2-11.4 6.7l-23.8 31.9v-25c0-8.1-5.4-13.6-13.3-13.6-8 0-13.3 5.5-13.3 13.6v72.8c0 8.1 5.4 13.6 13.3 13.6 8 0 13.3-5.5 13.3-13.6V61.2l25.6 32.5c3.7 4.5 6.9 6.3 10.9 6.3 7.9 0 13.6-6 13.6-14.4 0-3.7-1.5-7.5-4.1-10.4zM390.2 13.6c0-8.1-5.4-13.6-13.3-13.6-8 0-13.3 5.5-13.3 13.6v72.8c0 8.1 5.4 13.6 13.3 13.6 8 0 13.3-5.5 13.3-13.6V13.6z" class="st0"/><path d="M516.1 14.4c.9-7.4-4.6-12-10.2-12.7-4.7-.6-8.2.9-10.6 4.2-1.8 2.5-2.9 6.2-3.6 12.1-.7 6.1-.6 10.2.2 12.9 1.2 3.6 4 5.8 7.8 6.3 7.2.8 10.7-5 14.8-16.8.8-2.5 1.5-4.8 1.6-6z" style="fill:#c63663"/><path d="M212.8 49.2v37.2c0 8.1-5.4 13.6-13.3 13.6-8 0-13.3-5.5-13.3-13.6V13.6c0-8.1 5.4-13.6 13.3-13.6 3.8 0 7.3 1.4 9.4 3.5 2 2.1 35.5 47.3 35.5 47.3V13.6c0-8.1 5.4-13.6 13.3-13.6 8 0 13.3 5.5 13.3 13.6v72.8c0 8.1-5.4 13.6-13.3 13.6-3.8 0-7.3-1.4-9.4-3.5-2.2-2.1-35.5-47.3-35.5-47.3zM426.1 49.2v37.2c0 8.1-5.4 13.6-13.3 13.6-8 0-13.3-5.5-13.3-13.6V13.6c0-8.1 5.4-13.6 13.3-13.6 3.8 0 7.3 1.4 9.4 3.5 2 2.1 35.5 47.3 35.5 47.3V13.6C457.7 5.5 463 0 471 0s13.3 5.5 13.3 13.6v72.8c0 8.1-5.4 13.6-13.3 13.6-3.8 0-7.3-1.4-9.4-3.5-2.1-2.1-35.5-47.3-35.5-47.3zM498.4 90.1h-2.2c-.4 0-.7.3-.7.7v5.3c0 .4.3.7.7.7.4 0 .7-.3.7-.7v-1.7h.9l1.6 2.2c.1.2.4.3.6.3.4 0 .7-.3.7-.7 0-.2-.1-.3-.3-.6l-1-1.4.3-.2c.5-.4.8-1 .8-1.7 0-1.3-.9-2.2-2.1-2.2zm-.6 3.3h-1v-2.3h1c.7 0 1.2.5 1.2 1.1s-.4 1.2-1.2 1.2z" class="st0"/><path d="M497.8 86.9c-3.7 0-6.7 2.9-6.7 6.5s3 6.5 6.7 6.5 6.7-2.9 6.7-6.5c.1-3.5-2.9-6.5-6.7-6.5zm0 11.9c-3 0-5.4-2.4-5.4-5.4 0-3 2.4-5.4 5.4-5.4 3 0 5.4 2.4 5.4 5.4 0 3-2.4 5.4-5.4 5.4z" class="st0"/></svg>
|
||||
|
Before Width: | Height: | Size: 2.2 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" fill="none"><g clip-path="url(#a)"><path fill="#19BA19" d="M64 128c35.3462 0 64-28.6538 64-64 0-35.3462-28.6538-64-64-64C28.6538 0 0 28.6538 0 64c0 35.3462 28.6538 64 64 64Z"/><path fill="#fff" d="M96.6725 54.9921a2.4812 2.4812 0 0 0 0-3.51l-20.25-20.25a2.4822 2.4822 0 0 0-1.755-.7272 2.4807 2.4807 0 0 0-1.755.7272l-7.25 7.25a2.4812 2.4812 0 0 1-3.51 0l-7.195-7.22a2.4822 2.4822 0 0 0-1.755-.7272 2.4804 2.4804 0 0 0-1.755.7272l-20.2212 20.25a2.4802 2.4802 0 0 0-.7273 1.755 2.4812 2.4812 0 0 0 .7273 1.755l7.25 7.25a2.4815 2.4815 0 0 1 0 3.51l-7.25 7.1863a2.4809 2.4809 0 0 0 0 3.51l20.25 20.25a2.4822 2.4822 0 0 0 1.755.7272 2.4807 2.4807 0 0 0 1.755-.7272l7.25-7.25a2.4809 2.4809 0 0 1 3.51 0l7.25 7.25a2.4822 2.4822 0 0 0 1.755.7272 2.4807 2.4807 0 0 0 1.755-.7272l20.25-20.25a2.4826 2.4826 0 0 0 .7272-1.755 2.4809 2.4809 0 0 0-.7272-1.755l-7.25-7.25a2.4824 2.4824 0 0 1-.7273-1.755 2.4809 2.4809 0 0 1 .7273-1.755l7.1662-7.2088v-.0075ZM82.0663 67.9596c0 7.7875-6.35 14.1375-14.1375 14.1375h-7.955c-7.7875 0-14.1375-6.35-14.1375-14.1375v-7.96c0-7.7875 6.35-14.1375 14.1375-14.1375h7.955c7.7875 0 14.1375 6.35 14.1375 14.1375v7.96Z"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h128v128H0z"/></clipPath></defs></svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 17 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" id="Layer_1" x="0" y="0" style="enable-background:new 0 0 77.8 99.5" version="1.1" viewBox="0 0 77.8 99.5"><style>.st3{fill:#e63888}.st4{fill:#1d4f91}</style><path d="M37.4 23.4h11.2c3.4 0 6.1-2.7 6.1-6.1V6.1C54.7 2.7 52 0 48.6 0H37.4c-3.4 0-6.1 2.7-6.1 6.1v11.2c.1 3.4 2.7 6.1 6.1 6.1z" style="fill:#426da9"/><path d="M26.4 29.2c0-3.8-3.1-6.9-6.9-6.9H6.9c-3.8 0-6.9 3.1-6.9 6.9v12.7c0 3.7 3.1 6.8 6.9 6.8h12.6c3.8 0 6.9-3 6.9-6.8V29.2z" style="fill:#6d2077"/><path d="M18.3 58.9h-7.8c-2.3 0-4.2 1.9-4.2 4.2v7.8c0 2.3 1.9 4.2 4.2 4.2h7.8c2.3 0 4.2-1.9 4.2-4.2v-7.8c0-2.3-1.9-4.2-4.2-4.2z" style="fill:#af1685"/><path d="M72.7 14.9h-6.4c-1.9 0-3.4 1.5-3.4 3.4v6.4c0 1.9 1.5 3.4 3.4 3.4h6.4c1.9 0 3.5-1.6 3.4-3.4v-6.4c-.1-1.9-1.5-3.4-3.4-3.4zM39.1 80.5H30c-2.8 0-5 2.3-5 5v9.2c0 2.7 2.3 4.9 5 4.9h9.2c2.7 0 5-2.2 5-5v-9.1c-.1-2.8-2.4-5-5.1-5z" class="st3"/><path d="M52.7 36.4c-10.2 0-18.3 8.2-18.3 18.2 0 10.1 8.1 18.3 18.1 18.3h.2c4.9 0 9.5-1.9 12.6-5.2.6-.6 1.1-1.4 1.1-2.3 0-1.6-1.4-3.1-3.1-3.1-.9 0-1.8.6-2.4 1.2-2.1 2.2-5.1 3.2-8.3 3.2-6.1 0-11-4.2-12.1-10H68.2c.1 0 .2 0 .3-.1 1.5-.4 2.4-1.7 2.4-3.1-.1-9.1-8.5-17.1-18.2-17.1zM41 50.9c1.6-4.9 6.2-8.5 11.7-8.5 5.5 0 10.1 3.5 11.6 8.5H41zM71 72.5c-.2 0-.4-.2-.4-.4v-3.9h-.8c-.2 0-.4-.2-.4-.4s.2-.4.4-.4h2.5c.2 0 .4.2.4.4s-.2.4-.4.4h-.9v3.9c0 .2-.1.4-.4.4zm4.6 0c-.2 0-.3-.2-.4-.3L74.1 69v3.2c0 .2-.2.4-.4.4s-.4-.2-.4-.4V68c0-.3.3-.6.6-.6.2 0 .5.2.5.5l1.1 3.2 1.1-3.2c.1-.2.3-.4.5-.5.3 0 .6.3.6.6v4.2c0 .2-.2.4-.4.4s-.4-.2-.4-.4V69l-.6 1.9-.3 1.3c-.1.2-.2.3-.4.3z" class="st4"/></svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0.87 0.06 173.29 236.52"><path fill="#fff" d="M168.646.176C107.411 11.96 51.294 28.372 4.097 51.181a5.72 5.72 0 0 0-3.232 5.05v116.99a31.48 31.48 0 0 0 15.721 27.253l55.175 31.899a31.52 31.52 0 0 0 31.459 0l55.209-31.899a31.48 31.48 0 0 0 15.721-27.253V4.637a4.478 4.478 0 0 0-5.504-4.46"/><path fill="#0068AD" d="M161.966 9.91c-56.193 10.812-107.69 25.873-151 46.804a5.25 5.25 0 0 0-2.965 4.634v107.357a28.89 28.89 0 0 0 14.426 25.008l50.632 29.273a28.94 28.94 0 0 0 28.868 0l50.663-29.273a28.88 28.88 0 0 0 14.426-25.008V14.003a4.108 4.108 0 0 0-5.05-4.094"/><path fill="#fff" d="M161.966 9.91c-25.965 5.004-50.864 10.951-74.465 17.918v198.988a28.8 28.8 0 0 0 14.426-3.83l50.663-29.273a28.88 28.88 0 0 0 14.426-25.008V14.003a4.108 4.108 0 0 0-5.05-4.094" opacity=".07"/><path fill="#020404" d="M132.912 40.71c-39.217 5.067-75.13 14.768-105.357 27.805a3.51 3.51 0 0 0-2.07 3.09v25.95a.62.62 0 0 1 .356-.571c31.417-13.717 69.136-23.835 110.392-28.901h.185V43.8a3.08 3.08 0 0 0-1.047-2.346 3.1 3.1 0 0 0-2.459-.744M93.803 87.175a345 345 0 0 0-66.325 19.371 3.4 3.4 0 0 0-2.008 3.089v25.951a.54.54 0 0 1 .34-.54 342.3 342.3 0 0 1 67.962-20.081z" opacity=".29"/><path fill="#fff" d="M137.144 32.987C96.398 40.849 59.05 53.068 27.633 68.283a3.82 3.82 0 0 0-2.147 3.322v25.95a.65.65 0 0 1 .37-.587C58.51 80.95 97.742 68.114 140.62 60.144l.201-.093V35.953a3 3 0 0 0-1.114-2.38 3 3 0 0 0-2.562-.586M98.53 80.193a421.7 421.7 0 0 0-70.96 26.26 3.8 3.8 0 0 0-2.147 3.352v25.936a.63.63 0 0 1 .372-.587 418.6 418.6 0 0 1 72.734-27.11z"/><path fill="#020404" d="M52.3 138.027a244 244 0 0 0-24.961 6.627 2.975 2.975 0 0 0-1.854 2.935v25.966a.51.51 0 0 1 .31-.51 239 239 0 0 1 26.505-7.213z" opacity=".29"/><path fill="#fff" d="M56.625 131.709c-10.117 3.877-19.88 8.032-28.992 12.497a3.82 3.82 0 0 0-2.147 3.367v25.982a.65.65 0 0 1 .37-.587c9.685-4.742 19.987-9.191 30.769-13.331z"/></svg>
|
||||
|
Before Width: | Height: | Size: 1.9 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2" viewBox="0 0 300 300"><path d="M.017 300.002h299.995V0H.017z"/><path d="M108.4 93.8a47.14 47.14 0 0 1-31 14.5V93.8h31Zm-50.1 14.5c-12.2-.8-23.1-6.2-31.1-14.5h31.1v14.5ZM135.6 0H67.9C30.4 0 0 30.3 0 67.8s30.4 67.9 67.9 67.9c35.9 0 65.2-27.8 67.7-63.1V0Z" style="fill:#00e205;fill-rule:nonzero" transform="translate(25 24.908) scale(1.84366)"/></svg>
|
||||
|
Before Width: | Height: | Size: 495 B |
|
Before Width: | Height: | Size: 18 KiB |