A tiny web app for storing personal favorites and generating a personalized post feed.
At temporary domain https://e621scraper.duckdns.org
- Save and manage personal favorites
- Generate a customized feed based on your preferences
- Simple local dev setup (Rust backend + Trunk-served frontend)
Make sure you have Rust and cargo installed. Then:
cargo install cargo-watch
cargo install --locked trunkcargo-watch enables hot-reload for the backend, and trunk serves/builds the frontend.
./config.toml
admin_user = "username"
admin_api = "api_key"
tag_blacklist = ["tag1", "tag2", "tagN"]
posts_domain = "https://uri.com"
posts_limit = 320 # 320 is max
rps_delay_ms = 250
max_retries = 3
df_floor = 0.7
idf_max = 100.0
[group_weights]
'artist' = 2.0
'character' = 1.5
'copyright' = 1.3
'species' = 1.2
'general' = 1.0
'meta' = 0.4
'lore' = 0.6
[priors]
now = "2000-1-01T12:00:00Z" # dummy value, will be replaced with current date
recency_tau_days = 14.0
quality_a = 0.00
quality_b = 0.00
mix_sim = 1.0
mix_quality = 0.0
mix_recency = 0.0
idf_lambda = 0.0
idf_alpha = 1.0
freq_alpha = 0.5Small guide on scoring vars
| Variable | Lower → | Higher → |
|---|---|---|
df_floor |
rarer tags hit harder (risk: spiky) | rarer tags toned down (stable) |
idf_max |
compress extremes | allow rarities to dominate more |
idf_lambda |
blend IDF toward 1 (flatter) | keep raw IDF contrast (sharper) |
idf_alpha |
stronger compression (flatter) | less compression (sharper) |
freq_alpha |
downplay frequency (treat counts similarly; more diversity) | amplify frequent tags (favorites dominate; less diversity) |
quality_a |
score_total matters less | score_total matters more |
quality_b |
fav_count matters less | fav_count matters more |
recency_tau_days |
faster decay (newer wins) | slower decay (older survives) |
mix_sim |
personalization weaker | personalization stronger |
mix_quality |
quality matters less | quality matters more |
mix_recency |
freshness matters less | freshness matters more |
cd ./parser-api/
cargo watch -x run./static/config.js
window.APP_CONFIG = Object.freeze({
posts_domain: "https://uri.com",
backend_domain: "https://uri.com",
});cd ./parser-web/
trunk serve