This app was created by first converting Friends of Saxonville archived newsletter PDFs to text files. The archive starts in 1998. Important: There can sometimes be errors in those conversions! And: This not an official project maintained by Friends of Saxonville!
Search is not case sensitive. More search tips in the FAQ. Click the triangle at the left of a newsletter to see the converted plain text of that issue.
How can I search the full text of the newsletters?
You can do a plain text search in the opening screen (first tab), which will do an exact match (case insensitive). For example, Brazilian Family Bakery
. There is also limited Boolean searching: You can do Pinefield AND hardware
as well as Cochituate OR Aqueduct
. However, you can't mix 'AND' and 'OR' in the same search.
The search results are sorted based on how many matches were found (there will be a Matches
column at the far right of the results table). The search results table can be sorted by column, so you can click the Year column to sort by Year instead of number of matches. Your first click will sort by ascending values; the second click sorts by descending values.
Click the triangle next to the newsletter name and you'll see the full text of the newsletter with your search terms highlighted. Or, you can click on the URL to see the original newsletter PDF.
If you are familiar with regular expression syntax, that works as well.
Where does the data come from?
I downloaded all the newsletters from the Friends of Saxonville archived newsletter PDFs and then converted them into a plain text format called markdown using a very cool application called LlamaParse.
Who made this app?
Technically Sharon Machlis, but in large part this was coded with generative AI 😅 using Google's Gemini 2.5 pro large language model with help from Posit's Shiny Assistant and occasionally Claude Sonnet 3.7 and various ChatGPT models and custom GPTs. It is not an official Friends of Saxonville app! This is one of Sharon's hobby coding projects.
How does the chatbot work?
It first analyzes your question and 'translates' it into a series of numbers called embeddings, and then checks the documents to find excerpts with embeddings that are most similar to your question. It also tries to use some traditional search similarity techniques, too. Then, your question and those releative text chunk are sent to a Large Language Model (same technology as behind ChatGPT) to generate an answer.
Why does the chatbot sometimes give bad answers?
If the AI had direct access to all the newsletter text, the answers would probably be better. But that's too much for it to process at once. Instead, there's some math going on trying to pull portions of the most relevant newsletters, and the current brute force way of finding those excerpts is pretty basic. (There are a lot more sophisticated things you can do if you code in Python, but that's not my favorite computer language). It's especially bad at time-related queries right now, I hope to look into that.
However, this can still be a useful tool for pulling up newsletters related to a topic.
What software does it use?
I coded this app in the R programming language. The app uses the R Shiny Web framework and a lot of cool R packages including data.table and reactable for the full-text search. For the chatbot, I used shinychat, ragnar, and ellmer for a future chatbot.