~kris/dots

srice

srice/doc/files/cdn/pics.md -rw-r--r-- 22.3 KiB
e98f3b03 — Kris Yotam chore: sync local state after restore (push updates, no pull) a month ago

#pics/

Primary image tree. Absorbs everything from images/ and photos/.

#Principles

  1. Every entity is a directory, not a file. winona-ryder/ not winona-ryder.jpg. Adding a 7th photo is just dropping a file in the folder.
  2. Canonical file has a fixed name. portrait.jpg for people, cover.jpg for media. The site always points here. Stable URL, never changes.
  3. Variants are self-describing. Filenames encode year, context, source, edition. No -1, -2, -3.
  4. One tree, one truth. photos/ and images/ are eliminated. Everything lives under pics/.
  5. Collections are first-class. Anything that is a finite/novelty/archival set rather than a real-world ever-expanding category is a collection.

#Structure

pics/
  people/           -- real people and fictional characters
  media/            -- covers for film, anime, manga, tv, games, albums, etc.
  platform/         -- profile images from external platforms
  collections/      -- finite/novelty/archival sets (including site-specific krisyotam/)
  kris/             -- personal photos, setups, food, screenshots, life

#People

pics/people/{role}/{name}/

#Roles

actors, artists, authors, ballerinas, characters, designers, mathematicians, musicians, philosophers, poets

Fictional characters all live under characters/. Do not create source-medium role directories such as anime/, film/, or tv/ under people/; those distinctions are file metadata or variant context, not public-facing structure.

#Canonical file

portrait.jpg -- the single image the site uses for this person.

#Variant naming

{name}-{year}-{context}.jpg

Context is freeform but descriptive. Encode whatever distinguishes the image: event, role, photographer, publication, outfit.

#Examples

people/actors/winona-ryder/
  portrait.jpg
  winona-ryder-1988-beetlejuice-press.jpg
  winona-ryder-1994-reality-bites-behind-scenes.jpg
  winona-ryder-1999-girl-interrupted-promo.jpg
  winona-ryder-2019-met-gala-versace.jpg
  winona-ryder-2022-stranger-things-s4-still.jpg

people/actors/audrey-hepburn/
  portrait.jpg
  audrey-hepburn-1961-breakfast-at-tiffanys-still.jpg
  audrey-hepburn-1953-roman-holiday-press.jpg

people/mathematicians/srinivasa-ramanujan/
  portrait.jpg
  srinivasa-ramanujan-1919-passport-photo.jpg

people/characters/rei-ayanami/
  portrait.jpg
  rei-ayanami-plugsuit.jpg
  rei-ayanami-rebuild-3.jpg

#Media

pics/media/{medium}/{slug}/

#Mediums

film, anime, manga, tv, games, console, books, albums, ballet, plays, courses, lectures

#Canonical file

cover.jpg -- the single cover image the site uses for this media item.

#Variant naming

{slug}-{variant}.jpg

Variant describes the edition, release, region, or format.

#Film slug convention

Preserve the existing CDN basename convention when migrating film directories. Do not reorder filename parts just to match a new theoretical scheme. If the current path already uses year-title-director, keep that order in the new directory slug. If a collision requires disambiguation, add the missing year, director, edition, or other identifying context.

#Albums

Albums live under media/albums/ nested by artist, then album directory.

pics/media/albums/{artist}/{artist}-{year}-{album}/

Each album directory supports multiple cover variants. Artist photos (portraits, event shots) go in pics/people/musicians/, not here. Albums is strictly for album cover art.

#Books

Books collapse literature and workbooks into one medium. Do not subdivide by Library of Congress classification.

pics/media/books/{slug}/

One cover per book. If you need multiple cover variants, the directory supports it like any other media item. Slugs should preserve the existing basename convention where possible. When more specificity is needed, use explicit parts such as year, author, title, translator, edition, or publisher.

media/books/1880-fyodor-dostoevsky-the-brothers-karamazov/
  cover.jpg
media/books/1603-william-shakespeare-hamlet/
  cover.jpg
media/books/1994-graham-knuth-patashnik-concrete-mathematics/
  cover.jpg

#Media examples

media/film/pulp-fiction-1994-quentin-tarantino/
  cover.jpg
  pulp-fiction-1994-quentin-tarantino-criterion.jpg
  pulp-fiction-1994-quentin-tarantino-japanese-theatrical.jpg
  pulp-fiction-1994-quentin-tarantino-vhs-original.jpg

media/film/girl-interrupted-1999-james-mangold/
  cover.jpg
  girl-interrupted-1999-james-mangold-criterion.jpg
  girl-interrupted-1999-james-mangold-uk-theatrical.jpg

media/anime/serial-experiments-lain/
  cover.jpg
  serial-experiments-lain-funimation.jpg
  serial-experiments-lain-dvd-vol1.jpg

media/manga/berserk/
  cover.jpg
  berserk-vol1-dark-horse.jpg

media/books/1880-fyodor-dostoevsky-the-brothers-karamazov/
  cover.jpg

media/books/1994-graham-knuth-patashnik-concrete-mathematics/
  cover.jpg

media/games/dark-souls/
  cover.jpg
  dark-souls-japanese.jpg
  dark-souls-prepare-to-die-edition.jpg

media/albums/miles-davis/miles-davis-1959-kind-of-blue/
  cover.jpg
  miles-davis-1959-kind-of-blue-mono-original.jpg
  miles-davis-1959-kind-of-blue-mfsl-remaster.jpg

media/albums/nas/nas-1994-illmatic/
  cover.jpg
  nas-1994-illmatic-10th-anniversary.jpg

#Platform

pics/platform/{platform}/{user}/

Profile images, exports, and screenshots from external platforms.

#Examples

platform/mal/kris/
  profile.jpg
platform/mal/semaj/
  profile.jpg

#Kris

pics/kris/

Personal photos. Not site assets (those live in collections/krisyotam/), not profile pictures (those live in collections/pfps/). This is real life.

#Directories

kris/
  setups/            -- desk, battlestation, workspace photos
  food/              -- cooking, meals, restaurants
  screenshots/       -- screen captures, terminal output, high scores
  life/              -- IRL photos by era
    baby/
    kid/
    teen/
    20s/

#Naming

Freeform. Use whatever describes the image. No strict convention needed for personal photos.

#Examples

kris/setups/
  moirai-2025-quad-monitor.jpg
  moirai-2026-cable-management.jpg
  krislaptop-2024-couch.jpg

kris/food/
  katsu-curry-2025-homemade.jpg
  ramen-2026-ichiran.jpg

kris/screenshots/
  dwm-rice-2025-pywal.png
  htop-128gb-ram.png

kris/life/baby/
  kris-baby-01.jpg
kris/life/kid/
  kris-kid-01.jpg
kris/life/teen/
  kris-teen-01.jpg
kris/life/20s/
  kris-20s-01.jpg

#Collections

pics/collections/{collection-name}/

Anything that is a finite, novelty, or archival set -- not a real-world ever-expanding category. Magazine archives, meme sets, badge walls, emoji packs, profile picture sets, iceberg charts, bookstore photos, etc.

#Naming within collections

Use whatever scheme fits the collection. The collection directory name should be self-explanatory.

#Examples

collections/anime-girls-with-programming-books/
  (preserves existing subdirectory structure)

collections/blinkies/
  anime-fan.gif
  linux-user.gif
  ...

collections/discord-emojis/
  catjam.gif
  pepe-coffee.png
  ...

collections/pfps/
  brand/
    krisyotam-dark.png
    krisyotam-light.png
  human/
    kris-2024-studio.jpg

collections/icebergs/
  anime-manga/
    anime-iceberg-v3.jpg
  conspiracy/
    conspiracy-iceberg.jpg
  movies/
    film-iceberg.jpg
  music/
    music-iceberg-2024.jpg
  ...

collections/bookstores/
  powell-books-portland.jpg
  shakespeare-and-company-paris.jpg
  ...

collections/setups/
  developers/
    ...
  writers/
    ...
  gamers/
    ...

collections/os/
  bsd/
    ...
  linux/
    ...
  plan9/
    ...

collections/wallpapers/
  ...

collections/art/
  ancient/                          (pre-500 CE)
    {artist}/
      {artist}-{year}-{title}.jpg
  medieval/                         (500-1400)
    {artist}/
      {artist}-{year}-{title}.jpg
  renaissance/                      (1400-1600)
    sandro-botticelli/
      sandro-botticelli-1485-the-birth-of-venus.jpg
    leonardo-da-vinci/
      leonardo-da-vinci-1503-mona-lisa.jpg
    michelangelo/
      michelangelo-1512-the-creation-of-adam.jpg
  baroque/                          (1600-1750)
    caravaggio/
      caravaggio-1601-the-conversion-of-saint-paul.jpg
    johannes-vermeer/
      johannes-vermeer-1665-girl-with-a-pearl-earring.jpg
    rembrandt/
      rembrandt-1642-the-night-watch.jpg
  romantic/                         (1750-1870)
    eugene-delacroix/
      eugene-delacroix-1830-liberty-leading-the-people.jpg
    caspar-david-friedrich/
      caspar-david-friedrich-1818-wanderer-above-the-sea-of-fog.jpg
  impressionist/                    (1860-1910)
    claude-monet/
      claude-monet-1872-impression-sunrise.jpg
    edgar-degas/
      edgar-degas-1874-the-dance-class.jpg
    mary-cassatt/
      mary-cassatt-1893-the-childs-bath.jpg
  modern/                           (1900-1970)
    pablo-picasso/
      pablo-picasso-1937-guernica.jpg
    edward-hopper/
      edward-hopper-1942-nighthawks.jpg
    frida-kahlo/
      frida-kahlo-1939-the-two-fridas.jpg
  contemporary/                     (1970-present)
    jean-michel-basquiat/
      jean-michel-basquiat-1982-untitled-skull.jpg
    david-hockney/
      david-hockney-1967-a-bigger-splash.jpg

collections/magazine/
  cahiers-du-cinema/
    cahiers-du-cinema-1951-04.jpg
    cahiers-du-cinema-1951-05.jpg
    ...
  juxtapoz/
    juxtapoz-2020-01.jpg
    juxtapoz-2020-03.jpg
    ...
  wired/
    wired-1993-01.jpg
    ...

collections/consoles/
  nintendo/
    nintendo64/
      nintendo64-1996-japan.jpg
      nintendo64-1996-north-america.jpg
    gamecube/
      gamecube-2001-japan.jpg
    switch/
      switch-2017-north-america.jpg
  sony/
    playstation/
      playstation-1994-japan.jpg
    playstation2/
      playstation2-2000-japan.jpg
  sega/
    genesis/
      genesis-1988-japan.jpg
    dreamcast/
      dreamcast-1998-japan.jpg
  microsoft/
    xbox/
      xbox-2001-north-america.jpg

collections/krisyotam/
  logos/
    krisyotam.png
    krisyotam-cursive.jpg
    laelcorp.png
    lael-trust.png
    lydia-press.png
  content/
    blog/
      {slug}/
        ...
    essays/
      {slug}/
        ...
    notes/
      {slug}/
        ...
    verse/
      {slug}/
        ...
    fiction/
      {slug}/
        ...
    papers/
      {slug}/
        ...
    sequences/
      {slug}/
        ...
    news/
      {slug}/
        ...
    ocs/
      {slug}/
        ...
  notebooks/
    srinivasa-ramanujan/
      ramanujan-notebook-page.jpg
    rms-titanic/
      titanic-bow-photo.jpg
  reference/
    pentagram.png
  research/
    a-discrete-iteration-related-to-pierce-expansions.png
  shop/
    juvenilia-collected-early-works.jpg

collections/symbols/
  fraternities/
    sigma-pi-phi.png
  paternities/
    ...
  secret-societies/
    ...
  movements/
    ...
  logos/
    ...
  ...

collections/logos/
  studios/
    ghibli.avif
    mappa.avif
    gainax.avif
    bones.avif
    a-1-pictures.png
    ...
  platforms/
    leetcode.png
    hackthebox.jpg
    tryhackme.webp
    exercism.png
    ...

collections/criterion-spines/
  001-grand-illusion.jpg
  002-seven-samurai.jpg
  ...

---

## Migration sources

Migration work happens in a cloned route, not the live route. Clone `/mnt/storage/cdn` to a new working tree such as `/mnt/storage/new-cdn` or `/mnt/storage/cdn-next`, rebuild the new structure there, and leave the live `/mnt/storage/cdn` untouched until all URLs and dependent databases are updated and validated.

Build one authoritative migration manifest before moving files. The manifest should include, for each file:

- `old_path`
- `new_path`
- `old_url`
- `new_url`
- content hash
- file size
- image dimensions when applicable
- duplicate group when applicable
- canonical status (`cover.jpg`, `portrait.jpg`, `profile.jpg`, or variant)
- references found in `krisyotam.com`, `lit/content`, and `photos.krisyotam.com`

Canonical file selection is deterministic: the current referenced image wins by default. If `krisyotam.com`, `lit/content`, or `photos.krisyotam.com` currently points at an image for an entity, that file becomes `cover.jpg`, `portrait.jpg`, or `profile.jpg`. Extra images become variants. If multiple referenced images compete for the same canonical slot, flag the conflict for manual review.

- `images/people/` -> `pics/people/` (flat files become directories)
- `photos/people/` -> `pics/people/` (deduplicate; current referenced canonical wins)
- `images/film/` -> `pics/media/film/` (flat files become directories)
- `images/anime/posters/` -> `pics/media/anime/`
- `images/manga/posters/` -> `pics/media/manga/`
- `photos/covers/{medium}/` -> `pics/media/{medium}/`
- `images/media/covers/` -> `pics/media/` (sort by medium)
- `images/media/favorites/` -> `pics/media/` (sort by medium)
- `images/media/movies/` -> `pics/media/film/`
- `images/media/posters/` -> `pics/media/` (sort by medium)
- `images/artists/` -> `pics/people/musicians/` (music artist photos)
- `photos/artists/` -> `pics/people/musicians/`
- `images/notebooks/` -> `pics/collections/krisyotam/notebooks/`
- `images/logos/krisyotam/` -> `pics/collections/krisyotam/logos/`
- `images/logos/anime/` -> `pics/collections/logos/studios/`
- `images/logos/company/` -> `pics/collections/logos/platforms/`
- `images/logos/manga/` -> delete (empty)
- `images/logos/fraternity/` -> `pics/collections/symbols/fraternities/`
- `images/icebergs/` -> `pics/collections/icebergs/`
- `images/pfps/` -> `pics/collections/pfps/`
- `photos/PFPs/` -> `pics/collections/pfps/`
- `images/blinkies/` -> `pics/collections/blinkies/`
- `images/discord-emojis/` -> `pics/collections/discord-emojis/`
- `images/anime-girls-with-programming-books/` -> `pics/collections/anime-girls-with-programming-books/`
- `images/bookstores/` -> `pics/collections/bookstores/`
- `images/reference/` -> `pics/collections/krisyotam/reference/`
- `images/research/` -> `pics/collections/krisyotam/research/`
- `images/shop/` -> `pics/collections/krisyotam/shop/`
- `images/content/` -> `pics/collections/krisyotam/content/`
- `images/mal/` -> `pics/platform/mal/`
- `photos/media/` -> `pics/media/` (sort by medium)
- `photos/covers/` -> `pics/media/` (sort by medium)
- `photos/icebergs/` -> `pics/collections/icebergs/`
- `photos/logos/krisyotam/` -> `pics/collections/krisyotam/logos/`
- `photos/logos/anime/` -> `pics/collections/logos/studios/`
- `photos/logos/company/` -> `pics/collections/logos/platforms/`
- `photos/logos/fraternity/` -> `pics/collections/symbols/fraternities/`
- `photos/characters/` -> `pics/people/characters/`
- `photos/bookstores/` -> `pics/collections/bookstores/`
- `photos/reference/` -> `pics/collections/krisyotam/reference/`
- `photos/research/` -> `pics/collections/krisyotam/research/`
- `photos/shop/` -> `pics/collections/krisyotam/shop/`
- `photos/content/` -> `pics/collections/krisyotam/content/`
- `photos/Misc/88x31/` -> `pics/collections/88x31/`
- `photos/Misc/blinkies/` -> `pics/collections/blinkies/`
- `photos/Misc/discord-emojis/` -> `pics/collections/discord-emojis/`
- `photos/Misc/mal/` -> `pics/platform/mal/`
- `images/playlist/` -> delete (scrapped)

---

## Full tree

pics/ | +-- people/ | +-- actors/ | | +-- winona-ryder/ | | | +-- portrait.jpg | | | +-- winona-ryder-1988-beetlejuice-press.jpg | | | +-- winona-ryder-2019-met-gala-versace.jpg | | +-- audrey-hepburn/ | | | +-- portrait.jpg | | | +-- audrey-hepburn-1961-breakfast-at-tiffanys-still.jpg | | +-- denzel-washington/ | | +-- portrait.jpg | +-- artists/ | | +-- frida-kahlo/ | | | +-- portrait.jpg | | +-- jean-michel-basquiat/ | | +-- portrait.jpg | +-- authors/ | | +-- fyodor-dostoevsky/ | | | +-- portrait.jpg | | +-- franz-kafka/ | | +-- portrait.jpg | +-- ballerinas/ | | +-- misty-copeland/ | | +-- portrait.jpg | +-- characters/ | | +-- lisa-rowe/ | | | +-- portrait.jpg | | +-- hannibal-lecter/ | | | +-- portrait.jpg | | +-- rei-ayanami/ | | | +-- portrait.jpg | | | +-- rei-ayanami-plugsuit.jpg | | +-- spike-spiegel/ | | +-- portrait.jpg | +-- designers/ | | +-- dieter-rams/ | | +-- portrait.jpg | +-- mathematicians/ | | +-- srinivasa-ramanujan/ | | | +-- portrait.jpg | | | +-- srinivasa-ramanujan-1919-passport-photo.jpg | | +-- emmy-noether/ | | +-- portrait.jpg | +-- musicians/ | | +-- miles-davis/ | | | +-- portrait.jpg | | | +-- miles-davis-1959-kind-of-blue-session.jpg | | +-- bjork/ | | +-- portrait.jpg | +-- philosophers/ | | +-- simone-weil/ | | | +-- portrait.jpg | | +-- ludwig-wittgenstein/ | | +-- portrait.jpg | +-- poets/ | +-- sylvia-plath/ | | +-- portrait.jpg | +-- rainer-maria-rilke/ | +-- portrait.jpg | +-- media/ | +-- film/ | | +-- pulp-fiction-1994-quentin-tarantino/ | | | +-- cover.jpg | | | +-- pulp-fiction-1994-quentin-tarantino-criterion.jpg | | | +-- pulp-fiction-1994-quentin-tarantino-vhs-original.jpg | | +-- eyes-without-a-face-1960-georges-franju/ | | | +-- cover.jpg | | | +-- eyes-without-a-face-1960-georges-franju-criterion.jpg | | +-- girl-interrupted-1999-james-mangold/ | | +-- cover.jpg | +-- anime/ | | +-- serial-experiments-lain/ | | +-- cover.jpg | | +-- serial-experiments-lain-funimation.jpg | +-- manga/ | | +-- berserk/ | | +-- cover.jpg | | +-- berserk-vol1-dark-horse.jpg | +-- tv/ | | +-- twin-peaks/ | | +-- cover.jpg | +-- books/ | | +-- 1880-fyodor-dostoevsky-the-brothers-karamazov/ | | | +-- cover.jpg | | +-- 1994-graham-knuth-patashnik-concrete-mathematics/ | | | +-- cover.jpg | | +-- 1603-william-shakespeare-hamlet/ | | +-- cover.jpg | +-- albums/ | | +-- miles-davis/ | | | +-- miles-davis-1959-kind-of-blue/ | | | +-- cover.jpg | | | +-- miles-davis-1959-kind-of-blue-mono-original.jpg | | +-- nas/ | | +-- nas-1994-illmatic/ | | +-- cover.jpg | +-- games/ | | +-- dark-souls/ | | +-- cover.jpg | +-- console/ | +-- ballet/ | +-- plays/ | +-- courses/ | +-- lectures/ | +-- platform/ | +-- mal/ | +-- kris/ | | +-- profile.jpg | +-- semaj/ | +-- profile.jpg | +-- kris/ | +-- setups/ | | +-- moirai-2025-quad-monitor.jpg | | +-- moirai-2026-cable-management.jpg | +-- food/ | | +-- katsu-curry-2025-homemade.jpg | +-- screenshots/ | | +-- dwm-rice-2025-pywal.png | +-- life/ | +-- baby/ | | +-- kris-baby-01.jpg | +-- kid/ | | +-- kris-kid-01.jpg | +-- teen/ | | +-- kris-teen-01.jpg | +-- 20s/ | +-- kris-20s-01.jpg | +-- collections/ | +-- anime-girls-with-programming-books/ | | +-- Haskell/ | | | +-- haskell-01.jpg | | +-- Rust/ | | | +-- rust-01.jpg | | +-- ... | +-- blinkies/ | | +-- anime-fan.gif | | +-- linux-user.gif | +-- discord-emojis/ | | +-- catjam.gif | | +-- pepe-coffee.png | +-- pfps/ | | +-- brand/ | | | +-- krisyotam-dark.png | | +-- human/ | | +-- kris-2024-studio.jpg | +-- icebergs/ | | +-- anime-manga/ | | | +-- anime-iceberg-v3.jpg | | +-- movies/ | | | +-- film-iceberg.jpg | | +-- music/ | | +-- conspiracy/ | | +-- ... | +-- bookstores/ | | +-- powell-books-portland.jpg | | +-- shakespeare-and-company-paris.jpg | +-- setups/ | | +-- developers/ | | +-- writers/ | | +-- gamers/ | +-- os/ | | +-- bsd/ | | +-- linux/ | | +-- plan9/ | +-- wallpapers/ | +-- art/ | | +-- ancient/ | | +-- medieval/ | | +-- renaissance/ | | | +-- sandro-botticelli/ | | | | +-- sandro-botticelli-1485-the-birth-of-venus.jpg | | | +-- leonardo-da-vinci/ | | | +-- leonardo-da-vinci-1503-mona-lisa.jpg | | +-- baroque/ | | | +-- johannes-vermeer/ | | | +-- johannes-vermeer-1665-girl-with-a-pearl-earring.jpg | | +-- romantic/ | | +-- impressionist/ | | | +-- claude-monet/ | | | +-- claude-monet-1872-impression-sunrise.jpg | | +-- modern/ | | | +-- edward-hopper/ | | | +-- edward-hopper-1942-nighthawks.jpg | | +-- contemporary/ | +-- 88x31/ | | +-- krisyotam.gif | | +-- archlinux.gif | +-- consoles/ | | +-- nintendo/ | | | +-- nintendo64/ | | | | +-- nintendo64-1996-japan.jpg | | | +-- gamecube/ | | +-- sony/ | | | +-- playstation/ | | | +-- playstation2/ | | +-- sega/ | | +-- microsoft/ | +-- magazine/ | | +-- cahiers-du-cinema/ | | | +-- cahiers-du-cinema-1951-04.jpg | | +-- juxtapoz/ | | | +-- juxtapoz-2020-01.jpg | | +-- wired/ | +-- symbols/ | | +-- fraternities/ | | | +-- sigma-pi-phi.png | | +-- paternities/ | | +-- secret-societies/ | | +-- movements/ | | +-- logos/ | | +-- alchemical/ | | | +-- alchemical-gold.png | | | +-- alchemical-antimony.png | | +-- religious/ | | | +-- pentagram.png | +-- logos/ | | +-- studios/ | | | +-- ghibli.avif | | | +-- mappa.avif | | | +-- gainax.avif | | +-- platforms/ | | | +-- leetcode.png | | | +-- hackthebox.jpg | | | +-- tryhackme.webp | +-- krisyotam/ | | +-- logos/ | | | +-- krisyotam.png | | | +-- krisyotam-cursive.jpg | | | +-- laelcorp.png | | | +-- lydia-press.png | | +-- content/ | | | +-- blog/ | | | | +-- some-post-slug/ | | | | +-- hero.jpg | | | +-- essays/ | | | | +-- some-essay-slug/ | | | | +-- figure-1.jpg | | | +-- sequences/ | | | | +-- some-sequence-slug/ | | | | +-- cover.jpg | | | +-- verse/ | | | +-- fiction/ | | | +-- papers/ | | | +-- notes/ | | | +-- news/ | | | +-- ocs/ | | +-- notebooks/ | | | +-- srinivasa-ramanujan/ | | | | +-- ramanujan-notebook-page.jpg | | | +-- rms-titanic/ | | | +-- titanic-bow-photo.jpg | | +-- reference/ | | | +-- pentagram.png | | +-- research/ | | | +-- a-discrete-iteration-related-to-pierce-expansions.png | | +-- shop/ | | +-- juvenilia-collected-early-works.jpg | +-- criterion-spines/ | +-- 001-grand-illusion.jpg | +-- 002-seven-samurai.jpg