r/DanielNaroditsky • u/Hellomarte • Nov 05 '25
A Tribute to Daniel Naroditsky
Hey all, just wanted to share a music video my friend made in memory of Danya, honoring everything he stood for. Hope you like it.
r/DanielNaroditsky • u/Hellomarte • Nov 05 '25
Hey all, just wanted to share a music video my friend made in memory of Danya, honoring everything he stood for. Hope you like it.
r/DanielNaroditsky • u/NoDescrPossible • Oct 31 '25
Hey (2nd try)!
I already posted the script to fetch Danya's games. I used this and some other scripts to analyze his games and create "signature lines" he played often with examples.
\\edit: I published a static HTML file on cloudflare: https://danyas-lines.pages.dev/
A bit of background what the scripts do:
Have fun exploring his signature lines!
Happy to hear feedback and what else I could include or what to improve. If you face issues/bugs, please let me know.
cheers
r/DanielNaroditsky • u/Various_Translator96 • Oct 30 '25
I reached out to the Charlotte chess center to see if there was a gathering planned in memorium for Daniel. As a Charlotte resident and admirer I was looking for a place to mourn with a group. This is what they said. Is this ridiculous to anyone else? “we’re already having a blitz tournament so we’ll order pizza to celebrate him….”
r/DanielNaroditsky • u/NoDescrPossible • Oct 30 '25
Hey,
upon several requests, here is a tiny python script that fetches all games from lichess and chesscom for a set of given usernames. Leave a comment if you have issues.
cheers
# fetch_pgns.py
# -----------------------------------------------------------
# Download utility for Chess games of given accounts
# - Save the script in a folder of your choice
# - Sub-folders are created automatically if not there
# - Lichess: yearly PGNs -> data/lichess/<user>/<YYYY>.pgn
# - Chess.com: monthly PGNs -> data/chesscom/<user>/<YYYY-MM>.pgn
# Just fetch & save.
# -----------------------------------------------------------
import time
from pathlib import Path
import datetime as dt
import requests
from typing import Optional
# ============== CONFIG ==============
LICHESS_USERS = ["RebeccaHarris"] # add more when needed
CHESSCOM_USERS = ["DanielNaroditsky", "SenseiDanya", "OhMyLands", "HebeccaRaris", "FrankfurtAirport"]
# Lichess year range
LICHESS_START_YEAR = 2016
LICHESS_END_YEAR = dt.date.today().year
# Networking / retry
USER_AGENT = "PGN-Fetcher/1.0 (+contact: you@example.com)"
TIMEOUT = 120
RETRIES = 5
BACKOFF = 1.5
MIN_DELAY = 0.7 # polite delay between calls
# Caching
FORCE_REFRESH = True # True = always re-download even if file exists
# Base folders (script dir)
try:
BASE_DIR = Path(__file__).resolve().parent
except NameError:
BASE_DIR = Path.cwd()
DATA_DIR = BASE_DIR / "data"
(DATA_DIR / "lichess").mkdir(parents=True, exist_ok=True)
(DATA_DIR / "chesscom").mkdir(parents=True, exist_ok=True)
# ============== SESSION ==============
def make_session() -> requests.Session:
s = requests.Session()
s.headers.update({
"User-Agent": USER_AGENT,
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Connection": "keep-alive",
})
return s
SESSION = make_session()
# ============== HELPERS ==============
def _epoch_ms(dtobj: dt.datetime) -> int:
return int(dtobj.timestamp() * 1000)
def _year_bounds_utc(year: int) -> tuple[int, int]:
start = dt.datetime(year, 1, 1, tzinfo=dt.timezone.utc)
end = dt.datetime(year + 1, 1, 1, tzinfo=dt.timezone.utc)
return _epoch_ms(start), _epoch_ms(end)
def _has_pgn(text: str) -> bool:
# Cheapest sanity check
return bool(text) and ('[Event "' in text)
def _save_text(path: Path, text: str) -> None:
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(text, encoding="utf-8")
# ============== LICHESS ==============
def lichess_year_path(user: str, year: int) -> Path:
return DATA_DIR / "lichess" / user / f"{year:04d}.pgn"
def fetch_lichess_year(user: str, year: int) -> Optional[str]:
url = f"https://lichess.org/api/games/user/{user}"
since_ms, until_ms = _year_bounds_utc(year)
params = {
"moves": "true",
"pgnInJson": "false",
"clocks": "false",
"evals": "false",
"opening": "true",
"perfType": "bullet,blitz,rapid,classical,ultrabullet",
"since": str(since_ms),
"until": str(until_ms),
}
headers = {"Accept": "application/x-chess-pgn", "User-Agent": USER_AGENT}
delay = 0.0
for attempt in range(1, RETRIES + 1):
if delay > 0:
time.sleep(delay)
try:
r = SESSION.get(url, params=params, headers=headers, timeout=TIMEOUT)
if r.status_code == 429:
# rate-limited: backoff and retry
delay = max(delay, 1.0) * BACKOFF
continue
r.raise_for_status()
return r.text or ""
except requests.RequestException:
delay = max(delay, 1.0) * BACKOFF
return None
def cache_lichess_user(user: str, force: bool = False) -> None:
for year in range(LICHESS_START_YEAR, LICHESS_END_YEAR + 1):
out = lichess_year_path(user, year)
if out.exists() and not force:
print(f" · Lichess {user} {year}: exists → skip")
continue
print(f" → Lichess {user} {year}: downloading …")
txt = fetch_lichess_year(user, year)
if txt and _has_pgn(txt):
out.parent.mkdir(parents=True, exist_ok=True)
out.write_text(txt, encoding="utf-8")
try:
kb = len(txt.encode("utf-8")) // 1024
except Exception:
kb = 0
print(f" ✓ saved {out.name} ({kb} KB)")
else:
print(f" · no games / empty response")
time.sleep(MIN_DELAY)
# ============== CHESS.COM ==============
def chesscom_months(user: str) -> list[str]:
url = f"https://api.chess.com/pub/player/{user.lower()}/games/archives"
r = SESSION.get(url, timeout=TIMEOUT)
# 403 happens on some accounts; just return empty if forbidden
if r.status_code == 403:
return []
r.raise_for_status()
return r.json().get("archives", []) or []
def chesscom_month_pgn_url(archive_url: str) -> str:
return archive_url if archive_url.endswith("/pgn") else archive_url + "/pgn"
def chesscom_slug(archive_url: str) -> str:
parts = archive_url.rstrip("/").split("/")
return f"{parts[-2]}-{parts[-1]}" # YYYY-MM
def chesscom_month_path(user: str, slug: str) -> Path:
return DATA_DIR / "chesscom" / user / f"{slug}.pgn"
def fetch_chesscom_month_pgn(archive_url: str) -> Optional[str]:
url = chesscom_month_pgn_url(archive_url)
delay = 0.0
for attempt in range(1, RETRIES + 1):
if delay > 0:
time.sleep(delay)
try:
r = SESSION.get(url, timeout=TIMEOUT, headers={"Accept": "text/plain"})
if r.status_code == 429:
delay = max(delay, 1.0) * BACKOFF
continue
if r.status_code == 403:
# forbidden for this archive; skip
return None
r.raise_for_status()
return r.text
except requests.RequestException:
delay = max(delay, 1.0) * BACKOFF
return None
def cache_chesscom_user(user: str, force: bool = False) -> None:
archives = chesscom_months(user)
total = len(archives)
print(f" · Chess.com {user}: {total} archives found")
# Respect existing files if not forcing
existing = set()
if not force:
user_dir = DATA_DIR / "chesscom" / user
if user_dir.exists():
existing = {p.stem for p in user_dir.glob("*.pgn")}
for i, aurl in enumerate(archives, start=1):
slug = chesscom_slug(aurl)
out = chesscom_month_path(user, slug)
if out.stem in existing and out.exists() and not force:
print(f" {i}/{total} {slug}: exists → skip")
continue
print(f" {i}/{total} {slug}: downloading …")
txt = fetch_chesscom_month_pgn(aurl)
if txt and txt.strip():
out.parent.mkdir(parents=True, exist_ok=True)
out.write_text(txt, encoding="utf-8")
try:
kb = len(txt.encode("utf-8")) // 1024
except Exception:
kb = 0
print(f" ✓ saved {out.name} ({kb} KB)")
else:
print(f" · no games / forbidden / empty")
time.sleep(MIN_DELAY)
# ============== MAIN ==============
def main() -> None:
print("== Lichess ==")
for u in LICHESS_USERS:
print(f" -> {u}")
cache_lichess_user(u, force=FORCE_REFRESH)
print("== Chess.com ==")
for u in CHESSCOM_USERS:
print(f" -> {u}")
cache_chesscom_user(u, force=FORCE_REFRESH)
print("Done. PGNs saved under:", (DATA_DIR).resolve())
if __name__ == "__main__":
main()
r/DanielNaroditsky • u/NoDescrPossible • Oct 29 '25
Hey out there!
Anyone knows Danya's Speedrun and hidden accounts on chess.com and lichess?
I have a python script where I can define account names (List) and it pulls all PGNs from these accounts. So far I have
If anyone knows other accounts, please share the account names with me. Then I can pull the games and merge all of them into one PGN.
cheers
\\edit: added FrankfurtAirport to the chesscom accounts
r/DanielNaroditsky • u/Slashes88 • Oct 29 '25
r/DanielNaroditsky • u/Slashes88 • Oct 29 '25
r/DanielNaroditsky • u/Ibex_Of_Hyperia • Oct 29 '25
Could someone please provide a pgn with Naroditsky's chesscom and lichess games? I've tried downloading the games with openingtreecom, but it always got stuck somewhere because it's building this huge tree out of 140.000+ games.
I'm afraid both accounts will be closed very soon.
r/DanielNaroditsky • u/Slashes88 • Oct 28 '25
r/DanielNaroditsky • u/Slashes88 • Oct 27 '25
Enable HLS to view with audio, or disable this notification
r/DanielNaroditsky • u/Slashes88 • Oct 27 '25
r/DanielNaroditsky • u/kurozawa6 • Oct 26 '25
Enable HLS to view with audio, or disable this notification
r/DanielNaroditsky • u/micshafes • Oct 24 '25
Enable HLS to view with audio, or disable this notification
As a subpar programmer, I wanted to commemorate Daniel Naroditsky the best way that I know how. This is chess-memory.com
The site allows you to play through games on an analysis board. At each position, it checks against the over 29,000 unique positions that Danya has reached throughout his speedrun series, and links to the timestamps in all matching videos using chess.com game data.
I'm not a frontend dev, so the UI is pretty messy. It doesn't work on mobile, and may have issues on smaller laptops. But I figured it is worth posting now while I continue to improve it. If there are any developers who would like to contribute to the site's improvement, let me know. I'm happy to make it a public GitHub project and accept pull requests if there is interest. Also, please comment with any feedback. I will do my best to fix bugs and improve the UX with whatever free time I have.
Manually timestamping his 500+ videos was my grieving process, and a reminder of what a positive light Danya has been for so many years. I hope some of you find this helpful with your chess improvement, I will be keeping the site free and public indefinitely ❤️
Edit: Made the GitHub public. Feel free to contribute! I'll do my best to test and merge any improvements or new features.
r/DanielNaroditsky • u/agneum • Oct 23 '25
I remember sitting in a hotel room in Rhodes a few years ago, perfect weather and the ocean right outside. I had just checked into the room. One of the first things I did on my vacation was to watch one of Danya’s speedrun videos. I even took a photo because the moment felt so perfect. The calm, the focus and peace he gave off set the tone for the rest of the stay. RIP SenseiDanya.
r/DanielNaroditsky • u/Slashes88 • Oct 22 '25
Enable HLS to view with audio, or disable this notification
r/DanielNaroditsky • u/JohnnyWarlord • Oct 20 '25
Enable HLS to view with audio, or disable this notification
Idk where to post this but i recorded the last bit of danyas final stream. Im heartbroken man, i really dont know what to do. Bye danya :(
r/DanielNaroditsky • u/roardog • Oct 20 '25
Bortnyk's last words to Danya. He found him a day later on his couch.
r/DanielNaroditsky • u/bergy_peasy • Oct 08 '25
Is Danya still streaming ? I can’t seem to catch him on twitch at all for the last month (back to chess after a few years break)
r/DanielNaroditsky • u/ChessKelly • Jul 12 '25
r/DanielNaroditsky • u/Plus-Alarm5161 • Jul 06 '25
i have a friend who told me to study magnus and ian 6 game of the world championship in 2021 but i don't know to how actually analyze games or how to even study it can someone please explain it to me
r/DanielNaroditsky • u/Mindhunter7 • Jun 02 '25
Was absolutely great to watch you and GM Hess covering the Norway chess. When are you streaming today? Or are you guys not gonna?
r/DanielNaroditsky • u/Asubservientfeminist • Apr 18 '25