# dustinedwards.info Dustin Edwards, Professor and Virologist, Department of Biological Sciences, Tarleton State University. Research in retroviruses and bacteriophages; also builds software on Cloudflare. ## Research The hub is /research. Areas: /research/retroviruses (HTLV-1, REV and LPDV), /research/retroviruses/human, /research/retroviruses/avian, /research/bacteriophages, /research/science-education. Collections: /research/publications, /research/phages, /research/protocols. Lab calculators: /research/tools (titer, serial dilution, webbed plate, MOI, efficiency of plating and lysate volume, each stating its formula and a worked example). A paper is /research/publications//, where the slug folds every run of punctuation in the DOI to a hyphen. 10.1128/mra.00888-24 is /research/publications/10-1128-mra-00888-24/. Its markdown twin is /research/publications/.md. A protocol is /research/protocols/, for example /research/protocols/phage-isolation. Its markdown twin is the same path plus .md. ## Teaching The hub is /teaching. Courses and guides: /teaching/phage-discovery, /teaching/virus-isolation, /teaching/virus-isolation/faq, /teaching/phage-bioinformatics, /teaching/central-dogma, /teaching/study-skills. The student roster is /teaching/phage-discovery#roster. /phage-discovery 301s there. ## Software The hub is /software. A page is /software/{name}. /projects 301s to /software. /software /software/foxhound /software/foxing /software/foxing-edu /software/germomics /software/capsid /software/enarratio /software/carrel Products are Foxhound (https://foxhoundapp.com, replaces Recova), Foxing (https://foxing.app), and Foxing Edu, a separate product built on Foxing and sold to schools. No public address for Foxing Edu is recorded here. Sites are Germomics (https://germomics.com) and TXASM (https://txasm.org), which has no page on this site. Infrastructure is Capsid; Enarratio, an open-source chart library in early alpha (https://github.com/DrDustinEdwards/enarratio, gallery https://enarratio.dustinedwards.info); Carrel, the private writing hub this site's articles are written in, which has a page but no public app address; and this site at /colophon. Lab tools are /research/tools. Each of the Capsid, Enarratio and Carrel pages opens with a dictionary entry for its name. ## Writing An article is /writing/. Its markdown twin is /writing/.md. Requesting the article URL with Accept: text/markdown returns the same markdown. The feed is /writing/rss.xml and /writing/feed.json. Every published post in one file is /llms-full.txt. ## About /about, /contact, /colophon and /privacy. The CV is /cv, with its markdown twin at /cv.md; the page links the current CV as a PDF. /cv ## Markdown twins Every research, teaching and software page, each lab calculator and the CV has a markdown twin at its path plus .md, for example /research.md, /research/tools/titer.md, /software/enarratio.md and /cv.md. The HTML head links it with rel="alternate" type="text/markdown". The twin's Link header names the HTML page as canonical. Article URLs also answer Accept: text/markdown. Paper twins and article twins use the patterns above. Twins are not in the sitemap. ## About the site The sections above are the map. The rest of this file is how search, papers and feeds work. ## Colophon /colophon describes how this site is built: every Cloudflare binding with the measurement that put it there, the schema migrations, the build gates, the runtime dependencies, and what was deliberately not adopted and why. The stack half is generated from the repository's own configuration and reconciled against it by a build gate rather than maintained by hand. ## How it looks The look is a fixed direction rather than a theme that drifts per page. It is Swiss editorial on warm limestone paper: ink text, 1px hairlines as the only structure, and one accent colour used as ink for links and focus rather than as a fill. Titles and prose are a serif, and dates, identifiers and counts are a monospace, so the machine-readable values on a page are the ones set in mono. The rule is ruled rows rather than cards, no filled public control, no capsule and no tracked capitals. The post page and the home page are rebuilt under that rule; the index pages still carry the older vocabulary and are being brought to it, so a page that contradicts this paragraph is behind, not an exception. The theme is an attribute and follows prefers-color-scheme when none is set. The half of that which never degrades is the machine half. Every public page renders its content, data, citations, dates and structure in server HTML, complete and correct without script, and keeps its markdown twin, its entry in this file, its JSON-LD and its microformats. No public route hydrates and no framework runs on a reading page. The script that does load is hand-written and adds only what a person would want, such as zooming a figure or filtering without a reload, and a filter writes the query string, so a URL you are handed shows you what it showed whoever sent it. ## Writing, in detail Posts are listed at /writing and can be filtered by tag at /writing?tag=. Every post has a plain markdown twin at /writing/.md, which is the source the page was rendered from. Requesting /writing/ with an Accept: text/markdown header returns the same markdown. The feed is at /writing/rss.xml and /writing/feed.json. ## Publications Peer-reviewed work is listed at /research/publications, filterable by topic at /research/publications?topic= and searchable at /research/publications?q=. Every filter and every search is an ordinary GET, so each view is a real URL. Each paper has its own page at /research/publications//, where the slug is the DOI with every run of punctuation folded to a hyphen: 10.1128/mra.00888-24 becomes /research/publications/10-1128-mra-00888-24/. The page carries the title, the full author list, the abstract in visible text, the venue, the DOI, PMC and preprint links where they exist, open-access status, and a citation count from OpenAlex labelled with the date it was read. Where the licence permits and the file is hosted here, the PDF sits beside the page at /research/publications//.pdf. Citations export as files rather than as a copy button: /research/publications.bib BibTeX, the whole list /research/publications.ris RIS, the whole list /research/publications.json CSL JSON, every record including the three conference abstracts the page does not show /research/publications/.bib one paper /research/publications/.ris one paper The bibliographic data is from Crossref and DataCite, with abstracts backfilled from Europe PMC where a publisher deposited none. Counts are OpenAlex. Every paper also has a markdown twin at /research/publications/.md. It carries the record as YAML frontmatter, the abstract, and, where the PDF is hosted here, the machine-extracted text of that PDF. That is the form to read if you are a program: the page says those things across HTML, meta tags and a JSON-LD block, and the twin says them once. The twins are kept out of the search index, like this file, so the paper's own page is the one that gets indexed. The full set, which is every paper on the index plus the conference abstracts the index does not show: /research/publications/10-1002-9780470025079-chap06-pub2.md /research/publications/10-1080-07448481-2025-2472184.md /research/publications/10-1128-jmbe-00313-25.md /research/publications/10-1128-jvi-00356-08.md /research/publications/10-1128-jvi-01788-13.md /research/publications/10-1128-jvi-02150-14.md /research/publications/10-1128-jvi-03444-13.md /research/publications/10-1128-mra-00173-22.md /research/publications/10-1128-mra-00174-22.md /research/publications/10-1128-mra-00556-21.md /research/publications/10-1128-mra-00558-21.md /research/publications/10-1128-mra-00778-23.md /research/publications/10-1128-mra-00783-22.md /research/publications/10-1128-mra-00888-24.md /research/publications/10-1128-mra-01039-19.md /research/publications/10-1128-mra-01077-21.md /research/publications/10-1128-mra-01079-21.md /research/publications/10-1128-mra-01242-18.md /research/publications/10-1128-mra-01594-18.md /research/publications/10-1186-1742-4690-11-s1-o13.md /research/publications/10-1186-1742-4690-11-s1-p122.md /research/publications/10-1186-1742-4690-8-s1-a124.md /research/publications/10-1187-cbe-21-03-0057.md /research/publications/10-1371-journal-pone-0042123.md /research/publications/10-1371-journal-ppat-1004454.md /research/publications/10-25334-8cxe-6883.md /research/publications/10-25334-b5bs-f125.md /research/publications/10-3389-feduc-2023-1279921.md /research/publications/10-3389-feduc-2024-1442306.md /research/publications/10-3389-feduc-2024-1442318.md /research/publications/10-3390-ijerph22071139.md /research/publications/10-3390-v3060861.md /research/publications/10-3390-v3101815.md /research/publications/10-7589-2018-08-187.md /research/publications/10-7589-2019-04-088.md /research/publications/10-7589-jwd-d-22-00023.md /research/publications.json carries the bibliographic record for all of them in CSL JSON, if one fetch is better than one per paper. ## Research and teaching pages The research programme, the lab protocols and the courses are ordinary pages, written in markdown and rendered to HTML when the site is built. Each has a markdown twin at the same path plus .md, linked from the page head. Every one of them: /research /research/retroviruses /research/retroviruses/human /research/retroviruses/avian /research/bacteriophages /research/science-education /research/phages /research/protocols /research/protocols/phage-isolation /research/protocols/phage-dna-extraction /research/protocols/coi-primers /research/protocols/rev-lpdv-primers /research/protocols/pan-avian-gapdh /research/tools /research/tools/titer /research/tools/dilution /research/tools/webbed-plate /research/tools/moi /research/tools/eop /research/tools/lysate-volume /teaching /teaching/phage-discovery /teaching/virus-isolation /teaching/virus-isolation/faq /teaching/phage-bioinformatics /teaching/central-dogma /teaching/study-skills The other pages are /, /about, /writing, /software, /colophon, /contact and /privacy. /sitemap.xml lists every HTML page on the site and nothing else. ## Search /search?q= searches the whole site and returns a normal HTML page. The same URL returns JSON when requested with Accept: application/json. It is the same query against the same index, not a separate API, and the response varies on Accept. Parameters: q, type, tag, year, page. Operators inside q: tag:, type:, "quoted phrases", and a bare four-digit year, which is read as a date filter rather than as text. Results are section-grained: a hit carries the heading it was found under and a url with that anchor, so a citation can point at the passage rather than the page. Each result reports what it matched on (title, tag, body, or filter, the last meaning the query was a bare year or tag with no text to match). For programmatic use prefer the JSON form. It is keyword search over an FTS5 index: deterministic, the same query returning the same results, with no model in the path and no per-request cost. ## Search over MCP The same corpus is exposed as a Model Context Protocol endpoint, so an agent can search this site as a tool without scraping it: https://2795d719-a4de-4558-9322-8fced66a48e6.search.ai.cloudflare.com/mcp It needs no authentication and provides one tool, "search". Results carry the same section-grained keys the rest of the site uses: blog/.md is a whole post and blog/__.md is one heading within it, which maps back to /writing/#. This is semantic retrieval and it is not the same thing as the JSON endpoint above. It finds passages that answer a question phrased in a sentence, and it misses short exact tokens that the keyword index finds immediately. Neither covers the other, so for a known term use the JSON search and for a question use this. Three ways in, then: a URL for people, JSON for programs, MCP for agents. ## Full text /llms-full.txt carries every published post in markdown in one document. ## Contact https://dustinedwards.info