Porting andrewsteinphd into TrinityMetrics
What moved, what is left, and what the old URLs need
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.
5. Old URLs and inbound links
Every old URL breaks unless something is done, and the ones that matter are printed in places that cannot be edited: papers, conference bios, slide footers, the Google Scholar profile, other people’s link lists.
Google Sites cannot redirect to an external site. There is no redirect feature and no server to configure. The workable substitute is to keep the old site published and replace each page’s body with a short pointer to the new address, page by page, matching the Section 2 inventory. A reader following a ten-year-old citation lands on a live page that tells them where to go.
Do not delete the old site. Not at the end of the migration, not a year later. It costs nothing to leave a Google Site published and it is the only thing standing between an old citation and a 404.
Update what can be updated. The Google Scholar profile’s homepage field, the GitHub profile, LinkedIn, ORCID, and any conference bio still within reach. This is a short list and it catches most live traffic.
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.pdfMeasured 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.