Compare commits

...

2 Commits

Author SHA1 Message Date
valere
95d9a50c02 add new cvs
All checks were successful
Deploy valere.dev / deploy (push) Successful in 11s
2025-11-15 10:08:35 +01:00
valere
463540770a add home to repo 2025-11-15 09:59:44 +01:00
109 changed files with 2435 additions and 0 deletions

15
home/.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,15 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "chrome",
"request": "launch",
"name": "Launch Chrome against localhost",
"url": "http://localhost:8080",
"webRoot": "${workspaceFolder}"
}
]
}

View File

@@ -0,0 +1,246 @@
#!/usr/bin/env python3
import os
import sys
import time
import shlex
import subprocess
import tempfile
from pathlib import Path
from typing import List, Tuple, Optional
# --- Configuration ---
HOME = Path.home()
SOURCES = [
HOME / "Music",
HOME / "Downloads",
]
DEST_ON_PHONE = "/sdcard/Music"
# Model tag as seen in `adb devices -l` (e.g., ... model:AGM_M7 ...)
ADB_MODEL_MATCH = ["AGM_M7", "AGM", "M7"]
POLL_INTERVAL_SEC = 60
SIZE_LIMIT_BYTES = 7 * 1024 ** 3 # 7 GiB
MUSIC_EXTS = {".mp3", ".m4a", ".ogg", ".aac", ".opus", ".alac", ".flac"}
# If you have a static Wi-Fi ADB endpoint, set it here (e.g., "192.168.1.50:5555").
ADB_IP_PORT: Optional[str] = None
# --- Helpers ---
def run(cmd: List[str], check: bool = False, text: bool = True, timeout: Optional[int] = None) -> subprocess.CompletedProcess:
try:
return subprocess.run(cmd, check=check, text=text, capture_output=True, timeout=timeout)
except Exception as e:
return subprocess.CompletedProcess(cmd, returncode=1, stdout="", stderr=str(e))
def ensure_adb_server() -> None:
run(["adb", "start-server"]) # best-effort
def list_adb_devices() -> List[str]:
proc = run(["adb", "devices", "-l"]) # do not check, we parse regardless
if proc.returncode != 0:
return []
lines = [ln.strip() for ln in proc.stdout.splitlines()]
# skip header line: "List of devices attached"
if lines and lines[0].lower().startswith("list of devices"):
lines = lines[1:]
return [ln for ln in lines if ln]
def adb_connect_if_needed():
if not ADB_IP_PORT:
return
devices = list_adb_devices()
if any(ADB_IP_PORT in ln for ln in devices):
return # already connected
run(["adb", "connect", ADB_IP_PORT])
def is_agm_connected() -> bool:
devices = list_adb_devices()
for ln in devices:
if "device" in ln and not ln.endswith("offline"):
if any(tag in ln for tag in ADB_MODEL_MATCH):
return True
return False
def gather_music_files() -> List[Tuple[Path, Path, float, int]]:
# Returns list of tuples: (root_dir, file_path, mtime, size)
entries: List[Tuple[Path, Path, float, int]] = []
for root in SOURCES:
try:
if not root.exists():
continue
for dirpath, _, filenames in os.walk(root):
dpath = Path(dirpath)
for fn in filenames:
p = dpath / fn
if p.suffix.lower() not in MUSIC_EXTS:
continue
try:
st = p.stat()
entries.append((root, p, st.st_mtime, st.st_size))
except Exception:
continue
except Exception:
continue
# newest first by mtime
entries.sort(key=lambda t: t[2], reverse=True)
return entries
def select_up_to_size(entries: List[Tuple[Path, Path, float, int]], limit_bytes: int) -> List[Tuple[Path, Path, int]]:
selected: List[Tuple[Path, Path, int]] = []
total = 0
for root, p, _mt, sz in entries:
if total >= limit_bytes:
break
selected.append((root, p, sz))
total += sz
return selected
def adb_shell(cmd: str) -> subprocess.CompletedProcess:
# Single string executed via adb shell
return run(["adb", "shell", cmd])
def remote_size(adb_path: str) -> Optional[int]:
# Uses stat if available; returns None if missing
# Escape path for shell
qpath = shlex.quote(adb_path)
proc = adb_shell(f"stat -c %s {qpath}")
if proc.returncode != 0 or not proc.stdout.strip():
return None
out = proc.stdout.strip()
if "No such file" in out or "not found" in out:
return None
try:
return int(out.splitlines()[-1].strip())
except Exception:
return None
def ensure_remote_dir(adb_path: str) -> None:
# mkdir -p dirname
dirname = os.path.dirname(adb_path)
if not dirname:
return
adb_shell(f"mkdir -p {shlex.quote(dirname)}")
def have_ffmpeg() -> bool:
proc = run(["ffmpeg", "-version"])
return proc.returncode == 0
def transcode_flac_to_mp3(src: Path) -> Optional[Path]:
try:
tmp = tempfile.NamedTemporaryFile(suffix=".mp3", delete=False)
tmp_path = Path(tmp.name)
tmp.close()
except Exception:
return None
cmd = [
"ffmpeg",
"-y",
"-i",
str(src),
"-vn",
"-c:a",
"libmp3lame",
"-q:a",
"2",
str(tmp_path),
]
proc = run(cmd)
if proc.returncode != 0:
try:
tmp_path.unlink(missing_ok=True) # type: ignore[arg-type]
except Exception:
pass
return None
return tmp_path
def push_file(local_path: Path, remote_path: str, size: int) -> bool:
# Skip if same size exists
rsz = remote_size(remote_path)
if rsz is not None and rsz == size:
print(f"[=] Skip (same size): {local_path} -> {remote_path}")
return True
ensure_remote_dir(remote_path)
proc = run(["adb", "push", "-p", str(local_path), remote_path])
if proc.returncode == 0:
print(f"[+] Pushed: {local_path} -> {remote_path}")
return True
else:
print(f"[!] Push failed: {local_path}\n{proc.stderr}")
return False
def sync_latest_batch():
entries = gather_music_files()
if not entries:
print("[i] No music files found.")
return
batch = select_up_to_size(entries, SIZE_LIMIT_BYTES)
print(f"[i] Selected {len(batch)} files up to {SIZE_LIMIT_BYTES/(1024**3):.2f} GiB")
for root, p, sz in batch:
try:
rel = p.relative_to(root)
except Exception:
rel = p.name # fallback
if p.suffix.lower() == ".flac":
if not have_ffmpeg():
print(f"[!] ffmpeg not available, skipping: {p}")
continue
mp3_tmp = transcode_flac_to_mp3(p)
if not mp3_tmp:
print(f"[!] Transcode failed, skipping: {p}")
continue
try:
if isinstance(rel, Path):
rel_mp3 = rel.with_suffix(".mp3")
remote = f"{DEST_ON_PHONE.rstrip('/')}/{rel_mp3.as_posix()}"
else:
remote = f"{DEST_ON_PHONE.rstrip('/')}/{Path(rel).with_suffix('.mp3').as_posix()}"
msz = mp3_tmp.stat().st_size
push_file(mp3_tmp, remote, msz)
finally:
try:
mp3_tmp.unlink()
except Exception:
pass
else:
remote = f"{DEST_ON_PHONE.rstrip('/')}/{rel.as_posix()}"
push_file(p, remote, sz)
def main():
print("[i] adb-music-sync daemon starting...")
ensure_adb_server()
connected_prev = False
while True:
try:
ensure_adb_server()
adb_connect_if_needed()
connected = is_agm_connected()
if connected and not connected_prev:
print("[+] AGM M7 connected. Starting sync of latest ~7 GiB...")
sync_latest_batch()
elif not connected and connected_prev:
print("[-] AGM M7 disconnected.")
connected_prev = connected
time.sleep(POLL_INTERVAL_SEC)
except KeyboardInterrupt:
print("[i] Exiting on user interrupt.")
sys.exit(0)
except Exception as e:
print(f"[!] Error in main loop: {e}")
time.sleep(POLL_INTERVAL_SEC)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,78 @@
#!/usr/bin/env bash
set -euo pipefail
SILENT=false
LOG_PREFIX="[adb-music-sync]"
PYTHON_SCRIPT="$HOME/.linux-env/adb-music-sync/adb-music-sync.py"
INSTALL_TARGET="$HOME/.local/bin/adb-music-sync.py"
AUTOSTART_DIR="$HOME/.config/autostart"
AUTOSTART_FILE="$AUTOSTART_DIR/adb-music-sync.desktop"
log() {
if [ "$SILENT" = true ]; then return; fi
echo "$LOG_PREFIX $*"
}
check_and_install_deps() {
# Minimal dependency: adb
if ! command -v adb >/dev/null 2>&1; then
if command -v apt >/dev/null 2>&1; then
log "[+] Installation d'adb (apt) ..."
sudo apt update -y && sudo apt install -y adb
elif command -v dnf >/dev/null 2>&1; then
log "[+] Installation d'adb (dnf) ..."
sudo dnf install -y android-tools
elif command -v pacman >/dev/null 2>&1; then
log "[+] Installation d'adb (pacman) ..."
sudo pacman -Sy --noconfirm android-tools
else
log "[!] adb introuvable et gestionnaire de paquets inconnu. Installez adb manuellement."
fi
fi
}
install_script() {
check_and_install_deps
log "[+] Copie du script Python..."
mkdir -p "$(dirname "$INSTALL_TARGET")"
cp "$PYTHON_SCRIPT" "$INSTALL_TARGET"
chmod +x "$INSTALL_TARGET"
log "[+] Création du fichier autostart..."
mkdir -p "$AUTOSTART_DIR"
cat > "$AUTOSTART_FILE" <<EOF
[Desktop Entry]
Type=Application
Exec=$INSTALL_TARGET
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=ADB Music Sync
Comment=Lance la synchronisation de ~5GiB de musique vers l'AGM M7 à la connexion ADB
EOF
log "[✓] Installation terminée. Le script se lancera automatiquement à l'ouverture de session."
}
uninstall_script() {
log "[+] Suppression du script Python et autostart..."
rm -f "$INSTALL_TARGET"
rm -f "$AUTOSTART_FILE"
log "[✓] Désinstallation terminée."
}
case "${1:-}" in
uninstall)
uninstall_script
;;
silent)
SILENT=true
uninstall_script &>/dev/null || true
install_script &>/dev/null
;;
*)
install_script
;;
esac

View File

@@ -0,0 +1,9 @@
[Desktop Entry]
Name=Android WiFi
Comment=Mirror and control Android devices over Wi-Fi
Exec=/home/valere/.local/bin/android-wifi.sh
Icon=/home/valere/.local/share/icons/android-wifi.svg
Terminal=false
Type=Application
Categories=Utility;
StartupNotify=true

View File

@@ -0,0 +1,15 @@
#!/bin/sh
# Try to connect via scrcpy first
if ! scrcpy; then
# If scrcpy fails, try the alternative method
echo "If scrcpy fails, try the alternative method"
adb tcpip 5555 >/dev/null 2>&1 || true
MAC="0c:52:03:1e:89:9a"
for i in $(seq 1 254); do ping -c1 -W1 192.168.1.$i >/dev/null 2>&1 & done; wait
line=$(ip neigh | grep -i "$MAC" | head -n1 || true)
ip=$(printf "%s" "$line" | awk '{print $1}')
echo "${ip}:5555"
adb connect "${ip}:5555"
scrcpy
fi

View File

@@ -0,0 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" version="1.1">
<path style="opacity:0.2" d="m 16.846877,12 c -1.116351,0 -2.227419,0.912229 -2.015075,2 l 3.122973,16 -5.596557,11.109375 C 11.959876,41.871734 11.885244,42.336988 12.177176,43 c 0.278672,0.632897 0.998812,1 1.747448,1 H 24 34.075375 c 0.748637,0 1.468777,-0.367103 1.747448,-1 0.291932,-0.663012 0.217302,-1.128266 -0.181041,-1.890625 L 30.045225,30 33.168198,14 c 0.212344,-1.087771 -0.898724,-2 -2.015075,-2 H 24 Z"/>
<path style="fill:#cccccc" d="m 16.846877,11 c -1.116351,0 -2.227419,0.912229 -2.015075,2 l 3.122973,16 -5.596557,11.109375 C 11.959876,40.871734 11.885244,41.336988 12.177176,42 c 0.278672,0.632897 0.998812,1 1.747448,1 H 24 34.075375 c 0.748637,0 1.468777,-0.367103 1.747448,-1 0.291932,-0.663012 0.217302,-1.128266 -0.181041,-1.890625 L 30.045225,29 33.168198,13 c 0.212344,-1.087771 -0.898724,-2 -2.015075,-2 H 24 Z"/>
<rect style="opacity:0.2" width="40" height="32" x="4" y="6" rx="2" ry="2"/>
<path style="fill:#e4e4e4" d="m 4,33 v 2 c 0,1.108 0.892,2 2,2 h 36 c 1.108,0 2,-0.892 2,-2 v -2 z"/>
<path style="opacity:0.1" d="m 11.494141,15 a 1.5,1.5 0 0 0 -0.832032,0.255859 1.5,1.5 0 0 0 -0.40625,2.082032 l 3.13086,4.654297 C 10.404945,24.606192 8.4012371,28.299159 8.0019531,32.460938 7.9284599,34.000879 9.5546875,34 9.5546875,34 H 38.40625 c 0,0 1.672856,-3.38e-4 1.591797,-1.617188 -0.416529,-4.131451 -2.415618,-7.796833 -5.380859,-10.394531 l 3.126953,-4.65039 a 1.5,1.5 0 0 0 -0.40625,-2.082032 1.5,1.5 0 0 0 -1.125,-0.228515 1.5,1.5 0 0 0 -0.957032,0.634765 l -3.072265,4.566407 C 29.78649,18.814887 26.990024,18 24.001953,18 c -2.989385,0 -5.786177,0.815488 -8.183594,2.230469 l -3.074218,-4.56836 A 1.5,1.5 0 0 0 11.787109,15.027344 1.5,1.5 0 0 0 11.494141,15 Z"/>
<path style="fill:#077063" d="M 6,5 C 4.892,5 4,5.892 4,7 V 33 H 44 V 7 C 44,5.892 43.108,5 42,5 Z"/>
<path style="opacity:0.1;fill:#ffffff" d="M 6,5 C 4.892,5 4,5.892 4,7 V 8 C 4,6.892 4.892,6 6,6 h 36 c 1.108,0 2,0.892 2,2 V 7 C 44,5.892 43.108,5 42,5 Z"/>
<path style="fill:none;stroke:#30dd81;stroke-width:3;stroke-linecap:round" d="M 15.1998,21.000026 11.5,15.5"/>
<path style="fill:none;stroke:#30dd81;stroke-width:3;stroke-linecap:round" d="M 32.799764,21.000026 36.5,15.5"/>
<path style="fill:#30dd81" d="m 24.002386,17.000034 c -8.355868,0 -15.2214979,6.346843 -15.9999669,14.460906 C 7.9289259,33.000882 9.5544999,33 9.5544999,33 H 38.406003 c 0,0 1.672201,-3.35e-4 1.591142,-1.617185 C 39.182807,23.305596 32.331836,17.000034 24.002386,17.000034 Z"/>
<path style="opacity:0.2" d="m 16,25 a 1.9999959,1.9999959 0 0 0 -2,2 1.9999959,1.9999959 0 0 0 2,2 1.9999959,1.9999959 0 0 0 2,-2 1.9999959,1.9999959 0 0 0 -2,-2 z m 16,0 a 1.9999959,1.9999959 0 0 0 -2,2 1.9999959,1.9999959 0 0 0 2,2 1.9999959,1.9999959 0 0 0 2,-2 1.9999959,1.9999959 0 0 0 -2,-2 z"/>
<path style="fill:#ffffff" d="M 15.999996,24.000008 A 1.9999959,1.9999959 0 0 1 17.999992,26.000004 1.9999959,1.9999959 0 0 1 15.999996,28 1.9999959,1.9999959 0 0 1 14,26.000004 1.9999959,1.9999959 0 0 1 15.999996,24.000008 Z"/>
<path style="fill:#ffffff" d="M 31.999996,24.000008 A 1.9999959,1.9999959 0 0 1 33.999991,26.000004 1.9999959,1.9999959 0 0 1 31.999996,28 1.9999959,1.9999959 0 0 1 30,26.000004 1.9999959,1.9999959 0 0 1 31.999996,24.000008 Z"/>
<path style="fill:#ffffff;opacity:0.2" d="M 11.494141 14 A 1.5 1.5 0 0 0 10.662109 14.255859 A 1.5 1.5 0 0 0 10.115234 16.001953 A 1.5 1.5 0 0 1 10.662109 15.255859 A 1.5 1.5 0 0 1 11.494141 15 A 1.5 1.5 0 0 1 11.787109 15.027344 A 1.5 1.5 0 0 1 12.744141 15.662109 L 15.818359 20.230469 C 18.215776 18.815488 21.012568 18 24.001953 18 C 26.990024 18 29.78649 18.814887 32.183594 20.228516 L 35.255859 15.662109 A 1.5 1.5 0 0 1 36.212891 15.027344 A 1.5 1.5 0 0 1 37.337891 15.255859 A 1.5 1.5 0 0 1 37.910156 16.001953 A 1.5 1.5 0 0 0 37.337891 14.255859 A 1.5 1.5 0 0 0 36.212891 14.027344 A 1.5 1.5 0 0 0 35.255859 14.662109 L 32.183594 19.228516 C 29.78649 17.814887 26.990024 17 24.001953 17 C 21.012568 17 18.215776 17.815488 15.818359 19.230469 L 12.744141 14.662109 A 1.5 1.5 0 0 0 11.787109 14.027344 A 1.5 1.5 0 0 0 11.494141 14 z M 35.033203 21.369141 L 34.617188 21.988281 C 37.477056 24.493668 39.433905 27.993356 39.943359 31.945312 C 39.986866 31.783283 40.008864 31.598575 39.998047 31.382812 C 39.601372 27.448291 37.768055 23.938648 35.033203 21.369141 z M 12.970703 21.373047 C 10.220358 23.959215 8.3822757 27.496796 8.0019531 31.460938 C 7.9920657 31.668114 8.0150508 31.844846 8.0585938 32 C 8.5570234 28.027243 10.515755 24.509049 13.386719 21.992188 L 12.970703 21.373047 z"/>
</svg>

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@@ -0,0 +1,11 @@
#!/bin/bash
# desktop apps
cp ~/.linux-env/applications/*/*.desktop ~/.local/share/applications/
cp ~/.linux-env/applications/*/*.sh ~/.local/bin/
cp ~/.linux-env/applications/*/*.svg ~/.local/share/icons/
chmod +x ~/.local/share/applications/*.desktop
chmod +x ~/.local/bin/*.sh
update-desktop-database ~/.local/share/applications/
gtk-update-icon-cache ~/.local/share/icons/ # inutile sauf si tu fais un vrai thème d'icônes

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,7 @@
<client name="Azureus 3.0.5.0" author="seba14.org" version="1.0" processname="azureus"> <query>info_hash={infohash}&amp;peer_id={peerid}&amp;supportcrypto=1&amp;port={port}&amp;azudp={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0{event}&amp;numwant={numwant}&amp;no_peer_id=1&amp;compact=1&amp;key={key}&amp;azver=3</query>
<headers>User-Agent: Azureus 3.0.5.0;Windows XP;Java 1.6.0_05_nl_Connection: close_nl_Accept-Encoding: gzip_nl_Host: {host}_nl_Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2_nl_Content-type: application/x-www-form-urlencoded_nl_</headers>
<peer_id prefix="-AZ3050-" type="alphanumeric" length="12" urlencoding="false" upperCase="false" value=""/>
<key type="alphanumeric" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="BitComet 1.07" author="seba14.org" version="1.0" processname="bitcomet">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;natmapped=1&amp;localip={localip}&amp;port_type=wan&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1&amp;key={key}{event}</query>
<headers>Host: {host}_nl_Connection: close_nl_Accpet: */*_nl_Accept-Encoding: gzip_nl_User-Agent: BitComet/1.7.12.3_nl_Pragma: no-cache_nl_Cache-Control: no-cache_nl_</headers>
<peer_id prefix="-BC0107-" type="random" length="12" urlencoding="true" upperCase="true" value="" />
<key type="numeric" length="5" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="BitComet 1.13" author="seba14.org" version="1.0" processname="bitcomet">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;natmapped=1&amp;localip={localip}&amp;port_type=wan&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1&amp;key={key}{event}</query>
<headers>Host: {host}_nl_Connection: close_nl_Accept: */*_nl_Accept-Encoding: gzip_nl_User-Agent: BitComet/1.13.6.22_nl_Pragma: no-cache_nl_Cache-Control: no-cache_nl_</headers>
<peer_id prefix="-BC0113-" type="random" length="12" urlencoding="true" upperCase="true" value="" />
<key type="numeric" length="5" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="BitTorrent 6.0.3 (8642)" author="Rebound" version="1.0" processname="bittorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: BitTorrent/6030_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="M6-0-3--" type="random" length="12" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="BitTyrant 1.1" author="res0r9lm" version="1.0" processname="Azureus">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;supportcrypto=1&amp;port={port}&amp;azudp={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}{event}&amp;numwant={numwant}&amp;no_peer_id=1&amp;compact=1&amp;key={key}</query>
<headers>User-Agent: AzureusBitTyrant 2.5.0.0BitTyrant;Windows XP;Java 1.5.0_10_nl_Connection: close_nl_Accept-Encoding: gzip_nl_Host: {host}_nl_Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2_nl_Proxy-Connection: keep-alive_nl_Content-type: application/x-www-form-urlencoded_nl_</headers>
<peer_id prefix="AZ2500BT" type="alphanumeric" length="12" urlencoding="false" upperCase="false" value=""/>
<key type="alphanumeric" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="Deluge 1.1.7" author="seba14.org" version="1.0">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}{event}&amp;key={key}&amp;compact=1&amp;numwant={numwant}&amp;supportcrypto=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: Deluge 1.1.7_nl_Connection: close_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-DE1170-" type="alphanumeric" length="12" urlencoding="false" upperCase="false" value="" />
<key type="alphanumeric" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.0"/>
<hash upperCase="false"/>
</client>

View File

@@ -0,0 +1,9 @@
<client name="Deluge 1.1.9" author="seba14.org" version="1.0">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}{event}&amp;key={key}&amp;compact=1&amp;numwant={numwant}&amp;supportcrypto=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: Deluge 1.1.9_nl_Connection: close_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-DE1190-" type="printable" length="12" urlencoding="false" upperCase="false" value="" />
<key type="hex" length="8" urlencoding="false" upperCase="false" lowerCase="true" value=""/>
<protocol value="HTTP/1.0"/>
<hash upperCase="false"/>
<urlencoding exceptions="." />
</client>

View File

@@ -0,0 +1,8 @@
<client name="Halite 0.3.1.1" author="seba14.org" version="2.0"> <query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}{event}&amp;key={key}&amp;compact=1&amp;numwant={numwant}&amp;supportcrypto=1&amp;no_peer_id=1</query>
<headers>Accept-Encoding: gzip_nl_User-Agent: Halite v 0.3.1.1_nl_Host: {host}_nl_</headers>
<peer_id prefix="-HL0311-" type="printable" length="12" urlencoding="false"/>
<key type="alphanumeric" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.0"/>
<hash upperCase="false"/>
<urlencoding exceptions="_-()~!*."/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="Transmission 1.06 (Build 5136)" author="seba14.org" version="1.0">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;corrupt=0&amp;left={left}&amp;compact=1&amp;numwant={numwant}&amp;key={key}&amp;supportcrypto=1&amp;requirecrypto=0{event}</query>
<headers>Host: {host}_nl_Connection: close_nl_User-Agent: Transmission/1.06 (5136)_nl_</headers>
<peer_id prefix="-TR1060-" type="alphanumeric" length="12" urlencoding="false" lowerCase="true" value=""/>
<key type="alphanumeric" length="10" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="Vuze 4.2.0.2" author="seba14.org" version="1.0" processname="azureus"> <query>info_hash={infohash}&amp;peer_id={peerid}&amp;supportcrypto=1&amp;port={port}&amp;azudp={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0{event}&amp;numwant={numwant}&amp;no_peer_id=1&amp;compact=1&amp;key={key}&amp;azver=3</query>
<headers>User-Agent: Azureus 4.2.0.2;Windows XP;Java 1.6.0_13_nl_Connection: close_nl_Accept-Encoding: gzip_nl_Host: {host}_nl_Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2_nl_</headers>
<peer_id prefix="-AZ4202-" type="alphanumeric" length="12" urlencoding="false" upperCase="false" value=""/>
<key type="alphanumeric" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
<urlencoding exceptions="*-._" />
</client>

View File

@@ -0,0 +1,9 @@
<client name="Vuze 4.2.0.4" author="Ratiomaster" version="1.0" processname="azureus">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;supportcrypto=1&amp;port={port}&amp;azudp={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0{event}&amp;numwant={numwant}&amp;no_peer_id=1&amp;compact=1&amp;key={key}&amp;azver=3</query>
<headers>User-Agent: Azureus 4.2.0.4;{osver};{javaver}_nl_Connection: close_nl_Accept-Encoding: gzip_nl_Host: {host}_nl_Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2_nl_</headers>
<peer_id prefix="-AZ4204-" type="alphanumeric" length="12" urlencoding="false" upperCase="false" value=""/>
<key type="alphanumeric" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
<urlencoding exceptions="*-._" />
</client>

View File

@@ -0,0 +1,9 @@
<client name="Vuze 4.2.0.8" author="KTC" version="1.0" processname="azureus">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;supportcrypto=1&amp;port={port}&amp;azudp={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0{event}&amp;numwant={numwant}&amp;no_peer_id=1&amp;compact=1&amp;key={key}&amp;azver=3</query>
<headers>User-Agent: Azureus 4.2.0.8;{osver};{javaver}_nl_Connection: close_nl_Accept-Encoding: gzip_nl_Host: {host}_nl_Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2_nl_</headers>
<peer_id prefix="-AZ4208-" type="alphanumeric" length="12" urlencoding="false" upperCase="false" value=""/>
<key type="alphanumeric" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
<urlencoding exceptions="*-._" />
</client>

View File

@@ -0,0 +1,8 @@
<client name="Vuze 4.3.0.6" author="seba14.org" version="1.0" processname="azureus"> <query>info_hash={infohash}&amp;peer_id={peerid}&amp;supportcrypto=1&amp;port={port}&amp;azudp={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0{event}&amp;numwant={numwant}&amp;no_peer_id=1&amp;compact=1&amp;key={key}&amp;azver=3</query>
<headers>User-Agent: Azureus 4.3.0.6;{osver};{javaver}_nl_Connection: close_nl_Accept-Encoding: gzip_nl_Host: {host}_nl_Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2_nl_</headers>
<peer_id prefix="-AZ4306-" type="alphanumeric" length="12" urlencoding="false" upperCase="false" value=""/>
<key type="alphanumeric" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
<urlencoding exceptions="*-._" />
</client>

View File

@@ -0,0 +1,8 @@
<client name="Vuze 4.4.0.4" author="seba14.org" version="2.0" processname="azureus"> <query>info_hash={infohash}&amp;peer_id={peerid}&amp;supportcrypto=1&amp;port={port}&amp;azudp={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0{event}&amp;numwant={numwant}&amp;no_peer_id=1&amp;compact=1&amp;key={key}&amp;azver=3</query>
<headers>User-Agent: Azureus 4.4.0.4;{osver};{javaver}_nl_Connection: close_nl_Accept-Encoding: gzip_nl_Host: {host}_nl_Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2_nl_</headers>
<peer_id prefix="-AZ4404-" type="alphanumeric" length="12" urlencoding="false" upperCase="false" value=""/>
<key type="alphanumeric" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
<urlencoding exceptions="*-._" />
</client>

View File

@@ -0,0 +1,8 @@
<client name="Vuze 4.5.0.0" author="seba14.org" version="2.0" processname="azureus"> <query>info_hash={infohash}&amp;peer_id={peerid}&amp;supportcrypto=1&amp;port={port}&amp;azudp={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0{event}&amp;numwant={numwant}&amp;no_peer_id=1&amp;compact=1&amp;key={key}&amp;azver=3</query>
<headers>User-Agent: Azureus 4.5.0.0;{osver};{javaver}_nl_Connection: close_nl_Accept-Encoding: gzip_nl_Host: {host}_nl_Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2_nl_</headers>
<peer_id prefix="-AZ4500-" type="alphanumeric" length="12" urlencoding="false" upperCase="false" value=""/>
<key type="alphanumeric" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
<urlencoding exceptions="*-._" />
</client>

View File

@@ -0,0 +1,8 @@
<client name="BitLord 1.1" author="Ratiomaster" version="1.0" processname="bitlord">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;natmapped=1&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1&amp;key={key}{event}</query>
<headers>User-Agent: BitTorrent/3.4.2_nl_Connection: close_nl_Accept-Encoding: gzip, deflate_nl_Host: {host}_nl_Cache-Control: no-cache_nl_</headers>
<peer_id prefix="exbc%01%01LORDCz%03%92" type="random" length="6" urlencoding="true" upperCase="true" value="" />
<key type="numeric" length="4" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.0"/>
<hash upperCase="true"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="Burst 3.1.0b" author="RatioMaster" version="1.0" processname="btdownloadheadless">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;key={key}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;compact=1{event}</query>
<headers>Host: {host}_nl_Accept-Encoding: gzip_nl_User-Agent: BitTorrent/brst1.1.3_nl_</headers>
<peer_id prefix="Mbrst1-1-3" type="hex" length="10" urlencoding="false" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.0"/>
<hash upperCase="true"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="uTorrent 1.7.7 build (8179)" author="uk10" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: uTorrent/1770_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-UT1770-%f3%9f" type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="uTorrent 1.8.1 (build 12616)" author="SpongeBob101" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: uTorrent/1810_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-UT1810-H1" type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="uTorrent 1.8.1 (build 12639)" author="MurderTR" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: uTorrent/1810_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-UT1810-_1" type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="uTorrent 1.8.2 (build 15227)" author="Gox" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: uTorrent/1820_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-UT1820-%7b%3b" type="random" length="10" urlencoding="true" upperCase="false" value="" />
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="utorrent 1.8.2 (build 14153)" author="rogeruk" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>User-Agent: uTorrent/1820_nl_Accept-Encoding: gzip, deflate_nl_Host: {host}_nl_Cache-Control: no-cache_nl_</headers>
<peer_id prefix="-UT1820-I7" type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="utorrent 1.8.2 (build 14458)" author="MurderTR" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>User-Agent: uTorrent/1820_nl_Accept-Encoding: gzip, deflate_nl_Host: {host}_nl_Cache-Control: no-cache_nl_</headers>
<peer_id prefix="-UT1820-z8" type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="uTorrent 1.8.2 Build (15167)" author="seba14.org" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: uTorrent/1820_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-UT1820-%3f%3b" type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
</client>

View File

@@ -0,0 +1,9 @@
<client name="uTorrent 1.8.3 Build (15728)" author="seba14.org" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: uTorrent/1830(15728)_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-UT1830-p%3d" type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
<urlencoding exceptions="_()~._-" />
</client>

View File

@@ -0,0 +1,9 @@
<client name="uTorrent 1.8.4 Build (16150)" author="seba14.org" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: uTorrent/1840(16150)_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-UT1840-%16%3f" type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
<urlencoding exceptions="_-~!*."/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="uTorrent 1.8 (build 11813)" author="SpongeBob101" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: uTorrent/1800_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-UT1800-%25." type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
</client>

View File

@@ -0,0 +1,10 @@
<client name="uTorrent 2.0.4 Build (21431)" author="CoreCore and Anon" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: uTorrent/2040(21431)_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-UT2040-%b7S" type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
<urlencoding exceptions="-._~"/>
<numwant value="200" randomize="false"/>
</client>

View File

@@ -0,0 +1,10 @@
<client name="uTorrent 2.0.4 Build (21515)" author="CoreCore and Anon" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: uTorrent/2040(21515)_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-UT2040-%0bT" type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
<urlencoding exceptions="-._~"/>
<numwant value="200" randomize="false"/>
</client>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,10 @@
[Desktop Entry]
Name=RatioMaster
Comment=Ratio spoofing tool for torrents
Exec=wine /home/valere/.local/bin/RatioMaster/RM.exe
Path=/home/valere/.local/bin/RatioMaster
Icon=/home/valere/.local/bin/RatioMaster/logo.svg
Terminal=false
Type=Application
Categories=Network;P2P;
StartupNotify=true

View File

@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg
width="773.29401"
height="773.29401"
viewBox="0 -28.5 247.45409 247.45409"
version="1.1"
preserveAspectRatio="xMidYMid"
id="svg3"
sodipodi:docname="logo.svg"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs3" />
<sodipodi:namedview
id="namedview3"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="0.48911087"
inkscape:cx="-24.534315"
inkscape:cy="80.758786"
inkscape:window-width="1920"
inkscape:window-height="1132"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg3" />
<g
id="g3"
transform="translate(5.5656067,239.04617)">
<rect
style="fill:#eb001b;fill-opacity:1;stroke-width:11.3833;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:2.3;paint-order:fill markers stroke"
id="rect3"
width="112.2394"
height="112.45076"
x="-105.21542"
y="-209.79523"
transform="rotate(45)" />
<rect
style="fill:#f79e1b;fill-opacity:1;stroke-width:11.3833;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:2.3;paint-order:fill markers stroke"
id="rect3-6"
width="112.2394"
height="112.45076"
x="-42.293499"
y="-272.13583"
transform="rotate(45)" />
<rect
style="fill:#ff5f00;fill-opacity:1;stroke-width:5.03456;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:2.3;paint-order:fill markers stroke"
id="rect3-6-5"
width="49.315277"
height="50.120525"
x="-42.293499"
y="-209.80559"
transform="rotate(45)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<ApplicationSettings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<textStopMinLeecher>0</textStopMinLeecher>
<updateAnnounceParamsOnStart>true</updateAnnounceParamsOnStart>
<finishedPercent>100</finishedPercent>
<uploadRate>55003.37</uploadRate>
<downloadRate>0.21</downloadRate>
<interval>1800</interval>
<TorrentClientsIndex>11</TorrentClientsIndex>
<checkLogEnabled>true</checkLogEnabled>
<checkRequestScrap>true</checkRequestScrap>
<checkShowTrayBaloon>true</checkShowTrayBaloon>
<checkTCPListen>false</checkTCPListen>
<customPort />
<customKey>WMAAIhLqVx</customKey>
<customPeersNum />
<customPeerID>-TR1060-pauut3h9agwn</customPeerID>
<textProxyHost />
<textProxyPort />
<textProxyPass />
<textProxyUser />
<comboProxyTypeIndex>0</comboProxyTypeIndex>
<checkNewVersion>true</checkNewVersion>
<checkRandomUpload>true</checkRandomUpload>
<checkRandomDownload>true</checkRandomDownload>
<RandomUploadFrom>50000</RandomUploadFrom>
<RandomUploadTo>100000</RandomUploadTo>
<RandomDownloadFrom>0</RandomDownloadFrom>
<RandomDownloadTo>4</RandomDownloadTo>
<ignoreFailureReason>false</ignoreFailureReason>
<torrentFilePath>C:\users\valere\Desktop\Downloads\l.horloger.de.saint-paul.1974.VOF RESTAUREE.1080p.BDrip.x265.FLAC-AZAZE.mkv.torrent</torrentFilePath>
<torrentHash>1164387932F4CB6B1267B3ABA7E0A4CD26593E14</torrentHash>
<stopProcessActionBox>0</stopProcessActionBox>
<stopProcessValue>1000</stopProcessValue>
<stopProcessUnitsBox>-1</stopProcessUnitsBox>
<selectedLanguage>Z:\home\valere\.local\bin\RatioMaster\lng\1english.lng</selectedLanguage>
<bindToIp>default</bindToIp>
<minimizeTotray>true</minimizeTotray>
<ignoreTimeout>false</ignoreTimeout>
<useUPnP>false</useUPnP>
<savePeerList>false</savePeerList>
</ApplicationSettings>

Binary file not shown.

106
home/bashrc/.bashrc Normal file
View File

@@ -0,0 +1,106 @@
# .linux-env
VIDEO_DIR_LOCAL="/home/valere/Downloads"
IMAGE_DIR_LOCAL="/home/valere/Downloads"
MUSIC_DIR_LOCAL="/home/valere/evilspins/web/mnt/media/files/music"
VIDEO_PATH="/home/root/media/video/autre"
IMAGE_PATH="/home/root/media/image/screenshit"
MUSIC_DIR="/home/root/media/files/music"
dlvideo() {
cd "$VIDEO_DIR" || return
pip install -U yt-dlp
yt-dlp -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4" --merge-output-format mp4 "$@"
}
dlimage() {
wget -P "$IMAGE_DIR" "$1"
}
dlcover() {
query_or_file="$1"
manual_url="$2"
if [ -f "$query_or_file" ]; then
file="$query_or_file"
elif echo "$query_or_file" | grep -q '%(ext)'; then
file="$query_or_file"
else
file=$(find "$MUSIC_DIR" -type f \
\( -iname "*${query_or_file}*.mp3" -o -iname "*${query_or_file}*.m4a" -o -iname "*${query_or_file}*.flac" -o -iname "*${query_or_file}*.wav" -o -iname "*${query_or_file}*.ogg" \) \
| head -n 1)
fi
if [ -z "$file" ]; then
echo "❌ Aucun fichier trouvé pour: $query_or_file"
return 1
fi
base="${file%.*}"
if [ -n "$manual_url" ]; then
curl -s "$manual_url" -o "${base}.jpg"
echo "${base}.jpg saved from manual URL (fichier: $file)"
return
fi
artist_raw=$(echo "$base" | awk -F'__' '{print $2}')
title_raw=$(echo "$base" | awk -F'__' '{for(i=3;i<=NF;i++){printf (i>3?" ":""); printf $i}}')
artist=$(echo "$artist_raw" | tr '_' ' ')
title=$(echo "$title_raw" | tr '_' ' ')
query_enc=$(jq -rn --arg s "$artist $title" '$s|@uri')
it_url="https://itunes.apple.com/search?term=${query_enc}&entity=song&limit=1"
art=$(curl -s "$it_url" | jq -r '.results[0].artworkUrl100')
if [ -n "$art" ] && [ "$art" != "null" ]; then
art_hi=$(echo "$art" | sed 's/100x100bb/1000x1000bb/')
curl -s "$art_hi" -o "${base}.jpg"
echo "${base}.jpg saved from iTunes (fichier: $file)"
return
fi
api_key="5ae5d1212599f96ffa799e21da1b2a7a38274c94bb5ae8ad26ce8d5b08528aaa"
url=$(curl -s "https://serpapi.com/search.json?engine=google&q=${query_enc}&tbm=isch&api_key=${api_key}" \
| jq -r '.images_results[0].original')
if [ -n "$url" ] && [ "$url" != "null" ]; then
curl -s "$url" -o "${base}.jpg"
echo "${base}.jpg saved from Google Images (fichier: $file)"
else
echo "❌ No cover found for $artist - $title (fichier: $file)"
fi
}
dlmusic() {
mkdir -p "$MUSIC_PATH"
NOW=$(date +"%Y%m%d%H")
URL="$1"
# Récupère le titre
TITLE=$(yt-dlp --get-title "$URL")
# Transforme le titre pour le nom de fichier
SAFE_TITLE="${TITLE// - /__}"
SAFE_TITLE="${SAFE_TITLE// /_}"
TRACK_NAME="$MUSIC_PATH/${NOW}__${SAFE_TITLE}.%(ext)s"
# Téléchargement
yt-dlp -x --audio-format mp3 -o $TRACK_NAME "$URL"
dlcover $TRACK_NAME
}
search() {
find ./ -iname "*$1*"
}
searchinside() {
grep -rwl "$1" ./
}
alias evilsync='rsync -avz --delete -e ssh $MUSIC_DIR_LOCAL root@erudi.fr:$MUSIC_DIR'
alias evildiff='rsync -avzn --delete -e ssh $MUSIC_DIR_LOCAL root@erudi.fr:$MUSIC_DIR'
# end .linux-env

4
home/bashrc/install.sh Normal file
View File

@@ -0,0 +1,4 @@
#!/bin/bash
sed -i '/# .linux-env/,/# .linux-env/d' ~/.bashrc
cat ~/.linux-env/bashrc/.bashrc >> ~/.bashrc

View File

@@ -0,0 +1,94 @@
#!/usr/bin/env python3
import evdev
import subprocess
import time
DEVICE_NAMES = ["8BitDo NGC Modkit"]
BUTTON_MAP = {
"304": "Return", # A
"305": None, # B (non utilisé)
"311": "Alt_L", # R
"307": "Right", # X
"308": "Left", # Y
# 318 (BTN_THUMBR) sera géré à part
}
def find_device():
for path in evdev.list_devices():
try:
dev = evdev.InputDevice(path)
if any(dn in dev.name for dn in DEVICE_NAMES):
return path
except Exception:
continue
return None
def is_dolphin_running():
try:
output = subprocess.check_output(["flatpak", "ps"]).decode()
return "org.DolphinEmu.dolphin-emu" in output
except Exception:
return False
def press_key(key, press):
# press=True -> key down, press=False -> key up
action = "keydown" if press else "keyup"
subprocess.run(["xdotool", action, key])
def handle_device(dev_path):
dev = evdev.InputDevice(dev_path)
try:
for event in dev.read_loop():
if event.type != evdev.ecodes.EV_KEY:
continue
key_code = str(event.code)
# cas spécial : joystick jaune (BTN_THUMBR, code 318)
if key_code == "318" and event.value == 1: # pression
press_key("Alt_L", True)
time.sleep(0.02)
press_key("Escape", True)
time.sleep(0.05)
press_key("Escape", False)
press_key("Alt_L", False)
continue
if key_code in BUTTON_MAP:
mapped_key = BUTTON_MAP[key_code]
if mapped_key is not None:
press_key(mapped_key, event.value == 1)
except OSError:
dev.close()
raise
def main():
connected = False
time.sleep(5) # délai pour que le serveur graphique soit prêt
while True:
dev_path = find_device()
if dev_path and not connected:
print(f"[+] Manette connectée: {dev_path}")
connected = True
if not is_dolphin_running():
try:
subprocess.Popen(["flatpak", "run", "org.DolphinEmu.dolphin-emu"])
except Exception as e:
print(f"[!] Impossible de lancer Dolphin: {e}")
try:
handle_device(dev_path)
except OSError:
print("[-] Manette déconnectée")
connected = False
try:
subprocess.Popen(["flatpak", "kill", "org.DolphinEmu.dolphin-emu"])
except Exception as e:
print(f"[!] Impossible de tuer Dolphin: {e}")
elif not dev_path and connected:
print("[-] Manette déconnectée")
connected = False
time.sleep(1)
if __name__ == "__main__":
main()

77
home/gamecube-pad/install.sh Executable file
View File

@@ -0,0 +1,77 @@
#!/bin/bash
set -e
PYTHON_SCRIPT="$HOME/.local/bin/gamecube-pad.py"
AUTOSTART_DIR="$HOME/.config/autostart"
AUTOSTART_FILE="$AUTOSTART_DIR/gamecube-pad.desktop"
SILENT=false
if [[ "$1" == "silent" ]]; then
SILENT=true
fi
log() {
if [ "$SILENT" = false ]; then
echo "$@"
fi
}
check_and_install_deps() {
for pkg in evdev uinput; do
if ! python3 -c "import $pkg" &>/dev/null; then
log "[!] Dépendance manquante : $pkg. Installation avec pip..."
python3 -m pip install --user "$pkg" &>/dev/null
fi
done
for cmd in xdotool wmctrl; do
if ! command -v "$cmd" &>/dev/null; then
log "[!] Commande manquante : $cmd. Merci de linstaller via votre gestionnaire de paquets."
fi
done
}
install_script() {
check_and_install_deps
log "[+] Copie du script Python..."
mkdir -p "$(dirname "$PYTHON_SCRIPT")"
cp "$HOME/.linux-env/gamecube-pad/gamecube-pad.py" "$PYTHON_SCRIPT"
chmod +x "$PYTHON_SCRIPT"
log "[+] Création du fichier autostart..."
mkdir -p "$AUTOSTART_DIR"
cat > "$AUTOSTART_FILE" <<EOF
[Desktop Entry]
Type=Application
Exec=$PYTHON_SCRIPT
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=GameCube Pad
Comment=Lance le script GameCube Pad au démarrage
EOF
log "[✓] Installation terminée. Le script se lancera automatiquement à l'ouverture de session."
}
uninstall_script() {
log "[+] Suppression du script Python et autostart..."
rm -f "$PYTHON_SCRIPT"
rm -f "$AUTOSTART_FILE"
log "[✓] Désinstallation terminée."
}
case "$1" in
uninstall)
uninstall_script
;;
silent)
SILENT=true
uninstall_script &>/dev/null
install_script &>/dev/null
;;
*)
install_script
;;
esac

16
home/install.sh Executable file
View File

@@ -0,0 +1,16 @@
#!/bin/bash
set -e
# Chemin de base : le dossier où se trouve ce script
BASE_DIR="$(dirname "$(realpath "$0")")"
echo "[+] Recherche et exécution des install.sh..."
# Boucle récursive sur tous les fichiers install.sh
find "$BASE_DIR" -type f -name "install.sh" ! -path "$BASE_DIR/install.sh" | while read -r script; do
echo "[+] Lancement : $script"
chmod +x "$script"
"$script"
done
echo "[✓] Tous les install.sh ont été exécutés."

7
pre-commit Normal file
View File

@@ -0,0 +1,7 @@
#!/bin/sh
# install bashrc if bashrc git edited
if git diff --quiet home/bashrc/.bashrc; then
else
./home/bashrc/install.sh
fi

72
public/cv/cv-comymedia.md Normal file
View File

@@ -0,0 +1,72 @@
# Valère BRON
**Webdesigner / Développeur Front | Vue.js, Nuxt, WordPress, UI/UX**
Développeur front depuis plus de 12 ans, je combine expertise technique et sens du design pour créer des interfaces web performantes, accessibles et attractives. Passionné par lexpérience utilisateur, je transforme les concepts graphiques en sites web fonctionnels et optimisés.
📞 06 81 84 77 37
📧 contact@valere.dev
🔗 [LinkedIn](https://www.linkedin.com/in/valere-bron/)
💻 [GitHub](https://github.com/valerebron)
🎨 Portfolio : [valere.dev/portfolio](https://valere.dev/portfolio)
---
## 💡 Compétences
- **Front-end & CMS :** Vue.js, Nuxt, React.js, HTML, CSS, JavaScript, WordPress, PrestaShop, WooCommerce, Divi, Elementor
- **Graphisme & UI :** Photoshop, Illustrator, InDesign, XD, Tailwind, SCSS
- **SEO & marketing digital :** Optimisation SEO, Google Ads, newsletters, intégration de chartes graphiques
- **Méthodes & outils :** Git, GitLab, Jira, Agile/Scrum, tests E2E, CI/CD
- **Soft skills :** Autonomie, créativité, sens du détail, communication et travail en équipe
---
## 🏢 Expériences
### 2025 Groupama | Développeur Vue.js
- Développement dapplications Vue 3, optimisation UX et accessibilité
- Collaboration étroite avec les équipes métier et design
- Participation à la conception et aux tests fonctionnels
### 2024 Fitarena | Développeur Vue.js / UI
- Création dun agenda interactif Vue 3 & Pinia
- Développement de composants UI sur-mesure et intégration front
### 20212023 Potager City | Développeur Front
- Développement et maintenance dune application Vue 2 avec focus accessibilité
- Mise en place de tests E2E et optimisation SEO
- Développement déléments graphiques pour campagnes emailing
### 20202021 MassiveMusic | Développeur Fullstack & Designer UI
- Création dun réseau social de streaming musical
- Intégration de composants Vue avec Atomic Design
- Design et prototypage dinterfaces utilisateur
### 2019 Euronews | Intégrateur Front
- Intégration SCSS normalisée (ITCSS) pour la V3 du site
### 2018 Tyredating | Développeur Front
- Création de composants Vue et intégration responsive
- Réalisation de maquettes et déléments graphiques
---
## 🎓 Diplômes
- 2011 Licence Ingénierie de lInternet
- 2010 BTS Communication et Industries Graphiques
---
## 🚀 Projets personnels
- Développement de paquets npm et extensions Web
- Projets WordPress et PrestaShop pour clients et expérimentations personnelles
- Création de kits UI/UX pour applications web internes et prototypes interactifs

79
public/cv/cv-jalis.md Normal file
View File

@@ -0,0 +1,79 @@
# Valère BRON — Développeur Front-End & UX/UI
Marseille / Freelance • Vue.js / React.js • Interfaces web accessibles et performantes
📞 06 81 84 77 37
📧 contact@valere.dev
🔗 [LinkedIn](https://www.linkedin.com/in/valere-bron/)
💻 [GitHub](https://github.com/valerebron)
---
## Profil
Développeur front-end expérimenté avec 12 ans dexpérience, spécialisé dans la création dinterfaces web modernes, accessibles et performantes.
Passionné par lexpérience utilisateur, jai conçu des applications interactives et responsives, en intégrant des principes UX/UI et en travaillant étroitement avec les équipes design et produit.
Je souhaite évoluer vers le design dinterfaces et loptimisation des parcours utilisateurs au sein dune agence innovante.
---
## Compétences
**UX/UI & Design :** Wireframes, prototypes interactifs, parcours utilisateurs multi-devices, accessibilité (WCAG), tests A/B, design system
**Front-End :** Vue.js, React.js, TypeScript, JavaScript ES6+, HTML5, CSS3, Tailwind, SCSS, Storybook
**Outils & logiciels :** Figma, Adobe Suite (Photoshop, Illustrator, XD), Git, npm, Docker
**Méthodologie :** Agile (Scrum / Kanban), collaboration produit et design, veille technologique
---
## Expériences professionnelles
### Développeur Front-End — Freelance
**ESN & clients grands comptes — Lyon & Marseille • 20132025**
- Développement dinterfaces interactives et responsives en Vue.js et React.js
- Intégration et maintenance de design systems pour simplifier le workflow design → dev
- Création de composants réutilisables et tests daccessibilité
- Collaboration avec équipes UX/UI pour optimiser parcours utilisateurs et performances
- Mise en place de prototypes et validation de concepts avant production
**Projets notables :**
- Web TV synchronisée et plateforme interactive pour événement culturel
- Applications SaaS et e-commerce avec intégration marketing et analytics
- Systèmes front back orchestrés via Docker et CI/CD pour livraison rapide
---
## Projets personnels / démonstrateurs techniques
- Kit front-end interactif avec Vue/React pour prototypage rapide
- Microservices Docker pour apps web expérimentales
- Web TV auto-hébergée et traitement dimages/vidéo en front et back
---
## Formation
- Licence Ingénierie de lInternet (2011)
- Formation continue autodidacte en UX/UI, Figma, Adobe Suite
- Veille constante sur design web, accessibilité et bonnes pratiques front-end
---
## Langues
- Français : natif
- Anglais : professionnel (documentation technique, échanges dev/design)
---
## Contact
**Valère BRON**
Disponible freelance / CDD
Malt • LinkedIn • valere.dev

94
public/cv/cv-otoremote.md Normal file
View File

@@ -0,0 +1,94 @@
---
title: "Valère BRON — Développeur Front-End / TypeScript orienté Full-Stack"
author: "Valère BRON"
geometry: margin=2cm
fontsize: 11pt
---
# Valère BRON
**Développeur Front-End / TypeScript orienté Full-Stack**
Marseille • Freelance • Vue.js / TypeScript / NestJS • Intérêt pour la santé numérique
📞 06 81 84 77 37
📧 contact@valere.dev
🔗 [LinkedIn](https://www.linkedin.com/in/valere-bron/)
💻 [GitHub](https://github.com/valerebron)
---
## Profil
Développeur front-end depuis 12 ans, spécialisé dans la construction dinterfaces web modernes, accessibles et performantes.
Je me positionne aujourdhui comme **Front-End avancé** avec montée en compétences sur **NestJS, PostgreSQL et GraphQL**.
Attiré par les applications à impact (santé, culture, sciences) et les environnements agiles où lon collabore directement avec les équipes produit et techniques.
---
## Compétences
**Front-End :** Vue.js / Nuxt 3, TypeScript, HTML5, CSS3, Tailwind, Accessibilité (WCAG), State management (Pinia, VueUse), Tests (Vitest, Vue Test Utils)
**Full-Stack (en progression) :** NestJS, Node.js, PostgreSQL, Prisma, REST / GraphQL, Auth, services, architecture modulaire
**DevOps & outils :** Docker / docker-web, GitLab (Git Flow), CI/CD, Gitea, Linux
**Méthodologie & UX :** Collaboration produit / UX, culture data, documentation technique, environnement Agile
---
## Expériences professionnelles
### Développeur Front-End — Freelance
**ESN & clients grands comptes — Lyon & Marseille • 20132025**
- Intégration dinterfaces complexes et responsives
- Composants UI sur-mesure en Vue.js / TypeScript
- Optimisation performance front et audit accessibilité
- Mise en place doutils internes (design systems, librairies front)
- Contribution ponctuelle à des API en Node/NestJS
- Industrialisation via Docker, CI/CD, automatisations
---
## Projets personnels / démonstrateurs techniques
- **PushToRecord (Android Kotlin)** : App en arrière-plan pour enregistrement audio → flux asynchrone, permissions, architecture modulaire
- **Web TV auto-hébergée** : Player synchronisé, génération dynamique de flux HLS → intégration front + backend, orchestration Docker
- **Outil de superposition vidéo** : Extraction de frames, fusion, rendu via interface web → API simples, traitement dimage, micro-services Docker
- **docker-web** : CLI dorchestration Docker pour apps web → gestion images, automatisation, scripts Bash
---
## Formation
- Autodidacte avancé • 12 ans d'expérience front, montée full-stack
- Veille continue sur NestJS, PostgreSQL, GraphQL, perf front, UX
- Ateliers OpenClassrooms / Udemy : NestJS & Prisma (2024-2025)
---
## Valeur ajoutée pour OTOREMOTE
- Forte expérience interface/utilisation
- Culture UX/UI et accessibilité
- Capacité front immédiate
- Montée en compétence NestJS déjà entamée
- Travail propre, documenté, orienté qualité
- Appétence forte pour projets à impact humain
---
## Langues
- Français : natif
- Anglais : technique courant (documentation, échanges dev)
---
## Contact
**Valère BRON**
Marseille / Lyon — disponible en freelance et CDD
Malt • LinkedIn • valere.dev

View File

@@ -0,0 +1,237 @@
<html><head>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="">
<link href="https://fonts.googleapis.com/css2?family=Barlow:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&amp;display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&amp;display=swap" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css" rel="stylesheet">
<style>
/* Default styles */
pre {
background: #2d2d2d;
border-radius: 4px;
margin: 0.5em 0;
}
code {
font-family: 'Fira Code', Consolas, Monaco, monospace;
}
/* Custom CSS */
/* ====== Markdown PDF Pro Theme ====== */
@page {
margin: 25mm 20mm;
margin-top: 0mm;
}
body {
font-family: "Segoe UI", "Helvetica Neue", Arial, sans-serif;
font-size: 11pt;
line-height: 1.6;
color: #333;
background: white;
max-width: 800px;
margin: auto;
padding: 60px;
}
/* Headings */
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: "Segoe UI Semibold", "Helvetica Neue", Arial, sans-serif;
font-weight: 600;
margin-top: 2em;
margin-bottom: 0.6em;
line-height: 1.3;
color: #222;
}
h1 {
font-size: 24pt;
border-bottom: 2px solid #000;
/* accent color */
padding-bottom: 0.3em;
margin-top: 0;
}
h2 {
font-size: 18pt;
border-left: 4px solid #000;
padding-left: 0.5em;
}
h3 {
font-size: 14pt;
color: #444;
}
h4,
h5,
h6 {
font-size: 12pt;
color: #555;
}
/* Paragraphs */
p {
margin: 0.5em 0;
text-align: justify;
}
/* Links */
a {
color: #1e7fce;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
/* Lists */
ul,
ol {
margin: 0.5em 0 0.5em 2em;
}
li {
margin-bottom: 0.3em;
}
/* Blockquote */
blockquote {
border-left: 4px solid #0078D7;
margin: 1em 0;
padding: 0.5em 1em;
color: #555;
background: #f9f9f9;
font-style: italic;
}
/* Code */
code {
font-family: "Fira Code", "Consolas", monospace;
background: #f4f4f4;
padding: 0.2em 0.4em;
border-radius: 4px;
font-size: 0.95em;
}
pre {
background: #1e1e1e;
color: #dcdcdc;
padding: 1em;
border-radius: 6px;
overflow-x: auto;
font-size: 0.9em;
line-height: 1.4;
}
/* Tables */
table {
border-collapse: collapse;
margin: 1em 0;
width: 100%;
font-size: 0.95em;
}
th,
td {
border: 1px solid #ccc;
padding: 0.6em 0.8em;
text-align: left;
}
th {
background: #f0f0f0;
font-weight: 600;
}
tr:nth-child(even) td {
background: #fafafa;
}
/* Horizontal rule */
hr {
border: none;
border-top: 2px solid #eee;
margin: 2em 0;
}
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-python.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-javascript.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-bash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-sql.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-go.min.js"></script>
</head>
<body>
<h1>Valère BRON</h1>
<p><strong>Webdesigner / Développeur Front | Vue.js, Nuxt, WordPress, UI/UX</strong></p>
<p>Développeur front depuis plus de 12 ans, je combine expertise technique et sens du design pour créer des interfaces web performantes, accessibles et attractives. Passionné par lexpérience utilisateur, je transforme les concepts graphiques en sites web fonctionnels et optimisés.</p>
<p>📞 06 81 84 77 37<br>
📧 contact@valere.dev<br>
🔗 <a href="https://www.linkedin.com/in/valere-bron/">LinkedIn</a><br>
💻 <a href="https://github.com/valerebron">GitHub</a><br>
🎨 Portfolio : <a href="https://valere.dev/portfolio">valere.dev/portfolio</a></p>
<hr>
<h2>💡 Compétences</h2>
<ul>
<li><strong>Front-end &amp; CMS :</strong> Vue.js, Nuxt, React.js, HTML, CSS, JavaScript, WordPress, PrestaShop, WooCommerce, Divi, Elementor</li>
<li><strong>Graphisme &amp; UI :</strong> Photoshop, Illustrator, InDesign, XD, Tailwind, SCSS</li>
<li><strong>SEO &amp; marketing digital :</strong> Optimisation SEO, Google Ads, newsletters, intégration de chartes graphiques</li>
<li><strong>Méthodes &amp; outils :</strong> Git, GitLab, Jira, Agile/Scrum, tests E2E, CI/CD</li>
<li><strong>Soft skills :</strong> Autonomie, créativité, sens du détail, communication et travail en équipe</li>
</ul>
<hr>
<h2>🏢 Expériences</h2>
<h3>2025 Groupama | Développeur Vue.js</h3>
<ul>
<li>Développement dapplications Vue 3, optimisation UX et accessibilité</li>
<li>Collaboration étroite avec les équipes métier et design</li>
<li>Participation à la conception et aux tests fonctionnels</li>
</ul>
<h3>2024 Fitarena | Développeur Vue.js / UI</h3>
<ul>
<li>Création dun agenda interactif Vue 3 &amp; Pinia</li>
<li>Développement de composants UI sur-mesure et intégration front</li>
</ul>
<h3>20212023 Potager City | Développeur Front</h3>
<ul>
<li>Développement et maintenance dune application Vue 2 avec focus accessibilité</li>
<li>Mise en place de tests E2E et optimisation SEO</li>
<li>Développement déléments graphiques pour campagnes emailing</li>
</ul>
<h3>20202021 MassiveMusic | Développeur Fullstack &amp; Designer UI</h3>
<ul>
<li>Création dun réseau social de streaming musical</li>
<li>Intégration de composants Vue avec Atomic Design</li>
<li>Design et prototypage dinterfaces utilisateur</li>
</ul>
<h3>2019 Euronews | Intégrateur Front</h3>
<ul>
<li>Intégration SCSS normalisée (ITCSS) pour la V3 du site</li>
</ul>
<h3>2018 Tyredating | Développeur Front</h3>
<ul>
<li>Création de composants Vue et intégration responsive</li>
<li>Réalisation de maquettes et déléments graphiques</li>
</ul>
<hr>
<h2>🎓 Diplômes</h2>
<ul>
<li>2011 Licence Ingénierie de lInternet</li>
<li>2010 BTS Communication et Industries Graphiques</li>
</ul>
<hr>
<h2>🚀 Projets personnels</h2>
<ul>
<li>Développement de paquets npm et extensions Web</li>
<li>Projets WordPress et PrestaShop pour clients et expérimentations personnelles</li>
<li>Création de kits UI/UX pour applications web internes et prototypes interactifs</li>
</ul>
</body>
</html>

View File

@@ -0,0 +1,232 @@
<html><head>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="">
<link href="https://fonts.googleapis.com/css2?family=Barlow:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&amp;display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&amp;display=swap" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css" rel="stylesheet">
<style>
/* Default styles */
pre {
background: #2d2d2d;
border-radius: 4px;
margin: 0.5em 0;
}
code {
font-family: 'Fira Code', Consolas, Monaco, monospace;
}
/* Custom CSS */
/* ====== Markdown PDF Pro Theme ====== */
@page {
margin: 25mm 20mm;
margin-top: 0mm;
}
body {
font-family: "Segoe UI", "Helvetica Neue", Arial, sans-serif;
font-size: 11pt;
line-height: 1.6;
color: #333;
background: white;
max-width: 800px;
margin: auto;
padding: 60px;
}
/* Headings */
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: "Segoe UI Semibold", "Helvetica Neue", Arial, sans-serif;
font-weight: 600;
margin-top: 2em;
margin-bottom: 0.6em;
line-height: 1.3;
color: #222;
}
h1 {
font-size: 24pt;
border-bottom: 2px solid #000;
/* accent color */
padding-bottom: 0.3em;
margin-top: 0;
}
h2 {
font-size: 18pt;
border-left: 4px solid #000;
padding-left: 0.5em;
}
h3 {
font-size: 14pt;
color: #444;
}
h4,
h5,
h6 {
font-size: 12pt;
color: #555;
}
/* Paragraphs */
p {
margin: 0.5em 0;
text-align: justify;
}
/* Links */
a {
color: #1e7fce;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
/* Lists */
ul,
ol {
margin: 0.5em 0 0.5em 2em;
}
li {
margin-bottom: 0.3em;
}
/* Blockquote */
blockquote {
border-left: 4px solid #0078D7;
margin: 1em 0;
padding: 0.5em 1em;
color: #555;
background: #f9f9f9;
font-style: italic;
}
/* Code */
code {
font-family: "Fira Code", "Consolas", monospace;
background: #f4f4f4;
padding: 0.2em 0.4em;
border-radius: 4px;
font-size: 0.95em;
}
pre {
background: #1e1e1e;
color: #dcdcdc;
padding: 1em;
border-radius: 6px;
overflow-x: auto;
font-size: 0.9em;
line-height: 1.4;
}
/* Tables */
table {
border-collapse: collapse;
margin: 1em 0;
width: 100%;
font-size: 0.95em;
}
th,
td {
border: 1px solid #ccc;
padding: 0.6em 0.8em;
text-align: left;
}
th {
background: #f0f0f0;
font-weight: 600;
}
tr:nth-child(even) td {
background: #fafafa;
}
/* Horizontal rule */
hr {
border: none;
border-top: 2px solid #eee;
margin: 2em 0;
}
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-python.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-javascript.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-bash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-sql.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-go.min.js"></script>
</head>
<body>
<h1>Valère BRON — Développeur Front-End &amp; UX/UI</h1>
<p>Marseille / Freelance • Vue.js / React.js • Interfaces web accessibles et performantes</p>
<p>📞 06 81 84 77 37<br>
📧 contact@valere.dev<br>
🔗 <a href="https://www.linkedin.com/in/valere-bron/">LinkedIn</a><br>
💻 <a href="https://github.com/valerebron">GitHub</a></p>
<hr>
<h2>Profil</h2>
<p>Développeur front-end expérimenté avec 12 ans dexpérience, spécialisé dans la création dinterfaces web modernes, accessibles et performantes.<br>
Passionné par lexpérience utilisateur, jai conçu des applications interactives et responsives, en intégrant des principes UX/UI et en travaillant étroitement avec les équipes design et produit.<br>
Je souhaite évoluer vers le design dinterfaces et loptimisation des parcours utilisateurs au sein dune agence innovante.</p>
<hr>
<h2>Compétences</h2>
<p><strong>UX/UI &amp; Design :</strong> Wireframes, prototypes interactifs, parcours utilisateurs multi-devices, accessibilité (WCAG), tests A/B, design system</p>
<p><strong>Front-End :</strong> Vue.js, React.js, TypeScript, JavaScript ES6+, HTML5, CSS3, Tailwind, SCSS, Storybook</p>
<p><strong>Outils &amp; logiciels :</strong> Figma, Adobe Suite (Photoshop, Illustrator, XD), Git, npm, Docker</p>
<p><strong>Méthodologie :</strong> Agile (Scrum / Kanban), collaboration produit et design, veille technologique</p>
<hr>
<h2>Expériences professionnelles</h2>
<h3>Développeur Front-End — Freelance</h3>
<p><strong>ESN &amp; clients grands comptes — Lyon &amp; Marseille • 20132025</strong></p>
<ul>
<li>Développement dinterfaces interactives et responsives en Vue.js et React.js</li>
<li>Intégration et maintenance de design systems pour simplifier le workflow design → dev</li>
<li>Création de composants réutilisables et tests daccessibilité</li>
<li>Collaboration avec équipes UX/UI pour optimiser parcours utilisateurs et performances</li>
<li>Mise en place de prototypes et validation de concepts avant production</li>
</ul>
<p><strong>Projets notables :</strong></p>
<ul>
<li>Web TV synchronisée et plateforme interactive pour événement culturel</li>
<li>Applications SaaS et e-commerce avec intégration marketing et analytics</li>
<li>Systèmes front back orchestrés via Docker et CI/CD pour livraison rapide</li>
</ul>
<hr>
<h2>Projets personnels / démonstrateurs techniques</h2>
<ul>
<li>Kit front-end interactif avec Vue/React pour prototypage rapide</li>
<li>Microservices Docker pour apps web expérimentales</li>
<li>Web TV auto-hébergée et traitement dimages/vidéo en front et back</li>
</ul>
<hr>
<h2>Formation</h2>
<ul>
<li>Licence Ingénierie de lInternet (2011)</li>
<li>Formation continue autodidacte en UX/UI, Figma, Adobe Suite</li>
<li>Veille constante sur design web, accessibilité et bonnes pratiques front-end</li>
</ul>
<hr>
<h2>Langues</h2>
<ul>
<li>Français : natif</li>
<li>Anglais : professionnel (documentation technique, échanges dev/design)</li>
</ul>
<hr>
<h2>Contact</h2>
<p><strong>Valère BRON</strong><br>
Disponible freelance / CDD<br>
Malt • LinkedIn • valere.dev</p>
</body>
</html>

View File

@@ -0,0 +1,244 @@
<html><head>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="">
<link href="https://fonts.googleapis.com/css2?family=Barlow:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&amp;display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&amp;display=swap" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css" rel="stylesheet">
<style>
/* Default styles */
pre {
background: #2d2d2d;
border-radius: 4px;
margin: 0.5em 0;
}
code {
font-family: 'Fira Code', Consolas, Monaco, monospace;
}
/* Custom CSS */
/* ====== Markdown PDF Pro Theme ====== */
@page {
margin: 25mm 20mm;
margin-top: 0mm;
}
body {
font-family: "Segoe UI", "Helvetica Neue", Arial, sans-serif;
font-size: 11pt;
line-height: 1.6;
color: #333;
background: white;
max-width: 800px;
margin: auto;
padding: 60px;
}
/* Headings */
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: "Segoe UI Semibold", "Helvetica Neue", Arial, sans-serif;
font-weight: 600;
margin-top: 2em;
margin-bottom: 0.6em;
line-height: 1.3;
color: #222;
}
h1 {
font-size: 24pt;
border-bottom: 2px solid #000;
/* accent color */
padding-bottom: 0.3em;
margin-top: 0;
}
h2 {
font-size: 18pt;
border-left: 4px solid #000;
padding-left: 0.5em;
}
h3 {
font-size: 14pt;
color: #444;
}
h4,
h5,
h6 {
font-size: 12pt;
color: #555;
}
/* Paragraphs */
p {
margin: 0.5em 0;
text-align: justify;
}
/* Links */
a {
color: #1e7fce;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
/* Lists */
ul,
ol {
margin: 0.5em 0 0.5em 2em;
}
li {
margin-bottom: 0.3em;
}
/* Blockquote */
blockquote {
border-left: 4px solid #0078D7;
margin: 1em 0;
padding: 0.5em 1em;
color: #555;
background: #f9f9f9;
font-style: italic;
}
/* Code */
code {
font-family: "Fira Code", "Consolas", monospace;
background: #f4f4f4;
padding: 0.2em 0.4em;
border-radius: 4px;
font-size: 0.95em;
}
pre {
background: #1e1e1e;
color: #dcdcdc;
padding: 1em;
border-radius: 6px;
overflow-x: auto;
font-size: 0.9em;
line-height: 1.4;
}
/* Tables */
table {
border-collapse: collapse;
margin: 1em 0;
width: 100%;
font-size: 0.95em;
}
th,
td {
border: 1px solid #ccc;
padding: 0.6em 0.8em;
text-align: left;
}
th {
background: #f0f0f0;
font-weight: 600;
}
tr:nth-child(even) td {
background: #fafafa;
}
/* Horizontal rule */
hr {
border: none;
border-top: 2px solid #eee;
margin: 2em 0;
}
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-python.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-javascript.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-bash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-sql.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-go.min.js"></script>
</head>
<body>
<hr>
<h2>title: “Valère BRON — Développeur Front-End / TypeScript orienté Full-Stack”
author: “Valère BRON”
geometry: margin=2cm
fontsize: 11pt</h2>
<h1>Valère BRON</h1>
<p><strong>Développeur Front-End / TypeScript orienté Full-Stack</strong><br>
Marseille • Freelance • Vue.js / TypeScript / NestJS • Intérêt pour la santé numérique</p>
<p>📞 06 81 84 77 37<br>
📧 contact@valere.dev<br>
🔗 <a href="https://www.linkedin.com/in/valere-bron/">LinkedIn</a><br>
💻 <a href="https://github.com/valerebron">GitHub</a></p>
<hr>
<h2>Profil</h2>
<p>Développeur front-end depuis 12 ans, spécialisé dans la construction dinterfaces web modernes, accessibles et performantes.<br>
Je me positionne aujourdhui comme <strong>Front-End avancé</strong> avec montée en compétences sur <strong>NestJS, PostgreSQL et GraphQL</strong>.<br>
Attiré par les applications à impact (santé, culture, sciences) et les environnements agiles où lon collabore directement avec les équipes produit et techniques.</p>
<hr>
<h2>Compétences</h2>
<p><strong>Front-End :</strong> Vue.js / Nuxt 3, TypeScript, HTML5, CSS3, Tailwind, Accessibilité (WCAG), State management (Pinia, VueUse), Tests (Vitest, Vue Test Utils)</p>
<p><strong>Full-Stack (en progression) :</strong> NestJS, Node.js, PostgreSQL, Prisma, REST / GraphQL, Auth, services, architecture modulaire</p>
<p><strong>DevOps &amp; outils :</strong> Docker / docker-web, GitLab (Git Flow), CI/CD, Gitea, Linux</p>
<p><strong>Méthodologie &amp; UX :</strong> Collaboration produit / UX, culture data, documentation technique, environnement Agile</p>
<hr>
<h2>Expériences professionnelles</h2>
<h3>Développeur Front-End — Freelance</h3>
<p><strong>ESN &amp; clients grands comptes — Lyon &amp; Marseille • 20132025</strong></p>
<ul>
<li>Intégration dinterfaces complexes et responsives</li>
<li>Composants UI sur-mesure en Vue.js / TypeScript</li>
<li>Optimisation performance front et audit accessibilité</li>
<li>Mise en place doutils internes (design systems, librairies front)</li>
<li>Contribution ponctuelle à des API en Node/NestJS</li>
<li>Industrialisation via Docker, CI/CD, automatisations</li>
</ul>
<hr>
<h2>Projets personnels / démonstrateurs techniques</h2>
<ul>
<li><strong>PushToRecord (Android Kotlin)</strong> : App en arrière-plan pour enregistrement audio → flux asynchrone, permissions, architecture modulaire</li>
<li><strong>Web TV auto-hébergée</strong> : Player synchronisé, génération dynamique de flux HLS → intégration front + backend, orchestration Docker</li>
<li><strong>Outil de superposition vidéo</strong> : Extraction de frames, fusion, rendu via interface web → API simples, traitement dimage, micro-services Docker</li>
<li><strong>docker-web</strong> : CLI dorchestration Docker pour apps web → gestion images, automatisation, scripts Bash</li>
</ul>
<hr>
<h2>Formation</h2>
<ul>
<li>Autodidacte avancé • 12 ans dexpérience front, montée full-stack</li>
<li>Veille continue sur NestJS, PostgreSQL, GraphQL, perf front, UX</li>
<li>Ateliers OpenClassrooms / Udemy : NestJS &amp; Prisma (2024-2025)</li>
</ul>
<hr>
<h2>Valeur ajoutée pour OTOREMOTE</h2>
<ul>
<li>Forte expérience interface/utilisation</li>
<li>Culture UX/UI et accessibilité</li>
<li>Capacité front immédiate</li>
<li>Montée en compétence NestJS déjà entamée</li>
<li>Travail propre, documenté, orienté qualité</li>
<li>Appétence forte pour projets à impact humain</li>
</ul>
<hr>
<h2>Langues</h2>
<ul>
<li>Français : natif</li>
<li>Anglais : technique courant (documentation, échanges dev)</li>
</ul>
<hr>
<h2>Contact</h2>
<p><strong>Valère BRON</strong><br>
Marseille / Lyon — disponible en freelance et CDD<br>
Malt • LinkedIn • valere.dev</p>
</body>
</html>

View File

@@ -0,0 +1,189 @@
<html><head>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="">
<link href="https://fonts.googleapis.com/css2?family=Barlow:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&amp;display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&amp;display=swap" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css" rel="stylesheet">
<style>
/* Default styles */
pre {
background: #2d2d2d;
border-radius: 4px;
margin: 0.5em 0;
}
code {
font-family: 'Fira Code', Consolas, Monaco, monospace;
}
/* Custom CSS */
/* ====== Markdown PDF Pro Theme ====== */
@page {
margin: 25mm 20mm;
margin-top: 0mm;
}
body {
font-family: "Segoe UI", "Helvetica Neue", Arial, sans-serif;
font-size: 11pt;
line-height: 1.6;
color: #333;
background: white;
max-width: 800px;
margin: auto;
padding: 60px;
}
/* Headings */
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: "Segoe UI Semibold", "Helvetica Neue", Arial, sans-serif;
font-weight: 600;
margin-top: 2em;
margin-bottom: 0.6em;
line-height: 1.3;
color: #222;
}
h1 {
font-size: 24pt;
border-bottom: 2px solid #000;
/* accent color */
padding-bottom: 0.3em;
margin-top: 0;
}
h2 {
font-size: 18pt;
border-left: 4px solid #000;
padding-left: 0.5em;
}
h3 {
font-size: 14pt;
color: #444;
}
h4,
h5,
h6 {
font-size: 12pt;
color: #555;
}
/* Paragraphs */
p {
margin: 0.5em 0;
text-align: justify;
}
/* Links */
a {
color: #1e7fce;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
/* Lists */
ul,
ol {
margin: 0.5em 0 0.5em 2em;
}
li {
margin-bottom: 0.3em;
}
/* Blockquote */
blockquote {
border-left: 4px solid #0078D7;
margin: 1em 0;
padding: 0.5em 1em;
color: #555;
background: #f9f9f9;
font-style: italic;
}
/* Code */
code {
font-family: "Fira Code", "Consolas", monospace;
background: #f4f4f4;
padding: 0.2em 0.4em;
border-radius: 4px;
font-size: 0.95em;
}
pre {
background: #1e1e1e;
color: #dcdcdc;
padding: 1em;
border-radius: 6px;
overflow-x: auto;
font-size: 0.9em;
line-height: 1.4;
}
/* Tables */
table {
border-collapse: collapse;
margin: 1em 0;
width: 100%;
font-size: 0.95em;
}
th,
td {
border: 1px solid #ccc;
padding: 0.6em 0.8em;
text-align: left;
}
th {
background: #f0f0f0;
font-weight: 600;
}
tr:nth-child(even) td {
background: #fafafa;
}
/* Horizontal rule */
hr {
border: none;
border-top: 2px solid #eee;
margin: 2em 0;
}
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-python.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-javascript.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-bash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-sql.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-go.min.js"></script>
</head>
<body>
<p>Valère BRON
Marseille
📧 contact@valere.dev</p>
<p>📞 06 81 84 77 37</p>
<hr>
<p>À lattention du service recrutement JALIS
Objet : Candidature au poste de Designer UX/UI Senior</p>
<hr>
<p>Madame, Monsieur,</p>
<p>Développeur front-end depuis plus de 12 ans, jai acquis une solide expérience dans la conception et lintégration dinterfaces web performantes, accessibles et centrées sur lexpérience utilisateur. Travaillant étroitement avec des équipes design et produit, jai toujours eu à cœur de transformer des concepts en parcours utilisateurs clairs et engageants, tout en veillant à la maintenabilité et la qualité du code.</p>
<p>Passionné par lUX/UI et le design interactif, jai développé des prototypes et des interfaces pour des applications web, des plateformes SaaS et des projets culturels, en intégrant les principes daccessibilité et en optimisant lexpérience multi-devices. Ma maîtrise de Vue.js, React.js, HTML, CSS et Tailwind me permet de traduire les concepts graphiques en interfaces fonctionnelles et réactives, en collaboration avec les designers et les équipes produit.</p>
<p>Rigoureux, curieux et force de proposition, je souhaite aujourdhui évoluer vers un rôle de Designer UX/UI, afin de mettre pleinement mon expertise front et mon sens du design au service de projets innovants. Rejoindre JALIS serait pour moi lopportunité de contribuer à la création dinterfaces modernes et performantes pour une agence reconnue pour son excellence et son innovation, tout en collaborant avec une équipe pluridisciplinaire passionnée.</p>
<p>Je serais ravi de pouvoir échanger avec vous pour détailler mes compétences et la valeur que je peux apporter à vos projets.</p>
<p>Je vous remercie pour votre attention et reste à votre disposition pour un entretien.</p>
<p>Cordialement,
Valère BRON</p>
</body>
</html>

View File

@@ -0,0 +1,187 @@
<html><head>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="">
<link href="https://fonts.googleapis.com/css2?family=Barlow:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&amp;display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&amp;display=swap" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css" rel="stylesheet">
<style>
/* Default styles */
pre {
background: #2d2d2d;
border-radius: 4px;
margin: 0.5em 0;
}
code {
font-family: 'Fira Code', Consolas, Monaco, monospace;
}
/* Custom CSS */
/* ====== Markdown PDF Pro Theme ====== */
@page {
margin: 25mm 20mm;
margin-top: 0mm;
}
body {
font-family: "Segoe UI", "Helvetica Neue", Arial, sans-serif;
font-size: 11pt;
line-height: 1.6;
color: #333;
background: white;
max-width: 800px;
margin: auto;
padding: 60px;
}
/* Headings */
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: "Segoe UI Semibold", "Helvetica Neue", Arial, sans-serif;
font-weight: 600;
margin-top: 2em;
margin-bottom: 0.6em;
line-height: 1.3;
color: #222;
}
h1 {
font-size: 24pt;
border-bottom: 2px solid #000;
/* accent color */
padding-bottom: 0.3em;
margin-top: 0;
}
h2 {
font-size: 18pt;
border-left: 4px solid #000;
padding-left: 0.5em;
}
h3 {
font-size: 14pt;
color: #444;
}
h4,
h5,
h6 {
font-size: 12pt;
color: #555;
}
/* Paragraphs */
p {
margin: 0.5em 0;
text-align: justify;
}
/* Links */
a {
color: #1e7fce;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
/* Lists */
ul,
ol {
margin: 0.5em 0 0.5em 2em;
}
li {
margin-bottom: 0.3em;
}
/* Blockquote */
blockquote {
border-left: 4px solid #0078D7;
margin: 1em 0;
padding: 0.5em 1em;
color: #555;
background: #f9f9f9;
font-style: italic;
}
/* Code */
code {
font-family: "Fira Code", "Consolas", monospace;
background: #f4f4f4;
padding: 0.2em 0.4em;
border-radius: 4px;
font-size: 0.95em;
}
pre {
background: #1e1e1e;
color: #dcdcdc;
padding: 1em;
border-radius: 6px;
overflow-x: auto;
font-size: 0.9em;
line-height: 1.4;
}
/* Tables */
table {
border-collapse: collapse;
margin: 1em 0;
width: 100%;
font-size: 0.95em;
}
th,
td {
border: 1px solid #ccc;
padding: 0.6em 0.8em;
text-align: left;
}
th {
background: #f0f0f0;
font-weight: 600;
}
tr:nth-child(even) td {
background: #fafafa;
}
/* Horizontal rule */
hr {
border: none;
border-top: 2px solid #eee;
margin: 2em 0;
}
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-python.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-javascript.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-bash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-sql.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-go.min.js"></script>
</head>
<body>
<h1>Lettre de motivation Valère BRON</h1>
<p><strong>Objet : Candidature au poste de Webdesigner / Développeur Front Lyon</strong></p>
<p>Madame, Monsieur,</p>
<p>Fort de plus de 12 ans dexpérience en développement front-end et intégration dinterfaces web, je souhaite mettre mes compétences au service de votre agence afin de contribuer à la création et à la maintenance de sites internet performants et esthétiques pour vos clients.</p>
<p>Passionné par lexpérience utilisateur, je combine expertise technique et sens du design pour transformer les concepts graphiques en interfaces fonctionnelles et accessibles. Mon parcours ma permis de travailler sur des projets variés, du développement dapplications Vue.js et Nuxt à lintégration de sites WordPress et PrestaShop, en passant par la réalisation de newsletters et loptimisation SEO.</p>
<p>Mon profil polyvalent me permet de gérer à la fois le design, lintégration et la maintenance technique, tout en restant force de proposition sur lergonomie, laccessibilité et la performance. Je maîtrise les outils de création graphique tels que Photoshop, Illustrator, InDesign et XD, et je sais les mettre en pratique dans le cadre de projets web complexes.</p>
<p>Intégrer votre agence représente pour moi lopportunité de contribuer à des projets ambitieux dans un environnement créatif et collaboratif, tout en continuant à enrichir mes compétences et à relever de nouveaux challenges techniques et graphiques.</p>
<p>Je serais ravi de pouvoir vous présenter mon portfolio et discuter de la manière dont je pourrais apporter ma valeur ajoutée à votre équipe.</p>
<p>Je vous remercie par avance pour lattention portée à ma candidature et reste à votre disposition pour un entretien.</p>
<p>Cordialement,<br>
<strong>Valère BRON</strong><br>
📞 06 81 84 77 37<br>
📧 contact@valere.dev<br>
🔗 <a href="https://valere.dev/portfolio">Portfolio</a></p>
</body>
</html>

View File

@@ -0,0 +1,27 @@
Valère BRON
Marseille
📧 contact@valere.dev
📞 06 81 84 77 37
---
À lattention du service recrutement JALIS
Objet : Candidature au poste de Designer UX/UI Senior
---
Madame, Monsieur,
Développeur front-end depuis plus de 12 ans, jai acquis une solide expérience dans la conception et lintégration dinterfaces web performantes, accessibles et centrées sur lexpérience utilisateur. Travaillant étroitement avec des équipes design et produit, jai toujours eu à cœur de transformer des concepts en parcours utilisateurs clairs et engageants, tout en veillant à la maintenabilité et la qualité du code.
Passionné par lUX/UI et le design interactif, jai développé des prototypes et des interfaces pour des applications web, des plateformes SaaS et des projets culturels, en intégrant les principes daccessibilité et en optimisant lexpérience multi-devices. Ma maîtrise de Vue.js, React.js, HTML, CSS et Tailwind me permet de traduire les concepts graphiques en interfaces fonctionnelles et réactives, en collaboration avec les designers et les équipes produit.
Rigoureux, curieux et force de proposition, je souhaite aujourdhui évoluer vers un rôle de Designer UX/UI, afin de mettre pleinement mon expertise front et mon sens du design au service de projets innovants. Rejoindre JALIS serait pour moi lopportunité de contribuer à la création dinterfaces modernes et performantes pour une agence reconnue pour son excellence et son innovation, tout en collaborant avec une équipe pluridisciplinaire passionnée.
Je serais ravi de pouvoir échanger avec vous pour détailler mes compétences et la valeur que je peux apporter à vos projets.
Je vous remercie pour votre attention et reste à votre disposition pour un entretien.
Cordialement,
Valère BRON

View File

@@ -0,0 +1,23 @@
# Lettre de motivation Valère BRON
**Objet : Candidature au poste de Webdesigner / Développeur Front Lyon**
Madame, Monsieur,
Fort de plus de 12 ans dexpérience en développement front-end et intégration dinterfaces web, je souhaite mettre mes compétences au service de votre agence afin de contribuer à la création et à la maintenance de sites internet performants et esthétiques pour vos clients.
Passionné par lexpérience utilisateur, je combine expertise technique et sens du design pour transformer les concepts graphiques en interfaces fonctionnelles et accessibles. Mon parcours ma permis de travailler sur des projets variés, du développement dapplications Vue.js et Nuxt à lintégration de sites WordPress et PrestaShop, en passant par la réalisation de newsletters et loptimisation SEO.
Mon profil polyvalent me permet de gérer à la fois le design, lintégration et la maintenance technique, tout en restant force de proposition sur lergonomie, laccessibilité et la performance. Je maîtrise les outils de création graphique tels que Photoshop, Illustrator, InDesign et XD, et je sais les mettre en pratique dans le cadre de projets web complexes.
Intégrer votre agence représente pour moi lopportunité de contribuer à des projets ambitieux dans un environnement créatif et collaboratif, tout en continuant à enrichir mes compétences et à relever de nouveaux challenges techniques et graphiques.
Je serais ravi de pouvoir vous présenter mon portfolio et discuter de la manière dont je pourrais apporter ma valeur ajoutée à votre équipe.
Je vous remercie par avance pour lattention portée à ma candidature et reste à votre disposition pour un entretien.
Cordialement,
**Valère BRON**
📞 06 81 84 77 37
📧 contact@valere.dev
🔗 [Portfolio](https://valere.dev/portfolio)

Binary file not shown.

BIN
public/cv/pdf/cv-jalis.pdf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More