layout | title |
---|---|
page |
Recommendations |
I love recommending places to people. Here are some recommendations from my "short list". I have personally been to all of these and enjoyed them enough to specifically call them out. I receive no kickbacks; the establishment owners don't even know I have this list.
The food establishments tend to be vegetarian friendly, since I don't eat meat or fish.
- Beit Rima
- Garden Creamery
- Stable Cafe
- The Center
- Jane the Bakery
- United Dumplings
- Cinderella Bakery
- Green Apple Books
- Alamo Square Park
- Golden Gate Park
- Crissy Field
- Dolores Park
- Tartine Bakery
- Tartine Manufactory
- Dog Eared Books
- Omnivore Books on Food
- Crosstown Trail
- Noc Noc
- Montesacro Pinseria
- Le Cafe du Soleil
- Oleana
- Maria's Taqueria
- Phinista
- Oasis Brazilian Restaurant
- Bukowski Tavern
- The Bebop
- Farmers Horse Coffee
- The Helmand
- Walking City Trail
- Joe's Pizza
- Tatte (any)
- Sugar & Spice
- Toro
- El Platanero
- Lê Phin
- Overstory
- Pi Bakerie
- Joe's Pizza (any)
- Zabar's
- Bike along the Hudson river
- Central Park
NOTE: This page provides some filtering using JS. It's perfectly usable without.
<style>
/* https://stackoverflow.com/a/24640763/569183 */
li[data-location]:after {
content: attr(data-location);
display: inline-block;
color: #A9B0BB;
float: right;
font-style: italic;
}
</style>
<script>
const allTags = new Set();
for (const div of document.querySelectorAll("#recs div")) {
for (const tag of div.classList) {
allTags.add(tag);
}
for (const entry of div.querySelectorAll("li")) {
for (const tag of entry.classList) {
allTags.add(tag);
}
for (const tag of div.classList) {
entry.classList.add(tag);
}
const plusCode = entry.getAttribute("data-location");
if (plusCode) {
const locationLink = document.createElement("a");
locationLink.setAttribute("href", `https://plus.codes/${plusCode}`);
locationLink.append(document.createTextNode("(location)"));
entry.append(document.createTextNode("\u00A0"));
entry.append(locationLink);
}
}
}
const filters = document.querySelector("#filters");
const reset = document.createElement("a");
reset.setAttribute("href", "#");
reset.append(document.createTextNode("reset"));
reset.setAttribute("style", "font-weight: bold;");
reset.onclick = () => {
document.querySelectorAll('li, div').forEach(elt => elt.style='')
};
filters.append(reset);
for (const tag of [...allTags].sort()) {
const a = document.createElement("a");
a.setAttribute("href", "#");
a.append(document.createTextNode(tag));
a.onclick = () => {
document.querySelectorAll("#recs li").forEach(elt => {
if (!elt.classList.contains(tag)) {
elt.style = "display: none;";
}
});
document.querySelectorAll("#recs div").forEach(elt => {
const numVisibleItems = [...elt.querySelectorAll("li")].map(li => li.offsetParent !== null).reduce((a, b) => a+b, 0);
if (numVisibleItems === 0) {
elt.style = "display: none";
}
});
}
filters.append(a);
}
</script>