chore: format
cb93851f
8 file(s) · +683 −641
| 7 | 7 | import destruction from "@/assets/destruction.jpg"; |
|
| 8 | 8 | ||
| 9 | 9 | const paintings = [ |
|
| 10 | - | { |
|
| 11 | - | src: savage, |
|
| 12 | - | title: "The Savage State", |
|
| 13 | - | year: "1834", |
|
| 14 | - | description: |
|
| 15 | - | "The first in Thomas Cole's Course of Empire. Dawn breaks over a wilderness as nomadic hunters chase a wounded deer and storm clouds wreathe the mountain. Nature is supreme; man clings to its edges.", |
|
| 16 | - | link: "https://explorethomascole.org/project/the-savage-state/" |
|
| 17 | - | }, |
|
| 18 | - | { |
|
| 19 | - | src: pastoral, |
|
| 20 | - | title: "The Pastoral or Arcadian State", |
|
| 21 | - | year: "1834", |
|
| 22 | - | description: |
|
| 23 | - | "The second in Thomas Cole's Course of Empire. Morning light, cleared fields, a Stonehenge-like temple, an old man tracing geometry in the dirt while a boy sketches a figure on stone. Civilization stirs; agriculture, science, art, all still close to the earth.", |
|
| 24 | - | link: "https://explorethomascole.org/project/the-arcadian-or-pastoral-state/" |
|
| 25 | - | }, |
|
| 26 | - | { |
|
| 27 | - | src: consumation, |
|
| 28 | - | title: "The Consummation of Empire", |
|
| 29 | - | year: "1836", |
|
| 30 | - | description: |
|
| 31 | - | "The central panel of Thomas Cole's Course of Empire. High noon over a marble city. A triumphant ruler crosses the bridge in an elephant-drawn car, temples crowd the bay, the harbor brims with ships. Splendor so total it can only precede collapse.", |
|
| 32 | - | link: "https://explorethomascole.org/project/the-consummation-of-empire/" |
|
| 33 | - | }, |
|
| 34 | - | { |
|
| 35 | - | src: destruction, |
|
| 36 | - | title: "Destruction", |
|
| 37 | - | year: "1836", |
|
| 38 | - | description: |
|
| 39 | - | "The fourth panel of Thomas Cole's Course of Empire. Storm and sack. Invaders pour through the gates, the temple porch becomes a catapult, ships burn in the harbor, a headless warrior presides over the slaughter as the sky turns to fire.", |
|
| 40 | - | link: "https://explorethomascole.org/project/destruction/" |
|
| 41 | - | }, |
|
| 42 | - | { |
|
| 43 | - | src: desolation, |
|
| 44 | - | title: "Desolation", |
|
| 45 | - | year: "1836", |
|
| 46 | - | description: |
|
| 47 | - | "The final panel of Thomas Cole's Course of Empire. Sunset and moonrise over silent ruins. Vines climb a lone column, a bird nests where a temple stood, deer roam the broken friezes. No human figures remain. Nature outlasts everything man builds.", |
|
| 48 | - | link: "https://explorethomascole.org/project/desolation/" |
|
| 49 | - | }, |
|
| 10 | + | { |
|
| 11 | + | src: savage, |
|
| 12 | + | title: "The Savage State", |
|
| 13 | + | year: "1834", |
|
| 14 | + | description: |
|
| 15 | + | "The first in Thomas Cole's Course of Empire. Dawn breaks over a wilderness as nomadic hunters chase a wounded deer and storm clouds wreathe the mountain. Nature is supreme; man clings to its edges.", |
|
| 16 | + | link: "https://explorethomascole.org/project/the-savage-state/", |
|
| 17 | + | }, |
|
| 18 | + | { |
|
| 19 | + | src: pastoral, |
|
| 20 | + | title: "The Pastoral or Arcadian State", |
|
| 21 | + | year: "1834", |
|
| 22 | + | description: |
|
| 23 | + | "The second in Thomas Cole's Course of Empire. Morning light, cleared fields, a Stonehenge-like temple, an old man tracing geometry in the dirt while a boy sketches a figure on stone. Civilization stirs; agriculture, science, art, all still close to the earth.", |
|
| 24 | + | link: "https://explorethomascole.org/project/the-arcadian-or-pastoral-state/", |
|
| 25 | + | }, |
|
| 26 | + | { |
|
| 27 | + | src: consumation, |
|
| 28 | + | title: "The Consummation of Empire", |
|
| 29 | + | year: "1836", |
|
| 30 | + | description: |
|
| 31 | + | "The central panel of Thomas Cole's Course of Empire. High noon over a marble city. A triumphant ruler crosses the bridge in an elephant-drawn car, temples crowd the bay, the harbor brims with ships. Splendor so total it can only precede collapse.", |
|
| 32 | + | link: "https://explorethomascole.org/project/the-consummation-of-empire/", |
|
| 33 | + | }, |
|
| 34 | + | { |
|
| 35 | + | src: destruction, |
|
| 36 | + | title: "Destruction", |
|
| 37 | + | year: "1836", |
|
| 38 | + | description: |
|
| 39 | + | "The fourth panel of Thomas Cole's Course of Empire. Storm and sack. Invaders pour through the gates, the temple porch becomes a catapult, ships burn in the harbor, a headless warrior presides over the slaughter as the sky turns to fire.", |
|
| 40 | + | link: "https://explorethomascole.org/project/destruction/", |
|
| 41 | + | }, |
|
| 42 | + | { |
|
| 43 | + | src: desolation, |
|
| 44 | + | title: "Desolation", |
|
| 45 | + | year: "1836", |
|
| 46 | + | description: |
|
| 47 | + | "The final panel of Thomas Cole's Course of Empire. Sunset and moonrise over silent ruins. Vines climb a lone column, a bird nests where a temple stood, deer roam the broken friezes. No human figures remain. Nature outlasts everything man builds.", |
|
| 48 | + | link: "https://explorethomascole.org/project/desolation/", |
|
| 49 | + | }, |
|
| 50 | 50 | ]; |
|
| 51 | 51 | ||
| 52 | 52 | const estHour = parseInt( |
|
| 53 | - | new Date().toLocaleString("en-US", { |
|
| 54 | - | timeZone: "America/New_York", |
|
| 55 | - | hour: "numeric", |
|
| 56 | - | hour12: false, |
|
| 57 | - | }), |
|
| 53 | + | new Date().toLocaleString("en-US", { |
|
| 54 | + | timeZone: "America/New_York", |
|
| 55 | + | hour: "numeric", |
|
| 56 | + | hour12: false, |
|
| 57 | + | }), |
|
| 58 | 58 | ); |
|
| 59 | 59 | ||
| 60 | 60 | const boundaries = [6, 9, 12, 15, 18]; |
| 11 | 11 | ||
| 12 | 12 | export const birds: BirdEntry[] = [ |
|
| 13 | 13 | { |
|
| 14 | - | "commonName": "American Crow", |
|
| 15 | - | "scientificName": "Corvus brachyrhynchos", |
|
| 16 | - | "date": "2025-06-01", |
|
| 17 | - | "location": "Home", |
|
| 18 | - | "state": "US-TN", |
|
| 19 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/97752362/medium.jpg", |
|
| 20 | - | "summary": null, |
|
| 21 | - | "wikiUrl": "http://en.wikipedia.org/wiki/American_crow" |
|
| 14 | + | commonName: "American Crow", |
|
| 15 | + | scientificName: "Corvus brachyrhynchos", |
|
| 16 | + | date: "2025-06-01", |
|
| 17 | + | location: "Home", |
|
| 18 | + | state: "US-TN", |
|
| 19 | + | photo: |
|
| 20 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/97752362/medium.jpg", |
|
| 21 | + | summary: null, |
|
| 22 | + | wikiUrl: "http://en.wikipedia.org/wiki/American_crow", |
|
| 22 | 23 | }, |
|
| 23 | 24 | { |
|
| 24 | - | "commonName": "American Goldfinch", |
|
| 25 | - | "scientificName": "Spinus tristis", |
|
| 26 | - | "date": "2025-10-07", |
|
| 27 | - | "location": "Home", |
|
| 28 | - | "state": "US-TN", |
|
| 29 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/384965723/medium.jpg", |
|
| 30 | - | "summary": null, |
|
| 31 | - | "wikiUrl": "http://en.wikipedia.org/wiki/American_goldfinch" |
|
| 25 | + | commonName: "American Goldfinch", |
|
| 26 | + | scientificName: "Spinus tristis", |
|
| 27 | + | date: "2025-10-07", |
|
| 28 | + | location: "Home", |
|
| 29 | + | state: "US-TN", |
|
| 30 | + | photo: |
|
| 31 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/384965723/medium.jpg", |
|
| 32 | + | summary: null, |
|
| 33 | + | wikiUrl: "http://en.wikipedia.org/wiki/American_goldfinch", |
|
| 32 | 34 | }, |
|
| 33 | 35 | { |
|
| 34 | - | "commonName": "American Robin", |
|
| 35 | - | "scientificName": "Turdus migratorius", |
|
| 36 | - | "date": "2025-06-01", |
|
| 37 | - | "location": "Home", |
|
| 38 | - | "state": "US-TN", |
|
| 39 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/34859026/medium.jpg", |
|
| 40 | - | "summary": null, |
|
| 41 | - | "wikiUrl": "http://en.wikipedia.org/wiki/American_robin" |
|
| 36 | + | commonName: "American Robin", |
|
| 37 | + | scientificName: "Turdus migratorius", |
|
| 38 | + | date: "2025-06-01", |
|
| 39 | + | location: "Home", |
|
| 40 | + | state: "US-TN", |
|
| 41 | + | photo: |
|
| 42 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/34859026/medium.jpg", |
|
| 43 | + | summary: null, |
|
| 44 | + | wikiUrl: "http://en.wikipedia.org/wiki/American_robin", |
|
| 42 | 45 | }, |
|
| 43 | 46 | { |
|
| 44 | - | "commonName": "Bald Eagle", |
|
| 45 | - | "scientificName": "Haliaeetus leucocephalus", |
|
| 46 | - | "date": "2026-03-08", |
|
| 47 | - | "location": "Home", |
|
| 48 | - | "state": "US-TN", |
|
| 49 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/349074095/medium.jpeg", |
|
| 50 | - | "summary": null, |
|
| 51 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Bald_eagle" |
|
| 47 | + | commonName: "Bald Eagle", |
|
| 48 | + | scientificName: "Haliaeetus leucocephalus", |
|
| 49 | + | date: "2026-03-08", |
|
| 50 | + | location: "Home", |
|
| 51 | + | state: "US-TN", |
|
| 52 | + | photo: |
|
| 53 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/349074095/medium.jpeg", |
|
| 54 | + | summary: null, |
|
| 55 | + | wikiUrl: "http://en.wikipedia.org/wiki/Bald_eagle", |
|
| 52 | 56 | }, |
|
| 53 | 57 | { |
|
| 54 | - | "commonName": "Barred Owl", |
|
| 55 | - | "scientificName": "Strix varia", |
|
| 56 | - | "date": "2025-11-05", |
|
| 57 | - | "location": "302", |
|
| 58 | - | "state": "US-TN", |
|
| 59 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/359094470/medium.jpg", |
|
| 60 | - | "summary": null, |
|
| 61 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Barred_owl" |
|
| 58 | + | commonName: "Barred Owl", |
|
| 59 | + | scientificName: "Strix varia", |
|
| 60 | + | date: "2025-11-05", |
|
| 61 | + | location: "302", |
|
| 62 | + | state: "US-TN", |
|
| 63 | + | photo: |
|
| 64 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/359094470/medium.jpg", |
|
| 65 | + | summary: null, |
|
| 66 | + | wikiUrl: "http://en.wikipedia.org/wiki/Barred_owl", |
|
| 62 | 67 | }, |
|
| 63 | 68 | { |
|
| 64 | - | "commonName": "Belted Kingfisher", |
|
| 65 | - | "scientificName": "Megaceryle alcyon", |
|
| 66 | - | "date": "2025-10-28", |
|
| 67 | - | "location": "Reflection", |
|
| 68 | - | "state": "US-TN", |
|
| 69 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/244248986/medium.jpg", |
|
| 70 | - | "summary": null, |
|
| 71 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Belted_kingfisher" |
|
| 69 | + | commonName: "Belted Kingfisher", |
|
| 70 | + | scientificName: "Megaceryle alcyon", |
|
| 71 | + | date: "2025-10-28", |
|
| 72 | + | location: "Reflection", |
|
| 73 | + | state: "US-TN", |
|
| 74 | + | photo: |
|
| 75 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/244248986/medium.jpg", |
|
| 76 | + | summary: null, |
|
| 77 | + | wikiUrl: "http://en.wikipedia.org/wiki/Belted_kingfisher", |
|
| 72 | 78 | }, |
|
| 73 | 79 | { |
|
| 74 | - | "commonName": "Black Vulture", |
|
| 75 | - | "scientificName": "Coragyps atratus", |
|
| 76 | - | "date": "2025-11-24", |
|
| 77 | - | "location": "Grandview", |
|
| 78 | - | "state": "US-VA", |
|
| 79 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/176419188/medium.jpg", |
|
| 80 | - | "summary": null, |
|
| 81 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Black_vulture" |
|
| 80 | + | commonName: "Black Vulture", |
|
| 81 | + | scientificName: "Coragyps atratus", |
|
| 82 | + | date: "2025-11-24", |
|
| 83 | + | location: "Grandview", |
|
| 84 | + | state: "US-VA", |
|
| 85 | + | photo: |
|
| 86 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/176419188/medium.jpg", |
|
| 87 | + | summary: null, |
|
| 88 | + | wikiUrl: "http://en.wikipedia.org/wiki/Black_vulture", |
|
| 82 | 89 | }, |
|
| 83 | 90 | { |
|
| 84 | - | "commonName": "Blue Jay", |
|
| 85 | - | "scientificName": "Cyanocitta cristata", |
|
| 86 | - | "date": "2026-04-25", |
|
| 87 | - | "location": "Home", |
|
| 88 | - | "state": "US-TN", |
|
| 89 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/530721418/medium.jpg", |
|
| 90 | - | "summary": null, |
|
| 91 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Blue_jay" |
|
| 91 | + | commonName: "Blue Jay", |
|
| 92 | + | scientificName: "Cyanocitta cristata", |
|
| 93 | + | date: "2026-04-25", |
|
| 94 | + | location: "Home", |
|
| 95 | + | state: "US-TN", |
|
| 96 | + | photo: |
|
| 97 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/530721418/medium.jpg", |
|
| 98 | + | summary: null, |
|
| 99 | + | wikiUrl: "http://en.wikipedia.org/wiki/Blue_jay", |
|
| 92 | 100 | }, |
|
| 93 | 101 | { |
|
| 94 | - | "commonName": "Blue-gray Gnatcatcher", |
|
| 95 | - | "scientificName": "Polioptila caerulea", |
|
| 96 | - | "date": "2026-04-04", |
|
| 97 | - | "location": "Reflection", |
|
| 98 | - | "state": "US-TN", |
|
| 99 | - | "photo": "https://static.inaturalist.org/photos/269328954/medium.jpeg", |
|
| 100 | - | "summary": null, |
|
| 101 | - | "wikiUrl": "https://en.wikipedia.org/wiki/Blue-gray_gnatcatcher" |
|
| 102 | + | commonName: "Blue-gray Gnatcatcher", |
|
| 103 | + | scientificName: "Polioptila caerulea", |
|
| 104 | + | date: "2026-04-04", |
|
| 105 | + | location: "Reflection", |
|
| 106 | + | state: "US-TN", |
|
| 107 | + | photo: "https://static.inaturalist.org/photos/269328954/medium.jpeg", |
|
| 108 | + | summary: null, |
|
| 109 | + | wikiUrl: "https://en.wikipedia.org/wiki/Blue-gray_gnatcatcher", |
|
| 102 | 110 | }, |
|
| 103 | 111 | { |
|
| 104 | - | "commonName": "Brown Thrasher", |
|
| 105 | - | "scientificName": "Toxostoma rufum", |
|
| 106 | - | "date": "2025-06-01", |
|
| 107 | - | "location": "Home", |
|
| 108 | - | "state": "US-TN", |
|
| 109 | - | "photo": "https://static.inaturalist.org/photos/76155158/medium.jpg", |
|
| 110 | - | "summary": null, |
|
| 111 | - | "wikiUrl": "https://en.wikipedia.org/wiki/Brown_thrasher" |
|
| 112 | + | commonName: "Brown Thrasher", |
|
| 113 | + | scientificName: "Toxostoma rufum", |
|
| 114 | + | date: "2025-06-01", |
|
| 115 | + | location: "Home", |
|
| 116 | + | state: "US-TN", |
|
| 117 | + | photo: "https://static.inaturalist.org/photos/76155158/medium.jpg", |
|
| 118 | + | summary: null, |
|
| 119 | + | wikiUrl: "https://en.wikipedia.org/wiki/Brown_thrasher", |
|
| 112 | 120 | }, |
|
| 113 | 121 | { |
|
| 114 | - | "commonName": "Brown-headed Cowbird", |
|
| 115 | - | "scientificName": "Molothrus ater", |
|
| 116 | - | "date": "2025-06-15", |
|
| 117 | - | "location": "Home", |
|
| 118 | - | "state": "US-TN", |
|
| 119 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/656878277/medium.jpg", |
|
| 120 | - | "summary": null, |
|
| 121 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Brown-headed_cowbird" |
|
| 122 | + | commonName: "Brown-headed Cowbird", |
|
| 123 | + | scientificName: "Molothrus ater", |
|
| 124 | + | date: "2025-06-15", |
|
| 125 | + | location: "Home", |
|
| 126 | + | state: "US-TN", |
|
| 127 | + | photo: |
|
| 128 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/656878277/medium.jpg", |
|
| 129 | + | summary: null, |
|
| 130 | + | wikiUrl: "http://en.wikipedia.org/wiki/Brown-headed_cowbird", |
|
| 122 | 131 | }, |
|
| 123 | 132 | { |
|
| 124 | - | "commonName": "Brown-headed Nuthatch", |
|
| 125 | - | "scientificName": "Sitta pusilla", |
|
| 126 | - | "date": "2025-12-01", |
|
| 127 | - | "location": "Home", |
|
| 128 | - | "state": "US-TN", |
|
| 129 | - | "photo": "https://static.inaturalist.org/photos/254151643/medium.jpg", |
|
| 130 | - | "summary": null, |
|
| 131 | - | "wikiUrl": "https://en.wikipedia.org/wiki/Brown-headed_nuthatch" |
|
| 133 | + | commonName: "Brown-headed Nuthatch", |
|
| 134 | + | scientificName: "Sitta pusilla", |
|
| 135 | + | date: "2025-12-01", |
|
| 136 | + | location: "Home", |
|
| 137 | + | state: "US-TN", |
|
| 138 | + | photo: "https://static.inaturalist.org/photos/254151643/medium.jpg", |
|
| 139 | + | summary: null, |
|
| 140 | + | wikiUrl: "https://en.wikipedia.org/wiki/Brown-headed_nuthatch", |
|
| 132 | 141 | }, |
|
| 133 | 142 | { |
|
| 134 | - | "commonName": "Carolina Chickadee", |
|
| 135 | - | "scientificName": "Poecile carolinensis", |
|
| 136 | - | "date": "2026-04-25", |
|
| 137 | - | "location": "Home", |
|
| 138 | - | "state": "US-TN", |
|
| 139 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/3053969/medium.jpg", |
|
| 140 | - | "summary": null, |
|
| 141 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Carolina_chickadee" |
|
| 143 | + | commonName: "Carolina Chickadee", |
|
| 144 | + | scientificName: "Poecile carolinensis", |
|
| 145 | + | date: "2026-04-25", |
|
| 146 | + | location: "Home", |
|
| 147 | + | state: "US-TN", |
|
| 148 | + | photo: |
|
| 149 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/3053969/medium.jpg", |
|
| 150 | + | summary: null, |
|
| 151 | + | wikiUrl: "http://en.wikipedia.org/wiki/Carolina_chickadee", |
|
| 142 | 152 | }, |
|
| 143 | 153 | { |
|
| 144 | - | "commonName": "Carolina Wren", |
|
| 145 | - | "scientificName": "Thryothorus ludovicianus", |
|
| 146 | - | "date": "2025-09-19", |
|
| 147 | - | "location": "Home", |
|
| 148 | - | "state": "US-TN", |
|
| 149 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/461889083/medium.jpg", |
|
| 150 | - | "summary": null, |
|
| 151 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Carolina_wren" |
|
| 154 | + | commonName: "Carolina Wren", |
|
| 155 | + | scientificName: "Thryothorus ludovicianus", |
|
| 156 | + | date: "2025-09-19", |
|
| 157 | + | location: "Home", |
|
| 158 | + | state: "US-TN", |
|
| 159 | + | photo: |
|
| 160 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/461889083/medium.jpg", |
|
| 161 | + | summary: null, |
|
| 162 | + | wikiUrl: "http://en.wikipedia.org/wiki/Carolina_wren", |
|
| 152 | 163 | }, |
|
| 153 | 164 | { |
|
| 154 | - | "commonName": "Cedar Waxwing", |
|
| 155 | - | "scientificName": "Bombycilla cedrorum", |
|
| 156 | - | "date": "2026-01-02", |
|
| 157 | - | "location": "Reflection", |
|
| 158 | - | "state": "US-TN", |
|
| 159 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/450146514/medium.jpeg", |
|
| 160 | - | "summary": null, |
|
| 161 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Cedar_waxwing" |
|
| 165 | + | commonName: "Cedar Waxwing", |
|
| 166 | + | scientificName: "Bombycilla cedrorum", |
|
| 167 | + | date: "2026-01-02", |
|
| 168 | + | location: "Reflection", |
|
| 169 | + | state: "US-TN", |
|
| 170 | + | photo: |
|
| 171 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/450146514/medium.jpeg", |
|
| 172 | + | summary: null, |
|
| 173 | + | wikiUrl: "http://en.wikipedia.org/wiki/Cedar_waxwing", |
|
| 162 | 174 | }, |
|
| 163 | 175 | { |
|
| 164 | - | "commonName": "Chimney Swift", |
|
| 165 | - | "scientificName": "Chaetura pelagica", |
|
| 166 | - | "date": "2025-09-22", |
|
| 167 | - | "location": "Yellow house", |
|
| 168 | - | "state": "US-TN", |
|
| 169 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/383206018/medium.jpeg", |
|
| 170 | - | "summary": null, |
|
| 171 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Chimney_swift" |
|
| 176 | + | commonName: "Chimney Swift", |
|
| 177 | + | scientificName: "Chaetura pelagica", |
|
| 178 | + | date: "2025-09-22", |
|
| 179 | + | location: "Yellow house", |
|
| 180 | + | state: "US-TN", |
|
| 181 | + | photo: |
|
| 182 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/383206018/medium.jpeg", |
|
| 183 | + | summary: null, |
|
| 184 | + | wikiUrl: "http://en.wikipedia.org/wiki/Chimney_swift", |
|
| 172 | 185 | }, |
|
| 173 | 186 | { |
|
| 174 | - | "commonName": "Chipping Sparrow", |
|
| 175 | - | "scientificName": "Spizella passerina", |
|
| 176 | - | "date": "2026-03-14", |
|
| 177 | - | "location": "Home", |
|
| 178 | - | "state": "US-TN", |
|
| 179 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/273251789/medium.jpg", |
|
| 180 | - | "summary": null, |
|
| 181 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Chipping_sparrow" |
|
| 187 | + | commonName: "Chipping Sparrow", |
|
| 188 | + | scientificName: "Spizella passerina", |
|
| 189 | + | date: "2026-03-14", |
|
| 190 | + | location: "Home", |
|
| 191 | + | state: "US-TN", |
|
| 192 | + | photo: |
|
| 193 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/273251789/medium.jpg", |
|
| 194 | + | summary: null, |
|
| 195 | + | wikiUrl: "http://en.wikipedia.org/wiki/Chipping_sparrow", |
|
| 182 | 196 | }, |
|
| 183 | 197 | { |
|
| 184 | - | "commonName": "Common Loon", |
|
| 185 | - | "scientificName": "Gavia immer", |
|
| 186 | - | "date": "2025-11-24", |
|
| 187 | - | "location": "Grandview", |
|
| 188 | - | "state": "US-VA", |
|
| 189 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/2960972/medium.jpg", |
|
| 190 | - | "summary": null, |
|
| 191 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Common_loon" |
|
| 198 | + | commonName: "Common Loon", |
|
| 199 | + | scientificName: "Gavia immer", |
|
| 200 | + | date: "2025-11-24", |
|
| 201 | + | location: "Grandview", |
|
| 202 | + | state: "US-VA", |
|
| 203 | + | photo: |
|
| 204 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/2960972/medium.jpg", |
|
| 205 | + | summary: null, |
|
| 206 | + | wikiUrl: "http://en.wikipedia.org/wiki/Common_loon", |
|
| 192 | 207 | }, |
|
| 193 | 208 | { |
|
| 194 | - | "commonName": "Cooper's Hawk", |
|
| 195 | - | "scientificName": "Astur cooperii", |
|
| 196 | - | "date": "2025-08-27", |
|
| 197 | - | "location": "Home", |
|
| 198 | - | "state": "US-TN", |
|
| 199 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/170370008/medium.jpg", |
|
| 200 | - | "summary": null, |
|
| 201 | - | "wikiUrl": "https://en.wikipedia.org/wiki/Cooper's_hawk" |
|
| 209 | + | commonName: "Cooper's Hawk", |
|
| 210 | + | scientificName: "Astur cooperii", |
|
| 211 | + | date: "2025-08-27", |
|
| 212 | + | location: "Home", |
|
| 213 | + | state: "US-TN", |
|
| 214 | + | photo: |
|
| 215 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/170370008/medium.jpg", |
|
| 216 | + | summary: null, |
|
| 217 | + | wikiUrl: "https://en.wikipedia.org/wiki/Cooper's_hawk", |
|
| 202 | 218 | }, |
|
| 203 | 219 | { |
|
| 204 | - | "commonName": "Dark-eyed Junco", |
|
| 205 | - | "scientificName": "Junco hyemalis", |
|
| 206 | - | "date": "2019-02-17", |
|
| 207 | - | "location": "Rittman", |
|
| 208 | - | "state": "US-OH", |
|
| 209 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/111714701/medium.jpeg", |
|
| 210 | - | "summary": null, |
|
| 211 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Dark-eyed_junco" |
|
| 220 | + | commonName: "Dark-eyed Junco", |
|
| 221 | + | scientificName: "Junco hyemalis", |
|
| 222 | + | date: "2019-02-17", |
|
| 223 | + | location: "Rittman", |
|
| 224 | + | state: "US-OH", |
|
| 225 | + | photo: |
|
| 226 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/111714701/medium.jpeg", |
|
| 227 | + | summary: null, |
|
| 228 | + | wikiUrl: "http://en.wikipedia.org/wiki/Dark-eyed_junco", |
|
| 212 | 229 | }, |
|
| 213 | 230 | { |
|
| 214 | - | "commonName": "Double-crested Cormorant", |
|
| 215 | - | "scientificName": "Nannopterum auritum", |
|
| 216 | - | "date": "2025-11-24", |
|
| 217 | - | "location": "Grandview", |
|
| 218 | - | "state": "US-VA", |
|
| 219 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/541600012/medium.jpg", |
|
| 220 | - | "summary": null, |
|
| 221 | - | "wikiUrl": "https://en.wikipedia.org/wiki/Double-crested_cormorant" |
|
| 231 | + | commonName: "Double-crested Cormorant", |
|
| 232 | + | scientificName: "Nannopterum auritum", |
|
| 233 | + | date: "2025-11-24", |
|
| 234 | + | location: "Grandview", |
|
| 235 | + | state: "US-VA", |
|
| 236 | + | photo: |
|
| 237 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/541600012/medium.jpg", |
|
| 238 | + | summary: null, |
|
| 239 | + | wikiUrl: "https://en.wikipedia.org/wiki/Double-crested_cormorant", |
|
| 222 | 240 | }, |
|
| 223 | 241 | { |
|
| 224 | - | "commonName": "Downy Woodpecker", |
|
| 225 | - | "scientificName": "Dryobates pubescens", |
|
| 226 | - | "date": "2019-02-17", |
|
| 227 | - | "location": "Rittman", |
|
| 228 | - | "state": "US-OH", |
|
| 229 | - | "photo": "https://static.inaturalist.org/photos/25544008/medium.jpeg", |
|
| 230 | - | "summary": null, |
|
| 231 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Downy_woodpecker" |
|
| 242 | + | commonName: "Downy Woodpecker", |
|
| 243 | + | scientificName: "Dryobates pubescens", |
|
| 244 | + | date: "2019-02-17", |
|
| 245 | + | location: "Rittman", |
|
| 246 | + | state: "US-OH", |
|
| 247 | + | photo: "https://static.inaturalist.org/photos/25544008/medium.jpeg", |
|
| 248 | + | summary: null, |
|
| 249 | + | wikiUrl: "http://en.wikipedia.org/wiki/Downy_woodpecker", |
|
| 232 | 250 | }, |
|
| 233 | 251 | { |
|
| 234 | - | "commonName": "Eastern Bluebird", |
|
| 235 | - | "scientificName": "Sialia sialis", |
|
| 236 | - | "date": "2025-04-14", |
|
| 237 | - | "location": "Home", |
|
| 238 | - | "state": "US-TN", |
|
| 239 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/477069179/medium.jpg", |
|
| 240 | - | "summary": null, |
|
| 241 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Eastern_bluebird" |
|
| 252 | + | commonName: "Eastern Bluebird", |
|
| 253 | + | scientificName: "Sialia sialis", |
|
| 254 | + | date: "2025-04-14", |
|
| 255 | + | location: "Home", |
|
| 256 | + | state: "US-TN", |
|
| 257 | + | photo: |
|
| 258 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/477069179/medium.jpg", |
|
| 259 | + | summary: null, |
|
| 260 | + | wikiUrl: "http://en.wikipedia.org/wiki/Eastern_bluebird", |
|
| 242 | 261 | }, |
|
| 243 | 262 | { |
|
| 244 | - | "commonName": "Eastern Towhee", |
|
| 245 | - | "scientificName": "Pipilo erythrophthalmus", |
|
| 246 | - | "date": "2025-06-01", |
|
| 247 | - | "location": "Home", |
|
| 248 | - | "state": "US-TN", |
|
| 249 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/45584021/medium.jpg", |
|
| 250 | - | "summary": null, |
|
| 251 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Eastern_towhee" |
|
| 263 | + | commonName: "Eastern Towhee", |
|
| 264 | + | scientificName: "Pipilo erythrophthalmus", |
|
| 265 | + | date: "2025-06-01", |
|
| 266 | + | location: "Home", |
|
| 267 | + | state: "US-TN", |
|
| 268 | + | photo: |
|
| 269 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/45584021/medium.jpg", |
|
| 270 | + | summary: null, |
|
| 271 | + | wikiUrl: "http://en.wikipedia.org/wiki/Eastern_towhee", |
|
| 252 | 272 | }, |
|
| 253 | 273 | { |
|
| 254 | - | "commonName": "Eastern Wood-Pewee", |
|
| 255 | - | "scientificName": "Contopus virens", |
|
| 256 | - | "date": "2026-05-26", |
|
| 257 | - | "location": "Home", |
|
| 258 | - | "state": "US-TN", |
|
| 259 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/67966814/medium.jpg", |
|
| 260 | - | "summary": null, |
|
| 261 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Eastern_wood_pewee" |
|
| 274 | + | commonName: "Eastern Wood-Pewee", |
|
| 275 | + | scientificName: "Contopus virens", |
|
| 276 | + | date: "2026-05-26", |
|
| 277 | + | location: "Home", |
|
| 278 | + | state: "US-TN", |
|
| 279 | + | photo: |
|
| 280 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/67966814/medium.jpg", |
|
| 281 | + | summary: null, |
|
| 282 | + | wikiUrl: "http://en.wikipedia.org/wiki/Eastern_wood_pewee", |
|
| 262 | 283 | }, |
|
| 263 | 284 | { |
|
| 264 | - | "commonName": "European Starling", |
|
| 265 | - | "scientificName": "Sturnus vulgaris", |
|
| 266 | - | "date": "2026-05-02", |
|
| 267 | - | "location": "Home", |
|
| 268 | - | "state": "US-TN", |
|
| 269 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/32152001/medium.jpg", |
|
| 270 | - | "summary": null, |
|
| 271 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Common_starling" |
|
| 285 | + | commonName: "European Starling", |
|
| 286 | + | scientificName: "Sturnus vulgaris", |
|
| 287 | + | date: "2026-05-02", |
|
| 288 | + | location: "Home", |
|
| 289 | + | state: "US-TN", |
|
| 290 | + | photo: |
|
| 291 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/32152001/medium.jpg", |
|
| 292 | + | summary: null, |
|
| 293 | + | wikiUrl: "http://en.wikipedia.org/wiki/Common_starling", |
|
| 272 | 294 | }, |
|
| 273 | 295 | { |
|
| 274 | - | "commonName": "Gray Catbird", |
|
| 275 | - | "scientificName": "Dumetella carolinensis", |
|
| 276 | - | "date": "2025-10-23", |
|
| 277 | - | "location": "Home", |
|
| 278 | - | "state": "US-TN", |
|
| 279 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/196664043/medium.jpg", |
|
| 280 | - | "summary": null, |
|
| 281 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Gray_catbird" |
|
| 296 | + | commonName: "Gray Catbird", |
|
| 297 | + | scientificName: "Dumetella carolinensis", |
|
| 298 | + | date: "2025-10-23", |
|
| 299 | + | location: "Home", |
|
| 300 | + | state: "US-TN", |
|
| 301 | + | photo: |
|
| 302 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/196664043/medium.jpg", |
|
| 303 | + | summary: null, |
|
| 304 | + | wikiUrl: "http://en.wikipedia.org/wiki/Gray_catbird", |
|
| 282 | 305 | }, |
|
| 283 | 306 | { |
|
| 284 | - | "commonName": "Great Crested Flycatcher", |
|
| 285 | - | "scientificName": "Myiarchus crinitus", |
|
| 286 | - | "date": "2026-05-10", |
|
| 287 | - | "location": "Home", |
|
| 288 | - | "state": "US-TN", |
|
| 289 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/202717991/medium.jpeg", |
|
| 290 | - | "summary": null, |
|
| 291 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Great_crested_flycatcher" |
|
| 307 | + | commonName: "Great Crested Flycatcher", |
|
| 308 | + | scientificName: "Myiarchus crinitus", |
|
| 309 | + | date: "2026-05-10", |
|
| 310 | + | location: "Home", |
|
| 311 | + | state: "US-TN", |
|
| 312 | + | photo: |
|
| 313 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/202717991/medium.jpeg", |
|
| 314 | + | summary: null, |
|
| 315 | + | wikiUrl: "http://en.wikipedia.org/wiki/Great_crested_flycatcher", |
|
| 292 | 316 | }, |
|
| 293 | 317 | { |
|
| 294 | - | "commonName": "Hairy Woodpecker", |
|
| 295 | - | "scientificName": "Leuconotopicus villosus", |
|
| 296 | - | "date": "2026-01-02", |
|
| 297 | - | "location": "Reflection", |
|
| 298 | - | "state": "US-TN", |
|
| 299 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/1275/medium.jpg", |
|
| 300 | - | "summary": null, |
|
| 301 | - | "wikiUrl": "https://en.wikipedia.org/wiki/Hairy_woodpecker" |
|
| 318 | + | commonName: "Hairy Woodpecker", |
|
| 319 | + | scientificName: "Leuconotopicus villosus", |
|
| 320 | + | date: "2026-01-02", |
|
| 321 | + | location: "Reflection", |
|
| 322 | + | state: "US-TN", |
|
| 323 | + | photo: |
|
| 324 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/1275/medium.jpg", |
|
| 325 | + | summary: null, |
|
| 326 | + | wikiUrl: "https://en.wikipedia.org/wiki/Hairy_woodpecker", |
|
| 302 | 327 | }, |
|
| 303 | 328 | { |
|
| 304 | - | "commonName": "House Finch", |
|
| 305 | - | "scientificName": "Haemorhous mexicanus", |
|
| 306 | - | "date": "2026-04-25", |
|
| 307 | - | "location": "Home", |
|
| 308 | - | "state": "US-TN", |
|
| 309 | - | "photo": "https://static.inaturalist.org/photos/178968933/medium.jpg", |
|
| 310 | - | "summary": null, |
|
| 311 | - | "wikiUrl": "http://en.wikipedia.org/wiki/House_finch" |
|
| 329 | + | commonName: "House Finch", |
|
| 330 | + | scientificName: "Haemorhous mexicanus", |
|
| 331 | + | date: "2026-04-25", |
|
| 332 | + | location: "Home", |
|
| 333 | + | state: "US-TN", |
|
| 334 | + | photo: "https://static.inaturalist.org/photos/178968933/medium.jpg", |
|
| 335 | + | summary: null, |
|
| 336 | + | wikiUrl: "http://en.wikipedia.org/wiki/House_finch", |
|
| 312 | 337 | }, |
|
| 313 | 338 | { |
|
| 314 | - | "commonName": "House Sparrow", |
|
| 315 | - | "scientificName": "Passer domesticus", |
|
| 316 | - | "date": "2019-02-17", |
|
| 317 | - | "location": "Rittman", |
|
| 318 | - | "state": "US-OH", |
|
| 319 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/4608133/medium.jpg", |
|
| 320 | - | "summary": null, |
|
| 321 | - | "wikiUrl": "http://en.wikipedia.org/wiki/House_sparrow" |
|
| 339 | + | commonName: "House Sparrow", |
|
| 340 | + | scientificName: "Passer domesticus", |
|
| 341 | + | date: "2019-02-17", |
|
| 342 | + | location: "Rittman", |
|
| 343 | + | state: "US-OH", |
|
| 344 | + | photo: |
|
| 345 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/4608133/medium.jpg", |
|
| 346 | + | summary: null, |
|
| 347 | + | wikiUrl: "http://en.wikipedia.org/wiki/House_sparrow", |
|
| 322 | 348 | }, |
|
| 323 | 349 | { |
|
| 324 | - | "commonName": "Indigo Bunting", |
|
| 325 | - | "scientificName": "Passerina cyanea", |
|
| 326 | - | "date": "2025-05-28", |
|
| 327 | - | "location": "Home", |
|
| 328 | - | "state": "US-TN", |
|
| 329 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/168808461/medium.jpeg", |
|
| 330 | - | "summary": null, |
|
| 331 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Indigo_bunting" |
|
| 350 | + | commonName: "Indigo Bunting", |
|
| 351 | + | scientificName: "Passerina cyanea", |
|
| 352 | + | date: "2025-05-28", |
|
| 353 | + | location: "Home", |
|
| 354 | + | state: "US-TN", |
|
| 355 | + | photo: |
|
| 356 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/168808461/medium.jpeg", |
|
| 357 | + | summary: null, |
|
| 358 | + | wikiUrl: "http://en.wikipedia.org/wiki/Indigo_bunting", |
|
| 332 | 359 | }, |
|
| 333 | 360 | { |
|
| 334 | - | "commonName": "Mourning Dove", |
|
| 335 | - | "scientificName": "Zenaida macroura", |
|
| 336 | - | "date": "2019-02-17", |
|
| 337 | - | "location": "Rittman", |
|
| 338 | - | "state": "US-OH", |
|
| 339 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/14015355/medium.jpg", |
|
| 340 | - | "summary": null, |
|
| 341 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Mourning_dove" |
|
| 361 | + | commonName: "Mourning Dove", |
|
| 362 | + | scientificName: "Zenaida macroura", |
|
| 363 | + | date: "2019-02-17", |
|
| 364 | + | location: "Rittman", |
|
| 365 | + | state: "US-OH", |
|
| 366 | + | photo: |
|
| 367 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/14015355/medium.jpg", |
|
| 368 | + | summary: null, |
|
| 369 | + | wikiUrl: "http://en.wikipedia.org/wiki/Mourning_dove", |
|
| 342 | 370 | }, |
|
| 343 | 371 | { |
|
| 344 | - | "commonName": "Northern Cardinal", |
|
| 345 | - | "scientificName": "Cardinalis cardinalis", |
|
| 346 | - | "date": "2026-04-25", |
|
| 347 | - | "location": "Home", |
|
| 348 | - | "state": "US-TN", |
|
| 349 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/189434971/medium.jpg", |
|
| 350 | - | "summary": null, |
|
| 351 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Northern_cardinal" |
|
| 372 | + | commonName: "Northern Cardinal", |
|
| 373 | + | scientificName: "Cardinalis cardinalis", |
|
| 374 | + | date: "2026-04-25", |
|
| 375 | + | location: "Home", |
|
| 376 | + | state: "US-TN", |
|
| 377 | + | photo: |
|
| 378 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/189434971/medium.jpg", |
|
| 379 | + | summary: null, |
|
| 380 | + | wikiUrl: "http://en.wikipedia.org/wiki/Northern_cardinal", |
|
| 352 | 381 | }, |
|
| 353 | 382 | { |
|
| 354 | - | "commonName": "Northern Mockingbird", |
|
| 355 | - | "scientificName": "Mimus polyglottos", |
|
| 356 | - | "date": "2025-06-01", |
|
| 357 | - | "location": "Home", |
|
| 358 | - | "state": "US-TN", |
|
| 359 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/142697277/medium.jpg", |
|
| 360 | - | "summary": null, |
|
| 361 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Northern_mockingbird" |
|
| 383 | + | commonName: "Northern Mockingbird", |
|
| 384 | + | scientificName: "Mimus polyglottos", |
|
| 385 | + | date: "2025-06-01", |
|
| 386 | + | location: "Home", |
|
| 387 | + | state: "US-TN", |
|
| 388 | + | photo: |
|
| 389 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/142697277/medium.jpg", |
|
| 390 | + | summary: null, |
|
| 391 | + | wikiUrl: "http://en.wikipedia.org/wiki/Northern_mockingbird", |
|
| 362 | 392 | }, |
|
| 363 | 393 | { |
|
| 364 | - | "commonName": "Palm Warbler", |
|
| 365 | - | "scientificName": "Setophaga palmarum", |
|
| 366 | - | "date": "2026-04-04", |
|
| 367 | - | "location": "Reflection", |
|
| 368 | - | "state": "US-TN", |
|
| 369 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/496238324/medium.jpeg", |
|
| 370 | - | "summary": null, |
|
| 371 | - | "wikiUrl": "https://en.wikipedia.org/wiki/Palm_warbler" |
|
| 394 | + | commonName: "Palm Warbler", |
|
| 395 | + | scientificName: "Setophaga palmarum", |
|
| 396 | + | date: "2026-04-04", |
|
| 397 | + | location: "Reflection", |
|
| 398 | + | state: "US-TN", |
|
| 399 | + | photo: |
|
| 400 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/496238324/medium.jpeg", |
|
| 401 | + | summary: null, |
|
| 402 | + | wikiUrl: "https://en.wikipedia.org/wiki/Palm_warbler", |
|
| 372 | 403 | }, |
|
| 373 | 404 | { |
|
| 374 | - | "commonName": "Pileated Woodpecker", |
|
| 375 | - | "scientificName": "Dryocopus pileatus", |
|
| 376 | - | "date": "2026-04-24", |
|
| 377 | - | "location": "Home", |
|
| 378 | - | "state": "US-TN", |
|
| 379 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/168915535/medium.jpg", |
|
| 380 | - | "summary": null, |
|
| 381 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Pileated_woodpecker" |
|
| 405 | + | commonName: "Pileated Woodpecker", |
|
| 406 | + | scientificName: "Dryocopus pileatus", |
|
| 407 | + | date: "2026-04-24", |
|
| 408 | + | location: "Home", |
|
| 409 | + | state: "US-TN", |
|
| 410 | + | photo: |
|
| 411 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/168915535/medium.jpg", |
|
| 412 | + | summary: null, |
|
| 413 | + | wikiUrl: "http://en.wikipedia.org/wiki/Pileated_woodpecker", |
|
| 382 | 414 | }, |
|
| 383 | 415 | { |
|
| 384 | - | "commonName": "Red-bellied Woodpecker", |
|
| 385 | - | "scientificName": "Melanerpes carolinus", |
|
| 386 | - | "date": "2025-06-01", |
|
| 387 | - | "location": "Home", |
|
| 388 | - | "state": "US-TN", |
|
| 389 | - | "photo": "https://static.inaturalist.org/photos/383227697/medium.jpeg", |
|
| 390 | - | "summary": null, |
|
| 391 | - | "wikiUrl": "https://en.wikipedia.org/wiki/Red-bellied_woodpecker" |
|
| 416 | + | commonName: "Red-bellied Woodpecker", |
|
| 417 | + | scientificName: "Melanerpes carolinus", |
|
| 418 | + | date: "2025-06-01", |
|
| 419 | + | location: "Home", |
|
| 420 | + | state: "US-TN", |
|
| 421 | + | photo: "https://static.inaturalist.org/photos/383227697/medium.jpeg", |
|
| 422 | + | summary: null, |
|
| 423 | + | wikiUrl: "https://en.wikipedia.org/wiki/Red-bellied_woodpecker", |
|
| 392 | 424 | }, |
|
| 393 | 425 | { |
|
| 394 | - | "commonName": "Red-headed Woodpecker", |
|
| 395 | - | "scientificName": "Melanerpes erythrocephalus", |
|
| 396 | - | "date": "2019-02-17", |
|
| 397 | - | "location": "Rittman", |
|
| 398 | - | "state": "US-OH", |
|
| 399 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/232699/medium.jpg", |
|
| 400 | - | "summary": null, |
|
| 401 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Red-headed_woodpecker" |
|
| 426 | + | commonName: "Red-headed Woodpecker", |
|
| 427 | + | scientificName: "Melanerpes erythrocephalus", |
|
| 428 | + | date: "2019-02-17", |
|
| 429 | + | location: "Rittman", |
|
| 430 | + | state: "US-OH", |
|
| 431 | + | photo: |
|
| 432 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/232699/medium.jpg", |
|
| 433 | + | summary: null, |
|
| 434 | + | wikiUrl: "http://en.wikipedia.org/wiki/Red-headed_woodpecker", |
|
| 402 | 435 | }, |
|
| 403 | 436 | { |
|
| 404 | - | "commonName": "Rose-breasted Grosbeak", |
|
| 405 | - | "scientificName": "Pheucticus ludovicianus", |
|
| 406 | - | "date": "2026-04-25", |
|
| 407 | - | "location": "Home", |
|
| 408 | - | "state": "US-TN", |
|
| 409 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/203617764/medium.jpg", |
|
| 410 | - | "summary": null, |
|
| 411 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Rose-breasted_grosbeak" |
|
| 437 | + | commonName: "Rose-breasted Grosbeak", |
|
| 438 | + | scientificName: "Pheucticus ludovicianus", |
|
| 439 | + | date: "2026-04-25", |
|
| 440 | + | location: "Home", |
|
| 441 | + | state: "US-TN", |
|
| 442 | + | photo: |
|
| 443 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/203617764/medium.jpg", |
|
| 444 | + | summary: null, |
|
| 445 | + | wikiUrl: "http://en.wikipedia.org/wiki/Rose-breasted_grosbeak", |
|
| 412 | 446 | }, |
|
| 413 | 447 | { |
|
| 414 | - | "commonName": "Song Sparrow", |
|
| 415 | - | "scientificName": "Melospiza melodia", |
|
| 416 | - | "date": "2025-06-01", |
|
| 417 | - | "location": "Home", |
|
| 418 | - | "state": "US-TN", |
|
| 419 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/104749271/medium.jpg", |
|
| 420 | - | "summary": null, |
|
| 421 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Song_sparrow" |
|
| 448 | + | commonName: "Song Sparrow", |
|
| 449 | + | scientificName: "Melospiza melodia", |
|
| 450 | + | date: "2025-06-01", |
|
| 451 | + | location: "Home", |
|
| 452 | + | state: "US-TN", |
|
| 453 | + | photo: |
|
| 454 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/104749271/medium.jpg", |
|
| 455 | + | summary: null, |
|
| 456 | + | wikiUrl: "http://en.wikipedia.org/wiki/Song_sparrow", |
|
| 422 | 457 | }, |
|
| 423 | 458 | { |
|
| 424 | - | "commonName": "Summer Tanager", |
|
| 425 | - | "scientificName": "Piranga rubra", |
|
| 426 | - | "date": "2025-06-01", |
|
| 427 | - | "location": "Home", |
|
| 428 | - | "state": "US-TN", |
|
| 429 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/21089917/medium.jpg", |
|
| 430 | - | "summary": null, |
|
| 431 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Summer_tanager" |
|
| 459 | + | commonName: "Summer Tanager", |
|
| 460 | + | scientificName: "Piranga rubra", |
|
| 461 | + | date: "2025-06-01", |
|
| 462 | + | location: "Home", |
|
| 463 | + | state: "US-TN", |
|
| 464 | + | photo: |
|
| 465 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/21089917/medium.jpg", |
|
| 466 | + | summary: null, |
|
| 467 | + | wikiUrl: "http://en.wikipedia.org/wiki/Summer_tanager", |
|
| 432 | 468 | }, |
|
| 433 | 469 | { |
|
| 434 | - | "commonName": "Tennessee Warbler", |
|
| 435 | - | "scientificName": "Leiothlypis peregrina", |
|
| 436 | - | "date": "2026-05-03", |
|
| 437 | - | "location": "Home", |
|
| 438 | - | "state": "US-TN", |
|
| 439 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/7756/medium.jpg", |
|
| 440 | - | "summary": null, |
|
| 441 | - | "wikiUrl": "https://en.wikipedia.org/wiki/Tennessee_warbler" |
|
| 470 | + | commonName: "Tennessee Warbler", |
|
| 471 | + | scientificName: "Leiothlypis peregrina", |
|
| 472 | + | date: "2026-05-03", |
|
| 473 | + | location: "Home", |
|
| 474 | + | state: "US-TN", |
|
| 475 | + | photo: |
|
| 476 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/7756/medium.jpg", |
|
| 477 | + | summary: null, |
|
| 478 | + | wikiUrl: "https://en.wikipedia.org/wiki/Tennessee_warbler", |
|
| 442 | 479 | }, |
|
| 443 | 480 | { |
|
| 444 | - | "commonName": "Tufted Titmouse", |
|
| 445 | - | "scientificName": "Baeolophus bicolor", |
|
| 446 | - | "date": "2025-04-24", |
|
| 447 | - | "location": "Home", |
|
| 448 | - | "state": "US-TN", |
|
| 449 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/178382206/medium.jpeg", |
|
| 450 | - | "summary": null, |
|
| 451 | - | "wikiUrl": "https://en.wikipedia.org/wiki/Tufted_titmouse" |
|
| 481 | + | commonName: "Tufted Titmouse", |
|
| 482 | + | scientificName: "Baeolophus bicolor", |
|
| 483 | + | date: "2025-04-24", |
|
| 484 | + | location: "Home", |
|
| 485 | + | state: "US-TN", |
|
| 486 | + | photo: |
|
| 487 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/178382206/medium.jpeg", |
|
| 488 | + | summary: null, |
|
| 489 | + | wikiUrl: "https://en.wikipedia.org/wiki/Tufted_titmouse", |
|
| 452 | 490 | }, |
|
| 453 | 491 | { |
|
| 454 | - | "commonName": "White-breasted Nuthatch", |
|
| 455 | - | "scientificName": "Sitta carolinensis", |
|
| 456 | - | "date": "2019-02-17", |
|
| 457 | - | "location": "Rittman", |
|
| 458 | - | "state": "US-OH", |
|
| 459 | - | "photo": "https://static.inaturalist.org/photos/25544020/medium.jpeg", |
|
| 460 | - | "summary": null, |
|
| 461 | - | "wikiUrl": "http://en.wikipedia.org/wiki/White-breasted_nuthatch" |
|
| 492 | + | commonName: "White-breasted Nuthatch", |
|
| 493 | + | scientificName: "Sitta carolinensis", |
|
| 494 | + | date: "2019-02-17", |
|
| 495 | + | location: "Rittman", |
|
| 496 | + | state: "US-OH", |
|
| 497 | + | photo: "https://static.inaturalist.org/photos/25544020/medium.jpeg", |
|
| 498 | + | summary: null, |
|
| 499 | + | wikiUrl: "http://en.wikipedia.org/wiki/White-breasted_nuthatch", |
|
| 462 | 500 | }, |
|
| 463 | 501 | { |
|
| 464 | - | "commonName": "White-throated Sparrow", |
|
| 465 | - | "scientificName": "Zonotrichia albicollis", |
|
| 466 | - | "date": "2025-11-19", |
|
| 467 | - | "location": "Coolidge Park", |
|
| 468 | - | "state": "US-TN", |
|
| 469 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/23268661/medium.jpg", |
|
| 470 | - | "summary": null, |
|
| 471 | - | "wikiUrl": "https://en.wikipedia.org/wiki/White-throated_sparrow" |
|
| 502 | + | commonName: "White-throated Sparrow", |
|
| 503 | + | scientificName: "Zonotrichia albicollis", |
|
| 504 | + | date: "2025-11-19", |
|
| 505 | + | location: "Coolidge Park", |
|
| 506 | + | state: "US-TN", |
|
| 507 | + | photo: |
|
| 508 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/23268661/medium.jpg", |
|
| 509 | + | summary: null, |
|
| 510 | + | wikiUrl: "https://en.wikipedia.org/wiki/White-throated_sparrow", |
|
| 472 | 511 | }, |
|
| 473 | 512 | { |
|
| 474 | - | "commonName": "Yellow-bellied Sapsucker", |
|
| 475 | - | "scientificName": "Sphyrapicus varius", |
|
| 476 | - | "date": "2025-10-23", |
|
| 477 | - | "location": "Home", |
|
| 478 | - | "state": "US-TN", |
|
| 479 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/294094189/medium.jpeg", |
|
| 480 | - | "summary": null, |
|
| 481 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Yellow-bellied_sapsucker" |
|
| 513 | + | commonName: "Yellow-bellied Sapsucker", |
|
| 514 | + | scientificName: "Sphyrapicus varius", |
|
| 515 | + | date: "2025-10-23", |
|
| 516 | + | location: "Home", |
|
| 517 | + | state: "US-TN", |
|
| 518 | + | photo: |
|
| 519 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/294094189/medium.jpeg", |
|
| 520 | + | summary: null, |
|
| 521 | + | wikiUrl: "http://en.wikipedia.org/wiki/Yellow-bellied_sapsucker", |
|
| 482 | 522 | }, |
|
| 483 | 523 | { |
|
| 484 | - | "commonName": "Yellow-rumped Warbler", |
|
| 485 | - | "scientificName": "Setophaga coronata", |
|
| 486 | - | "date": "2026-01-02", |
|
| 487 | - | "location": "Reflection", |
|
| 488 | - | "state": "US-TN", |
|
| 489 | - | "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/128439522/medium.jpg", |
|
| 490 | - | "summary": null, |
|
| 491 | - | "wikiUrl": "http://en.wikipedia.org/wiki/Yellow-rumped_warbler" |
|
| 492 | - | } |
|
| 524 | + | commonName: "Yellow-rumped Warbler", |
|
| 525 | + | scientificName: "Setophaga coronata", |
|
| 526 | + | date: "2026-01-02", |
|
| 527 | + | location: "Reflection", |
|
| 528 | + | state: "US-TN", |
|
| 529 | + | photo: |
|
| 530 | + | "https://inaturalist-open-data.s3.amazonaws.com/photos/128439522/medium.jpg", |
|
| 531 | + | summary: null, |
|
| 532 | + | wikiUrl: "http://en.wikipedia.org/wiki/Yellow-rumped_warbler", |
|
| 533 | + | }, |
|
| 493 | 534 | ]; |
| 65 | 65 | title: "/uses", |
|
| 66 | 66 | path: "/uses", |
|
| 67 | 67 | }, |
|
| 68 | - | { |
|
| 69 | - | title: "/ai", |
|
| 70 | - | path: "/ai" |
|
| 71 | - | }, |
|
| 68 | + | { |
|
| 69 | + | title: "/ai", |
|
| 70 | + | path: "/ai", |
|
| 71 | + | }, |
|
| 72 | 72 | { |
|
| 73 | 73 | title: "/photos", |
|
| 74 | 74 | path: "https://steve.photo", |
| 24 | 24 | import ipfsCliImg from "@/assets/projects/ipfs-cli.webp"; |
|
| 25 | 25 | ||
| 26 | 26 | export type ProjectItem = { |
|
| 27 | - | title: string; |
|
| 28 | - | description: string; |
|
| 29 | - | image: ImageMetadata; |
|
| 30 | - | link: string; |
|
| 31 | - | tags: string[]; |
|
| 27 | + | title: string; |
|
| 28 | + | description: string; |
|
| 29 | + | image: ImageMetadata; |
|
| 30 | + | link: string; |
|
| 31 | + | tags: string[]; |
|
| 32 | 32 | }; |
|
| 33 | 33 | ||
| 34 | 34 | export const projects: ProjectItem[] = [ |
|
| 35 | - | { |
|
| 36 | - | title: "Bullets", |
|
| 37 | - | description: "Originally built as a companion to Feeds, Bullets is a minimal RSS TUI that lets you browse feeds. Simply provide a URL, or several, and Bullets will render a list of posts that can be opened in the browser. There is no feed tracking, database, or even marking posts as read or unread. It follows the same minimal philosophy of Feeds where you get a list of posts and you can read them as you wish, or pass in a feed that you may only want to view every now and then.", |
|
| 38 | - | image: bulletsImg, |
|
| 39 | - | link: "https://github.com/stevedylandev/bullets", |
|
| 40 | - | tags: ["blogging", "rss", "tui"] |
|
| 41 | - | }, |
|
| 42 | - | { |
|
| 43 | - | title: "Andromeda", |
|
| 44 | - | description: |
|
| 45 | - | "A collection of personal and self hostable software written in Rust. Each app is minimal and focuses on low memory and data usage. Includes common needs like an RSS reader, markdown note taker, even a micro blogging platform. Andromeda also includes a base Rust stack and agent skills that can be used to build more basic web applications.", |
|
| 46 | - | image: andromedaImg, |
|
| 47 | - | link: "https://andromeda.build", |
|
| 48 | - | tags: ["productivity", "self hosting"], |
|
| 49 | - | }, |
|
| 50 | - | { |
|
| 51 | - | title: "Scout", |
|
| 52 | - | description: |
|
| 53 | - | "A minimal iOS Gemini Protocol client in SwiftUI. I became really interested in the Gemini Protocol and didn’t like the existing options out there for iOS, so I built my own. Was a good learning experience and thoroughly enjoy the final product. Features things like bookmarks, searching, themes, client certificates, you name it. Currently in the process of publishing to the App Store.", |
|
| 54 | - | image: scoutImg, |
|
| 55 | - | link: "https://github.com/stevedylandev/Scout", |
|
| 56 | - | tags: ["privacy", "networking"], |
|
| 57 | - | }, |
|
| 58 | - | { |
|
| 59 | - | title: "Sequoia", |
|
| 60 | - | description: |
|
| 61 | - | "While there are several blogging platform options for publishing standard.stie lexicons, there wasn’t much out there for self-hosted blogs. This prompted me to build Sequoia: a CLI that helps take existing blogs and publish them to ATProto. It features an interactive setup, flexible config to meet any SSG or framework, and even the necessary pieces for verification of standard.site lexicons.", |
|
| 62 | - | image: sequoiaImg, |
|
| 63 | - | link: "https://sequoia.pub", |
|
| 64 | - | tags: ["blogging", "atproto", "standard site", "cli"], |
|
| 65 | - | }, |
|
| 66 | - | { |
|
| 67 | - | title: "Alcove", |
|
| 68 | - | description: |
|
| 69 | - | "RSS and blogs pose to be a solution for freedom speech, however RSS readers with sync capabilities often result in a ‘wont be evil’ promise in regards to privacy of what you read. Alcove brings a ‘cant be evil’ tech stack to the table. This app uses Evolu to enable end to end encrption for reading RSS feeds while giving people the ability to sync their reader across multiple devices.", |
|
| 70 | - | image: alcoveImg, |
|
| 71 | - | link: "https://stevedylan.dev/posts/introducing-alcove/", |
|
| 72 | - | tags: ["blogging", "privacy", "rss"], |
|
| 73 | - | }, |
|
| 74 | - | { |
|
| 75 | - | title: "Sipp", |
|
| 76 | - | description: |
|
| 77 | - | "Minimal code sharing app for the web and the terminal, written in Rust. A single ~13MB binary contains a web server, TUI, and CLI. Easy to self host and access through your browser or your terminal. Loads of features such as syntax highlighting, config to authenticated selected endpoints, and CLI actions to quickly create snippets from files.", |
|
| 78 | - | image: sippImg, |
|
| 79 | - | link: "https://andromeda.build/apps/sipp", |
|
| 80 | - | tags: ["developer tools", "productivity", "self hosting"], |
|
| 81 | - | }, |
|
| 82 | - | { |
|
| 83 | - | title: "Parcels", |
|
| 84 | - | description: |
|
| 85 | - | "A minimal package tracking app written in Rust, designed to be self hosted for personal use.", |
|
| 86 | - | image: parcelsImg, |
|
| 87 | - | link: "https://andromeda.build/apps/parcels", |
|
| 88 | - | tags: ["productivity", "self hosting"], |
|
| 89 | - | }, |
|
| 90 | - | { |
|
| 91 | - | title: "Feeds", |
|
| 92 | - | description: |
|
| 93 | - | "A minimal take on an RSS reader, Feeds lets you pull from multiple sources of feeds including URL query params, OPML files, and FreshRSS. Instead of rendering the post, Feeds simply gives you a feed link so you can view the content in its original context. Feeds is also designed to be simple and easy to self host for your own use cases.", |
|
| 94 | - | image: feedsImg, |
|
| 95 | - | link: "https://andromeda.build/apps/feeds", |
|
| 96 | - | tags: ["blogging", "rss", "self hosted"], |
|
| 97 | - | }, |
|
| 98 | - | { |
|
| 99 | - | title: "Docs.surf", |
|
| 100 | - | description: |
|
| 101 | - | "I’ve slowly been falling into ATProto and what it can enable for publishing content on the web, and building a more open web in general. With ATProto you can create records on your server (PDS) that have specific structures known as lexicons. One in particular that is taking of is standard.site. There are two lexicons, Publications and Documents. Both are designed for building interoperable blog posts that can be aggregated. That’s exactly what Docs.surf does, using a mixture of Tap (ATProtos indexer), Cloudflare workers, queues, and D1 databases.", |
|
| 102 | - | image: docsSurfImg, |
|
| 103 | - | link: "https://docs.surf", |
|
| 104 | - | tags: ["blogging", "atproto", "social networking"], |
|
| 105 | - | }, |
|
| 106 | - | { |
|
| 107 | - | title: "BlogFeeds.net", |
|
| 108 | - | description: |
|
| 109 | - | "I’ve personally found the potential of using blogs, rss, and feeds as a replacment for social media. This website is a simple static site that promotes the idea and includes an FreshRSS API proxy to feature people who have the same philosophy and include a feeds page on their blog.", |
|
| 110 | - | image: blogFeedsImg, |
|
| 111 | - | link: "https://blogfeeds.net", |
|
| 112 | - | tags: ["social networking", "blogging"], |
|
| 113 | - | }, |
|
| 114 | - | { |
|
| 115 | - | title: "norns", |
|
| 116 | - | description: |
|
| 117 | - | "Over the years I’ve noticed how so many decentralized applications on EVM chains have slowly built up heavy dependency trees. With some of the supplychain hacks occurring on NPM, I decided it would be a good idea to build atomic web components that achieve all the basic functionality needed to build dApps. The result was norns, which is a library + CLI for simple EVM UI components. Much like shadcn/ui you can import the raw code to your framework or vanilla HTML file and they won’t ever break since they have zero dependencies or base framework; just JavaScript.", |
|
| 118 | - | image: nornsImg, |
|
| 119 | - | link: "https://norns.so", |
|
| 120 | - | tags: ["blockchain", "developer tools", "web frameworks"], |
|
| 121 | - | }, |
|
| 122 | - | { |
|
| 123 | - | title: "Orbiter", |
|
| 124 | - | description: |
|
| 125 | - | "In a world full of complicated CI/CD pipelines there’s a desire for a simpler solution for hosting static websites. Orbiter is a service that does just that, letting people upload and create a static site in 30 seconds. It’s currently being built by Steve along side Justin Hunter and feautes an open platform approach using IPFS and blockchain.", |
|
| 126 | - | image: orbiterImg, |
|
| 127 | - | link: "https://orbiter.host", |
|
| 128 | - | tags: ["ipfs", "blockchain", "developer tools"], |
|
| 129 | - | }, |
|
| 130 | - | { |
|
| 131 | - | title: "bhvr", |
|
| 132 | - | description: |
|
| 133 | - | "I stopped using Next.js and Vercel a while ago due to the amount of vendor lock-in the stack introduced. As an alternative I started using a combination of a Vite + React frontend with a Hono backend. I was setting up separate repos so many times I decided to turn it into a monorepo using Bun. bhvr is a simple barebones template that helps people setup their own project with the same stack, featuring a shared package folder for types that can be used in both server and client. More importantly, each piece can easily be pulled out from one hosting provider and used in another, making it portable and independent.", |
|
| 134 | - | image: bhvrImg, |
|
| 135 | - | link: "https://bhvr.dev", |
|
| 136 | - | tags: ["developer tools", "web frameworks"], |
|
| 137 | - | }, |
|
| 138 | - | { |
|
| 139 | - | title: "Darkmatter", |
|
| 140 | - | description: |
|
| 141 | - | "I got tired of seeing so many developer use terminal emulators that required a login or had paywalls, so I put together a quickstart terminal build using Ghostty. The result is a great DX with all the tools you need, and setting you up to customize it yourself. It also brought about a new theme under the same name, which has been ported to Neovim and Zed if you’re interested.", |
|
| 142 | - | image: darkmatterImg, |
|
| 143 | - | link: "https://github.com/stevedylandev/darkmatter", |
|
| 144 | - | tags: ["developer tools", "neovim", "terminal"], |
|
| 145 | - | }, |
|
| 146 | - | { |
|
| 147 | - | title: "Atlas", |
|
| 148 | - | description: |
|
| 149 | - | "A simple yet powerful CLI for ENS queries and utilities. Can resolve different types of records for names or addresses, as well as provide a printed profile, hashes, or ENS contract deployments", |
|
| 150 | - | image: atlasImg, |
|
| 151 | - | link: "https://github.com/stevedylandev/atlas", |
|
| 152 | - | tags: ["developer tools", "ens", "blockchain"], |
|
| 153 | - | }, |
|
| 154 | - | { |
|
| 155 | - | title: "IPCM", |
|
| 156 | - | description: |
|
| 157 | - | "IPCM (InterPlanetary CID Mapping) is a blockchain approach to solving the problem of dynamic IPFS data. Instead of using a slower solution like IPNS to point to new content, IPCM is a smart contract that is used as the source of truth for a piece of dynamic content. It features a simple state that can only be updated by the owner of the contract but read by anyone, as well as a public version history through Solidity events.", |
|
| 158 | - | image: ipcmImg, |
|
| 159 | - | link: "https://ipcm.dev", |
|
| 160 | - | tags: ["blockchain", "ipfs", "developer tools"], |
|
| 161 | - | }, |
|
| 162 | - | { |
|
| 163 | - | title: "Pi-Widget", |
|
| 164 | - | description: |
|
| 165 | - | "A small server written in Go that you can run on your Raspberry Pi to display vitals in real time. For my particular Pi it displays IPFS repo stats and system stats, with more updates on the way", |
|
| 166 | - | image: piImg, |
|
| 167 | - | link: "https://github.com/stevedylandev/pi-widget", |
|
| 168 | - | tags: ["hardware", "ipfs", "raspberry pi"], |
|
| 169 | - | }, |
|
| 170 | - | { |
|
| 171 | - | title: "Radicalize", |
|
| 172 | - | description: |
|
| 173 | - | "A CLI written in Go that can help migrate existing local or remote git repos to Radicle.xyz", |
|
| 174 | - | image: radicalizeImg, |
|
| 175 | - | link: "https://github.com/stevedylandev/radicalize", |
|
| 176 | - | tags: ["developer tools", "radicle", "git"], |
|
| 177 | - | }, |
|
| 178 | - | { |
|
| 179 | - | title: "Snippets", |
|
| 180 | - | description: |
|
| 181 | - | "I was tired of poor code sharing experiences like Pastebin that were littered with ads, and I really loved the experience of Ray.so for images. This led to the creation of Snippets.so, an open sourced and extensible code sharing solution that’s minimal and clean.", |
|
| 182 | - | image: snippetsImg, |
|
| 183 | - | link: "https://snippets.so", |
|
| 184 | - | tags: ["developer tools", "ipfs", "productivity"], |
|
| 185 | - | }, |
|
| 186 | - | { |
|
| 187 | - | title: "Pinata SDK", |
|
| 188 | - | description: |
|
| 189 | - | "The original Pinata SDK was written for Node.js years ago, and as the developer ecosystem evolved a more flexible SDK was necessary. This project was a full typescript rewrite from scratch that includes a whole new developer experience that intuitive, with far more methods and capabilities than before.", |
|
| 190 | - | image: pinataSdkImg, |
|
| 191 | - | link: "https://docs.pinata.cloud/sdk", |
|
| 192 | - | tags: ["developer tools", "ipfs"], |
|
| 193 | - | }, |
|
| 194 | - | { |
|
| 195 | - | title: "Cosmic Cowboys", |
|
| 196 | - | description: |
|
| 197 | - | "This was a hackathon project that I worked on with two coworkers during EthOnline 2023. The goal was to build a blockchain game that used AI NPCs with ERC-6551. I handled all the smart contract work and bits and pieces of the web app. Overall we had a pretty unique experience and glimpse into the future of gaming, and it was chosen as a finalist project.", |
|
| 198 | - | image: cosmicCowboysImg, |
|
| 199 | - | link: "https://ethglobal.com/showcase/cosmic-cowboys-3q0co", |
|
| 200 | - | tags: ["blockchain", "ai", "ipfs"], |
|
| 201 | - | }, |
|
| 202 | - | { |
|
| 203 | - | title: "Pinata IPFS CLI", |
|
| 204 | - | description: |
|
| 205 | - | "A Go rewrite of the Node.js CLI for Pinata, allows fast and extensive uploads to Pinata. Also includes helpful features for listing files and other API functionalities. ", |
|
| 206 | - | image: ipfsCliImg, |
|
| 207 | - | link: "https://github.com/PinataCloud/ipfs-cli", |
|
| 208 | - | tags: ["developer tools", "ipfs"], |
|
| 209 | - | }, |
|
| 35 | + | { |
|
| 36 | + | title: "Bullets", |
|
| 37 | + | description: |
|
| 38 | + | "Originally built as a companion to Feeds, Bullets is a minimal RSS TUI that lets you browse feeds. Simply provide a URL, or several, and Bullets will render a list of posts that can be opened in the browser. There is no feed tracking, database, or even marking posts as read or unread. It follows the same minimal philosophy of Feeds where you get a list of posts and you can read them as you wish, or pass in a feed that you may only want to view every now and then.", |
|
| 39 | + | image: bulletsImg, |
|
| 40 | + | link: "https://github.com/stevedylandev/bullets", |
|
| 41 | + | tags: ["blogging", "rss", "tui"], |
|
| 42 | + | }, |
|
| 43 | + | { |
|
| 44 | + | title: "Andromeda", |
|
| 45 | + | description: |
|
| 46 | + | "A collection of personal and self hostable software written in Rust. Each app is minimal and focuses on low memory and data usage. Includes common needs like an RSS reader, markdown note taker, even a micro blogging platform. Andromeda also includes a base Rust stack and agent skills that can be used to build more basic web applications.", |
|
| 47 | + | image: andromedaImg, |
|
| 48 | + | link: "https://andromeda.build", |
|
| 49 | + | tags: ["productivity", "self hosting"], |
|
| 50 | + | }, |
|
| 51 | + | { |
|
| 52 | + | title: "Scout", |
|
| 53 | + | description: |
|
| 54 | + | "A minimal iOS Gemini Protocol client in SwiftUI. I became really interested in the Gemini Protocol and didn’t like the existing options out there for iOS, so I built my own. Was a good learning experience and thoroughly enjoy the final product. Features things like bookmarks, searching, themes, client certificates, you name it. Currently in the process of publishing to the App Store.", |
|
| 55 | + | image: scoutImg, |
|
| 56 | + | link: "https://github.com/stevedylandev/Scout", |
|
| 57 | + | tags: ["privacy", "networking"], |
|
| 58 | + | }, |
|
| 59 | + | { |
|
| 60 | + | title: "Sequoia", |
|
| 61 | + | description: |
|
| 62 | + | "While there are several blogging platform options for publishing standard.stie lexicons, there wasn’t much out there for self-hosted blogs. This prompted me to build Sequoia: a CLI that helps take existing blogs and publish them to ATProto. It features an interactive setup, flexible config to meet any SSG or framework, and even the necessary pieces for verification of standard.site lexicons.", |
|
| 63 | + | image: sequoiaImg, |
|
| 64 | + | link: "https://sequoia.pub", |
|
| 65 | + | tags: ["blogging", "atproto", "standard site", "cli"], |
|
| 66 | + | }, |
|
| 67 | + | { |
|
| 68 | + | title: "Alcove", |
|
| 69 | + | description: |
|
| 70 | + | "RSS and blogs pose to be a solution for freedom speech, however RSS readers with sync capabilities often result in a ‘wont be evil’ promise in regards to privacy of what you read. Alcove brings a ‘cant be evil’ tech stack to the table. This app uses Evolu to enable end to end encrption for reading RSS feeds while giving people the ability to sync their reader across multiple devices.", |
|
| 71 | + | image: alcoveImg, |
|
| 72 | + | link: "https://stevedylan.dev/posts/introducing-alcove/", |
|
| 73 | + | tags: ["blogging", "privacy", "rss"], |
|
| 74 | + | }, |
|
| 75 | + | { |
|
| 76 | + | title: "Sipp", |
|
| 77 | + | description: |
|
| 78 | + | "Minimal code sharing app for the web and the terminal, written in Rust. A single ~13MB binary contains a web server, TUI, and CLI. Easy to self host and access through your browser or your terminal. Loads of features such as syntax highlighting, config to authenticated selected endpoints, and CLI actions to quickly create snippets from files.", |
|
| 79 | + | image: sippImg, |
|
| 80 | + | link: "https://andromeda.build/apps/sipp", |
|
| 81 | + | tags: ["developer tools", "productivity", "self hosting"], |
|
| 82 | + | }, |
|
| 83 | + | { |
|
| 84 | + | title: "Parcels", |
|
| 85 | + | description: |
|
| 86 | + | "A minimal package tracking app written in Rust, designed to be self hosted for personal use.", |
|
| 87 | + | image: parcelsImg, |
|
| 88 | + | link: "https://andromeda.build/apps/parcels", |
|
| 89 | + | tags: ["productivity", "self hosting"], |
|
| 90 | + | }, |
|
| 91 | + | { |
|
| 92 | + | title: "Feeds", |
|
| 93 | + | description: |
|
| 94 | + | "A minimal take on an RSS reader, Feeds lets you pull from multiple sources of feeds including URL query params, OPML files, and FreshRSS. Instead of rendering the post, Feeds simply gives you a feed link so you can view the content in its original context. Feeds is also designed to be simple and easy to self host for your own use cases.", |
|
| 95 | + | image: feedsImg, |
|
| 96 | + | link: "https://andromeda.build/apps/feeds", |
|
| 97 | + | tags: ["blogging", "rss", "self hosted"], |
|
| 98 | + | }, |
|
| 99 | + | { |
|
| 100 | + | title: "Docs.surf", |
|
| 101 | + | description: |
|
| 102 | + | "I’ve slowly been falling into ATProto and what it can enable for publishing content on the web, and building a more open web in general. With ATProto you can create records on your server (PDS) that have specific structures known as lexicons. One in particular that is taking of is standard.site. There are two lexicons, Publications and Documents. Both are designed for building interoperable blog posts that can be aggregated. That’s exactly what Docs.surf does, using a mixture of Tap (ATProtos indexer), Cloudflare workers, queues, and D1 databases.", |
|
| 103 | + | image: docsSurfImg, |
|
| 104 | + | link: "https://docs.surf", |
|
| 105 | + | tags: ["blogging", "atproto", "social networking"], |
|
| 106 | + | }, |
|
| 107 | + | { |
|
| 108 | + | title: "BlogFeeds.net", |
|
| 109 | + | description: |
|
| 110 | + | "I’ve personally found the potential of using blogs, rss, and feeds as a replacment for social media. This website is a simple static site that promotes the idea and includes an FreshRSS API proxy to feature people who have the same philosophy and include a feeds page on their blog.", |
|
| 111 | + | image: blogFeedsImg, |
|
| 112 | + | link: "https://blogfeeds.net", |
|
| 113 | + | tags: ["social networking", "blogging"], |
|
| 114 | + | }, |
|
| 115 | + | { |
|
| 116 | + | title: "norns", |
|
| 117 | + | description: |
|
| 118 | + | "Over the years I’ve noticed how so many decentralized applications on EVM chains have slowly built up heavy dependency trees. With some of the supplychain hacks occurring on NPM, I decided it would be a good idea to build atomic web components that achieve all the basic functionality needed to build dApps. The result was norns, which is a library + CLI for simple EVM UI components. Much like shadcn/ui you can import the raw code to your framework or vanilla HTML file and they won’t ever break since they have zero dependencies or base framework; just JavaScript.", |
|
| 119 | + | image: nornsImg, |
|
| 120 | + | link: "https://norns.so", |
|
| 121 | + | tags: ["blockchain", "developer tools", "web frameworks"], |
|
| 122 | + | }, |
|
| 123 | + | { |
|
| 124 | + | title: "Orbiter", |
|
| 125 | + | description: |
|
| 126 | + | "In a world full of complicated CI/CD pipelines there’s a desire for a simpler solution for hosting static websites. Orbiter is a service that does just that, letting people upload and create a static site in 30 seconds. It’s currently being built by Steve along side Justin Hunter and feautes an open platform approach using IPFS and blockchain.", |
|
| 127 | + | image: orbiterImg, |
|
| 128 | + | link: "https://orbiter.host", |
|
| 129 | + | tags: ["ipfs", "blockchain", "developer tools"], |
|
| 130 | + | }, |
|
| 131 | + | { |
|
| 132 | + | title: "bhvr", |
|
| 133 | + | description: |
|
| 134 | + | "I stopped using Next.js and Vercel a while ago due to the amount of vendor lock-in the stack introduced. As an alternative I started using a combination of a Vite + React frontend with a Hono backend. I was setting up separate repos so many times I decided to turn it into a monorepo using Bun. bhvr is a simple barebones template that helps people setup their own project with the same stack, featuring a shared package folder for types that can be used in both server and client. More importantly, each piece can easily be pulled out from one hosting provider and used in another, making it portable and independent.", |
|
| 135 | + | image: bhvrImg, |
|
| 136 | + | link: "https://bhvr.dev", |
|
| 137 | + | tags: ["developer tools", "web frameworks"], |
|
| 138 | + | }, |
|
| 139 | + | { |
|
| 140 | + | title: "Darkmatter", |
|
| 141 | + | description: |
|
| 142 | + | "I got tired of seeing so many developer use terminal emulators that required a login or had paywalls, so I put together a quickstart terminal build using Ghostty. The result is a great DX with all the tools you need, and setting you up to customize it yourself. It also brought about a new theme under the same name, which has been ported to Neovim and Zed if you’re interested.", |
|
| 143 | + | image: darkmatterImg, |
|
| 144 | + | link: "https://github.com/stevedylandev/darkmatter", |
|
| 145 | + | tags: ["developer tools", "neovim", "terminal"], |
|
| 146 | + | }, |
|
| 147 | + | { |
|
| 148 | + | title: "Atlas", |
|
| 149 | + | description: |
|
| 150 | + | "A simple yet powerful CLI for ENS queries and utilities. Can resolve different types of records for names or addresses, as well as provide a printed profile, hashes, or ENS contract deployments", |
|
| 151 | + | image: atlasImg, |
|
| 152 | + | link: "https://github.com/stevedylandev/atlas", |
|
| 153 | + | tags: ["developer tools", "ens", "blockchain"], |
|
| 154 | + | }, |
|
| 155 | + | { |
|
| 156 | + | title: "IPCM", |
|
| 157 | + | description: |
|
| 158 | + | "IPCM (InterPlanetary CID Mapping) is a blockchain approach to solving the problem of dynamic IPFS data. Instead of using a slower solution like IPNS to point to new content, IPCM is a smart contract that is used as the source of truth for a piece of dynamic content. It features a simple state that can only be updated by the owner of the contract but read by anyone, as well as a public version history through Solidity events.", |
|
| 159 | + | image: ipcmImg, |
|
| 160 | + | link: "https://ipcm.dev", |
|
| 161 | + | tags: ["blockchain", "ipfs", "developer tools"], |
|
| 162 | + | }, |
|
| 163 | + | { |
|
| 164 | + | title: "Pi-Widget", |
|
| 165 | + | description: |
|
| 166 | + | "A small server written in Go that you can run on your Raspberry Pi to display vitals in real time. For my particular Pi it displays IPFS repo stats and system stats, with more updates on the way", |
|
| 167 | + | image: piImg, |
|
| 168 | + | link: "https://github.com/stevedylandev/pi-widget", |
|
| 169 | + | tags: ["hardware", "ipfs", "raspberry pi"], |
|
| 170 | + | }, |
|
| 171 | + | { |
|
| 172 | + | title: "Radicalize", |
|
| 173 | + | description: |
|
| 174 | + | "A CLI written in Go that can help migrate existing local or remote git repos to Radicle.xyz", |
|
| 175 | + | image: radicalizeImg, |
|
| 176 | + | link: "https://github.com/stevedylandev/radicalize", |
|
| 177 | + | tags: ["developer tools", "radicle", "git"], |
|
| 178 | + | }, |
|
| 179 | + | { |
|
| 180 | + | title: "Snippets", |
|
| 181 | + | description: |
|
| 182 | + | "I was tired of poor code sharing experiences like Pastebin that were littered with ads, and I really loved the experience of Ray.so for images. This led to the creation of Snippets.so, an open sourced and extensible code sharing solution that’s minimal and clean.", |
|
| 183 | + | image: snippetsImg, |
|
| 184 | + | link: "https://snippets.so", |
|
| 185 | + | tags: ["developer tools", "ipfs", "productivity"], |
|
| 186 | + | }, |
|
| 187 | + | { |
|
| 188 | + | title: "Pinata SDK", |
|
| 189 | + | description: |
|
| 190 | + | "The original Pinata SDK was written for Node.js years ago, and as the developer ecosystem evolved a more flexible SDK was necessary. This project was a full typescript rewrite from scratch that includes a whole new developer experience that intuitive, with far more methods and capabilities than before.", |
|
| 191 | + | image: pinataSdkImg, |
|
| 192 | + | link: "https://docs.pinata.cloud/sdk", |
|
| 193 | + | tags: ["developer tools", "ipfs"], |
|
| 194 | + | }, |
|
| 195 | + | { |
|
| 196 | + | title: "Cosmic Cowboys", |
|
| 197 | + | description: |
|
| 198 | + | "This was a hackathon project that I worked on with two coworkers during EthOnline 2023. The goal was to build a blockchain game that used AI NPCs with ERC-6551. I handled all the smart contract work and bits and pieces of the web app. Overall we had a pretty unique experience and glimpse into the future of gaming, and it was chosen as a finalist project.", |
|
| 199 | + | image: cosmicCowboysImg, |
|
| 200 | + | link: "https://ethglobal.com/showcase/cosmic-cowboys-3q0co", |
|
| 201 | + | tags: ["blockchain", "ai", "ipfs"], |
|
| 202 | + | }, |
|
| 203 | + | { |
|
| 204 | + | title: "Pinata IPFS CLI", |
|
| 205 | + | description: |
|
| 206 | + | "A Go rewrite of the Node.js CLI for Pinata, allows fast and extensive uploads to Pinata. Also includes helpful features for listing files and other API functionalities. ", |
|
| 207 | + | image: ipfsCliImg, |
|
| 208 | + | link: "https://github.com/PinataCloud/ipfs-cli", |
|
| 209 | + | tags: ["developer tools", "ipfs"], |
|
| 210 | + | }, |
|
| 210 | 211 | ]; |
| 3 | 3 | import { Content } from "../content/pages/about.mdx"; |
|
| 4 | 4 | ||
| 5 | 5 | const meta = { |
|
| 6 | - | title: "/about", |
|
| 6 | + | title: "/about", |
|
| 7 | 7 | description: "More about Steve Simkins", |
|
| 8 | 8 | }; |
|
| 9 | 9 | --- |
| 3 | 3 | import { Content } from "../content/pages/ai.mdx"; |
|
| 4 | 4 | ||
| 5 | 5 | const meta = { |
|
| 6 | - | title: "/ai", |
|
| 6 | + | title: "/ai", |
|
| 7 | 7 | description: "My personal philosophy and use of AI", |
|
| 8 | 8 | }; |
|
| 9 | 9 | --- |
| 5 | 5 | import { getFormattedDate } from "@/utils"; |
|
| 6 | 6 | ||
| 7 | 7 | type Artwork = { |
|
| 8 | - | date: string; |
|
| 9 | - | artwork_id: number; |
|
| 10 | - | title: string; |
|
| 11 | - | artist_display: string | null; |
|
| 12 | - | date_display: string | null; |
|
| 13 | - | medium_display: string | null; |
|
| 14 | - | dimensions: string | null; |
|
| 15 | - | place_of_origin: string | null; |
|
| 16 | - | credit_line: string | null; |
|
| 17 | - | short_description: string | null; |
|
| 18 | - | image_id: string | null; |
|
| 19 | - | image_url: string | null; |
|
| 20 | - | source_url: string | null; |
|
| 8 | + | date: string; |
|
| 9 | + | artwork_id: number; |
|
| 10 | + | title: string; |
|
| 11 | + | artist_display: string | null; |
|
| 12 | + | date_display: string | null; |
|
| 13 | + | medium_display: string | null; |
|
| 14 | + | dimensions: string | null; |
|
| 15 | + | place_of_origin: string | null; |
|
| 16 | + | credit_line: string | null; |
|
| 17 | + | short_description: string | null; |
|
| 18 | + | image_id: string | null; |
|
| 19 | + | image_url: string | null; |
|
| 20 | + | source_url: string | null; |
|
| 21 | 21 | }; |
|
| 22 | 22 | ||
| 23 | 23 | const meta = { |
|
| 24 | - | title: "/art-calendar", |
|
| 25 | - | description: |
|
| 26 | - | "A different painting every day from the Art Institute of Chicago.", |
|
| 24 | + | title: "/art-calendar", |
|
| 25 | + | description: |
|
| 26 | + | "A different painting every day from the Art Institute of Chicago.", |
|
| 27 | 27 | }; |
|
| 28 | 28 | ||
| 29 | 29 | const FEED_URL = "https://easel.stevedylan.dev/feed.xml"; |
|
| 33 | 33 | let error: string | null = null; |
|
| 34 | 34 | ||
| 35 | 35 | try { |
|
| 36 | - | const res = await fetch("https://easel.stevedylan.dev/api/today", { |
|
| 37 | - | headers: { Accept: "application/json" }, |
|
| 38 | - | }); |
|
| 39 | - | if (!res.ok) throw new Error(`easel returned ${res.status}`); |
|
| 40 | - | artwork = (await res.json()) as Artwork; |
|
| 36 | + | const res = await fetch("https://easel.stevedylan.dev/api/today", { |
|
| 37 | + | headers: { Accept: "application/json" }, |
|
| 38 | + | }); |
|
| 39 | + | if (!res.ok) throw new Error(`easel returned ${res.status}`); |
|
| 40 | + | artwork = (await res.json()) as Artwork; |
|
| 41 | 41 | } catch (e) { |
|
| 42 | - | error = e instanceof Error ? e.message : "Failed to reach easel API"; |
|
| 42 | + | error = e instanceof Error ? e.message : "Failed to reach easel API"; |
|
| 43 | 43 | } |
|
| 44 | 44 | ||
| 45 | 45 | Astro.response.headers.set( |
|
| 46 | - | "Cache-Control", |
|
| 47 | - | "public, max-age=3600, s-maxage=86400", |
|
| 46 | + | "Cache-Control", |
|
| 47 | + | "public, max-age=3600, s-maxage=86400", |
|
| 48 | 48 | ); |
|
| 49 | 49 | --- |
|
| 50 | 50 | ||
| 4 | 4 | ||
| 5 | 5 | const meta = { |
|
| 6 | 6 | title: "/murmurations", |
|
| 7 | - | description: "Birds, math, and poetry in motion", |
|
| 7 | + | description: "Birds, math, and poetry in motion", |
|
| 8 | 8 | }; |
|
| 9 | 9 | --- |
|
| 10 | 10 |