Porting andrewsteinphd into TrinityMetrics

What moved, what is left, and what the old URLs need

site
migration
working document
The record of merging the Google Sites personal site into this site: where every old page and file landed, what is still unbuilt, and how the build exports the Google Docs.
Published

September 6, 2026

Done 2026-09-06. The content has moved, trinitymetrics.com serves the site, and the old pages point at it. Every row of the inventory in Section 2 is resolved and all seven acceptance checks passed on 2026-09-02. Section 3 records how the domain and the old URLs closed, and the one page dropped along the way.

Cut from 803 lines to this on 2026-09-02, at Andy’s instruction. The naming and placement arguments, the Google Takeout export route, the navigation design and the phase plan came out: each had either been executed or been overtaken by how the work was actually done. What survives is the inventory, the acceptance result, the old-URL problem, and the file and export mechanics that the build still depends on.

1. Goal and outcome

One site, at one URL, holding both what was on sites.google.com/site/andrewsteinphd and what was on TrinityMetrics, with no content dropped without a recorded decision to drop it.

The merged site keeps the name TrinityMetrics and the personal material became a section rather than the site’s title. The subject is ordered into three legs: pharmacometrics, teaching and education, GenAI. Both decisions are now visible on the site itself, so the argument for them has been removed from here.

Eleven pages and nineteen linked files came across between 2026-09-01 and 2026-09-02. No file was hosted on the old site: every one of the nineteen already lived in iamstein/Publications or on the xgx site, so only the eleven page URLs need pointers.

2. Content inventory

One row per page and per file on the old site, produced by crawling the live site from a local machine on 2026-09-01. Google Takeout no longer offers Sites as a product, and the crawl replaced the export route this document originally specified.

Disposition codes:

  • PORT — comes across substantially as it is.
  • MERGE — content folds into an existing or new page with other content.
  • LINK — not ported; the merged site links to the canonical copy elsewhere.
  • DROP — deliberately not carried over. Requires a reason in the row.
# Old URL Title Kind Files on it Disposition Lands at Reason / note
1 /home Andrew M Stein page none hosted; 2 external MERGE about.qmd Bio opens About per Section 6. Affiliation confirmed current (Q3), so it ports verbatim. Contact, Scholar and Medium links go to the bottom of About per Section 4. The ukulele site stays an outbound link.
2 /now Now page none PORT ✅ now.qmd Done 2026-09-01. A Derek Sivers “now page” (Q2), last updated 2026-03-27. Sits under the About menu, which now has four items.
3 /effective-learning Effective-Learning page none hosted; 1 Google Doc PORT ✅ guides/effective-learning.qmd Done 2026-09-02. Headings and bullets restored by hand, the page’s own table of contents replaced by Quarto’s, and Google anchor artifacts removed.
4 /pmx-tools PMX-Tools page none hosted; 5 external PORT ✅ pmx-tools.qmd Done 2026-09-02. Andy: it is not a guide, it is its own top-level page, and it keeps the R-package links rather than handing them to Projects.
5 /career-advice Career-Advice page none hosted; 1 external PORT ✅ guides/career-advice.qmd Done 2026-09-02, with row 11 merged in as its last section. Andy will revise the prose.
6 /software Software page none PORT ✅ software.qmd Done 2026-09-02. Andy: keep the page, but not prominent. xGx dropped from it, being an R-package row. AIRE, FIRE and BEAMS are MATLAB from the thesis and postdoc, so the page sits under the About menu rather than in Projects. Their Drive links need a Google sign-in, so Section 8’s export cannot mirror them; Andy 2026-09-02: pointing at Drive is fine for the old software.
7 /cv CV page none hosted; Google Doc LINK navbar CV, out to Google Docs Section 4 and Section 10: an external navbar link, no page of its own. Needs CV_DOC_ID for the build-time export in Section 8.
8 /talks Talks page none hosted; 12 external PORT ✅ talks.qmd Done 2026-09-02. Written as a plain page rather than the talks.yml listing Section 4 proposed: the talks are nested three deep and each carries two or three links, which a listing card cannot show.
9 /recommended-reading Recommended Resources page none MERGE ✅ about.qmd Ported 2026-09-02 as its own Guides page, then merged into about.qmd on 2026-09-03 at Andy’s instruction: the list is personal taste rather than something that helps another reader, so it reads better as part of the person than as a guide. Its “Oh Shit Git” link pointed at a Kotaku article on the old site and was repaired to ohshitgit.com. The page originally proposed as the merge target, guides/reading-list.qmd, was deleted the same day it was ported: it held one stub entry with its title, authors and question unfilled.
10 /equations Equations page none hosted; Google Doc DROP Orphan, not in the navbar, and its body is one Google Doc link. Andy: not wanted as a page; the material belongs in the pharmacometrics guides. Doc 1t9omSVTz4lf2RT6GF3dTYTALM-Yy0tCk5UVIyxQlWZQ, recorded so the link survives the drop. The Doc is now linked from the Other tools section of pmx-tools.qmd as Grams to Molar Equations, with a PDF exported by the build. The page stays dropped.
11 /pmx-career-links PMX-Career-Links page none MERGE ✅ guides/career-advice.qmd Done 2026-09-02, as that page’s last section. Google redirect wrappers unwrapped to the real URLs.
12 opensource.nibr.com/xgx/Resources/Uncertainty_Assessment_Pedigree_Table.pdf Uncertainty Pedigree Table link LINK On /home. Canonical on the xgx site; Section 6 keeps xgx linked, not absorbed.
13 github.com/Novartis/xgx/.../ContextOfUse_Table_1page.pdf Context of Use Table link LINK On /home. Canonical in the Novartis xgx repository.
14 github.com/Novartis/xgx/.../Uncertainty_Assessment_Presentation.pdf Managing Uncertainty presentation link LINK On /pmx-tools.
15 opensource.nibr.com/xgx/Resources/Graphics_Principles_Cheat_Sheet_v1.1.pdf Graphics Principles Cheat Sheet link LINK On /pmx-tools.
16 opensource.nibr.com/xgx/Resources/PKPD_Exploratory_Graphics_(xGx)_Cheat_Sheet.pdf xGx Cheat Sheet link LINK On /pmx-tools.
17 github.com/Novartis/xgx/.../Presentation_Checklist_v2.03.pdf Presentation Checklist link LINK On /pmx-tools.
18 opensource.nibr.com/xgx/Resources/Presentation_Checklist_v2.03.pdf Presentation Checklist link LINK On /career-advice. The same document as row 17 at a second host; link one of them and pick which.
19 .../Presentations/2019-08-01_Training_FundamentalPK_2019.pptx Intro to Fundamental PK Concepts file PORT ✅ files/2019-08-01-fundamental-pk.pdf In iamstein/Publications. Convert to PDF per Section 8; do not commit the .pptx beside it.
20 .../Presentations/2019-08-01_FundamentalPD_AndyStein_Hackathon_2019.pptx Intro to Fundamental PD Concepts file PORT ✅ files/2019-08-01-fundamental-pd.pdf As row 19.
21 .../Presentations/2021-10-12_Stein_Causal_Diagram_Hackathon.pptx Causal Diagrams for Exposure-Response file PORT ✅ files/2021-10-12-causal-diagrams.pdf As row 19.
22 .../Presentations/2020-03-24_Stein_QSP_Uncertainty_Meetup.pdf Uncertainty and Predictive Accuracy, CML file PORT ✅ files/2020-03-24-qsp-uncertainty.pdf Already a PDF. Has a YouTube recording linked beside it on /talks.
23 .../Presentations/2017-10-18_RaueStein_Identifiability_LLW_LLP_ACoP8_v2.pptx.pdf Model Convergence and Identifiability file PORT ✅ files/2017-10-18-identifiability.pdf Already a PDF. ACoP 2018 on the old page, 2017 in the filename; check the year.
24 .../Presentations/2021-11-10_Stein_ACoP2021_CART_Review_Presentation.pptx CAR-T Cellular Kinetic-PD Review file PORT ✅ files/2021-11-10-cart-review.pdf As row 19.
25 .../Presentations/2019-10-22_Stein_CART_Modeling_ACoP.pdf Cellular Kinetics of Kymriah file PORT ✅ files/2019-10-22-kymriah.pdf Already a PDF.
26 .../Presentations/2013-05-13_ACoP_TumorModeling_AndyStein_v8.pptx Longitudinal Solid Tumor Data file PORT ✅ files/2013-05-13-solid-tumor.pdf As row 19.
27 .../Presentations/2013-06-20-PhUSE_AndyStein.pptx PhUSE 2013 file PORT ✅ files/2013-06-20-phuse.pdf As row 19. Title on the old page to confirm.
28 .../Presentations/2009-12-01-ASH09_StemCells.ppt ASH 2009, stem cells file PORT ✅ files/2009-12-01-ash-stem-cells.pdf Oldest deck, and a .ppt rather than .pptx.
29 .../Presentations/2016-07-13_Stein_SIAM_LS_Presentation.pptx SIAM Life Sciences 2016 file PORT ✅ files/2016-07-13-siam-ls.pdf As row 19.
30 .../Presentations/2017-10-17_Stein_ACoP_Math_LumpedParameters_v2.pptx Lumped Parameters, ACoP 2017 file PORT ✅ files/2017-10-17-lumped-parameters.pdf As row 19.

Row count: 30. Eighteen PORT, three MERGE, eight LINK, one DROP, checked by Section 4.

Rows 19 to 30 are marked PORT because a deck ports as a PDF, which a reader can open on a phone. The sources stay in iamstein/Publications.

3. The domain and the old URLs

Both are done, and the publications page specified here was dropped.

The domain is wired to GitHub Pages. Done 2026-09-06. trinitymetrics.com resolves to 185.199.108.153 through 185.199.111.153 and www is a CNAME to iamstein.github.io. The registrar-level forward that used to answer with a 301 is deleted, along with the parked A records it left behind in the GoDaddy zone. GitHub holds the custom domain in the repository’s Pages settings with Enforce HTTPS on, and its certificate covers both names to 2026-12-05. site-url became https://trinitymetrics.com the same day, so the sitemap carries the domain.

No CNAME file was added, and none is needed. This site publishes through a custom Actions workflow, which takes the domain from the Pages setting; the CNAME file this document originally specified applies to branch-based publishing. GoDaddy’s editor accepted the A records some minutes before its nameservers served them, so the records read as unpublished for a while after they were correct.

The old pages point at the new address. Done 2026-09-06. Ten of the eleven carry a line pointing at trinitymetrics.com. /cv keeps its original body by decision: it links to the same Google Doc that the new site links to, so a reader who lands there is already where they were being sent. Section 5 says why the old site should stay published.

No publications page. Dropped 2026-09-06, at Andy’s instruction. The design was a publications.yml plus a Quarto listing matching projects.yml, each entry carrying title, authors, journal, year, DOI and a link, with a .bib exported from Google Scholar committed beside it as a download. The CV, the Projects page and About cover the same ground, so the page is not being built. The paper and presentation files stay in iamstein/Publications.

4. Acceptance checks, and the result

Run on 2026-09-02. All seven pass.

# Check Result
1 Every inventory row has a disposition, and every DROP row a reason ✅ 30 rows, none missing either
2 Dispositions sum to the recorded row count ✅ 19 + 2 + 8 + 1 = 30
3 A link check over the rendered docs/ finds no broken internal link ✅ 808 internal links, 0 broken
4 No page links to sites.google.com/site/andrewsteinphd as a live destination ✅ hits only inside projects/site-integration/, where the address is the subject
5 Every file referenced from a ported page exists and is covered by resources: in _quarto.yml ✅ none missing
6 No page on the old site is left half-migrated ✅ all eleven serve their original content
7 The site renders and publishes from publish.yml with no manual step ✅ three consecutive green runs

Check 6 passes before and after the work it is supposed to measure. A page showing its original content satisfies it, and so does a page replaced by a pointer. Re-run this list once the pointers go up, and replace check 6 with one that requires every old page to carry the new address. Nothing here tests Section 3 either, so these seven checks can pass while the project is unfinished.

The link check was a script over docs/; lychee and linkchecker are not installed on this machine.

6. Files, decks and the Google Docs export

Files from the old site live in files/, listed under resources: in _quarto.yml so Quarto copies them into docs/ unrendered. The reference documents the Resources page links stay in references/, which is listed there too.

Naming is lower case, hyphens, no spaces, and a date prefix on anything with a date attached: 2019-acop-poster.pdf, not ACoP Poster (final) v2.pdf.

PDFs are the ported form for slides. A PowerPoint file on a static site is a download rather than a page, and a reader on a phone cannot open it. Do not commit the .pptx beside the .pdf: it doubles the storage, and git keeps every version for the life of the repository.

Size limits and compression

The binding limit is the 1 GB published Pages site rather than the 100 MB per-file limit. A deck exported to PDF is nowhere near 100 MB; what could reach 1 GB is the sum. Compress before the first commit, because a file committed uncompressed and recompressed later leaves both copies in the history permanently.

gs -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -dCompatibilityLevel=1.4 \
   -dNOPAUSE -dQUIET -dBATCH -sOutputFile=out.pdf in.pdf

Measured on references/Uncertainty_Assessment_Presentation.pdf, the 105-page deck already in this repository: 14.8 MB at source, 2.5 MB at /ebook, 1.5 MB at /screen, page count unchanged in both. On the most image-heavy page, /ebook is indistinguishable from the source and /screen visibly softens the small annotation labels. Use /ebook. At that ratio the 1 GB ceiling arrives at roughly 400 decks.

The build exports the Google Docs

_scripts/export-google-docs.sh fetches nine Docs as PDFs into docs/files/ after quarto render, and publish.yml calls it in one line. Readers on a corporate network cannot open Google Docs, so every Doc the site links to is published here as a PDF and linked beside the Google original. Nothing is committed: the PDFs are written during the build and travel in the Pages artifact, so they are never stale and never enter git history.

A Doc exports over plain HTTP while it is shared as anyone with the link, Viewer, at https://docs.google.com/document/d/DOC_ID/export?format=pdf. Slides use /presentation/d/DOC_ID/export/pdf.

curl --fail does not catch a broken share setting. A Doc that is not link-shared returns 200 and serves Google’s sign-in page. Measured 2026-09-02 on the three Drive files behind software.qmd: each returned about 907 KB of text/html titled “Google Drive: Sign-in”. The script checks that the first four bytes of what it downloaded are %PDF, and deletes the file and fails the build when they are not. Those three links stay pointing at Drive. Andy 2026-09-02: that is fine for the old software.

The export endpoint is not part of a documented API and Google could change it. The build failing loudly is the detection mechanism; the fallback is to commit a PDF by hand until it is fixed.

Back to top