diff --git a/assets/css/_extra.scss b/assets/css/_extra.scss index ccbfd4b2..dbf6c23d 100644 --- a/assets/css/_extra.scss +++ b/assets/css/_extra.scss @@ -16,4 +16,174 @@ } // Import callout styles -@import 'callouts'; \ No newline at end of file +@import 'callouts'; + +// Series indicator on list pages +.series-indicator { + display: inline-block; + padding: 0.25rem 0.75rem; + margin-left: 0.5rem; + background: var(--series-bg, #e3f2fd); + color: var(--series-text, #1976d2); + border-radius: 4px; + font-size: 0.85rem; + font-weight: 500; + vertical-align: middle; + + svg { + width: 14px; + height: 14px; + margin-right: 0.25rem; + vertical-align: -2px; + } +} + +@media (prefers-color-scheme: dark) { + .series-indicator { + background: rgba(33, 150, 243, 0.15); + color: rgba(144, 202, 249, 1); + } +} + +// Series navigation styling +.series-box { + background: var(--card-bg, #f5f5f5); + border: 1px solid var(--border-color, #e0e0e0); + border-radius: 8px; + padding: 1.5rem; + margin: 2rem 0; + + .series-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; + font-size: 1.1rem; + + .series-part { + color: var(--secondary-text, #666); + font-size: 0.9rem; + } + } + + .series-nav { + margin: 1rem 0; + + .series-list { + list-style: none; + padding-left: 0; + margin: 0; + + li { + padding: 0.5rem 0; + border-left: 3px solid transparent; + padding-left: 1rem; + + &.current { + border-left-color: var(--primary-color, #007bff); + background: var(--highlight-bg, rgba(0, 123, 255, 0.05)); + margin-left: -1rem; + padding-left: calc(1rem + 1rem); + margin-right: -1rem; + padding-right: 1rem; + } + + a { + color: var(--link-color, #007bff); + text-decoration: none; + + &:hover { + text-decoration: underline; + } + } + } + } + } + + .series-navigation { + margin-top: 1.5rem; + padding-top: 1.5rem; + border-top: 1px solid var(--border-color, #e0e0e0); + + .series-nav-links { + display: flex; + justify-content: space-between; + align-items: center; + gap: 1rem; + + .series-prev, + .series-next { + flex: 1; + padding: 0.5rem 1rem; + border-radius: 4px; + text-decoration: none; + transition: background-color 0.2s; + } + + .series-prev { + text-align: left; + background: var(--button-bg, #f0f0f0); + color: var(--link-color, #007bff); + + &:hover:not(.disabled) { + background: var(--button-hover-bg, #e0e0e0); + } + + &.disabled { + color: var(--disabled-text, #999); + cursor: not-allowed; + } + } + + .series-next { + text-align: right; + background: var(--button-bg, #f0f0f0); + color: var(--link-color, #007bff); + + &:hover:not(.disabled) { + background: var(--button-hover-bg, #e0e0e0); + } + + &.disabled { + color: var(--disabled-text, #999); + cursor: not-allowed; + } + } + } + } +} + +// Dark mode support +@media (prefers-color-scheme: dark) { + .series-box { + background: rgba(255, 255, 255, 0.05); + border-color: rgba(255, 255, 255, 0.1); + + .series-header .series-part { + color: rgba(255, 255, 255, 0.7); + } + + .series-nav .series-list li.current { + background: rgba(255, 255, 255, 0.05); + } + + .series-navigation { + border-top-color: rgba(255, 255, 255, 0.1); + + .series-nav-links { + .series-prev, + .series-next { + background: rgba(255, 255, 255, 0.05); + + &:hover:not(.disabled) { + background: rgba(255, 255, 255, 0.1); + } + + &.disabled { + color: rgba(255, 255, 255, 0.3); + } + } + } + } + } +} \ No newline at end of file diff --git a/config.toml b/config.toml index e5aaae53..b10771c2 100644 --- a/config.toml +++ b/config.toml @@ -2,6 +2,11 @@ baseURL = 'https://blog.kestrelsnest.social' languageCode = 'en-us' title = "Kestrel's Nest" theme = "m10c" + +[taxonomies] + tag = "tags" + category = "categories" + series = "series" [params] author = "Eric Wagoner" avatar = "face.jpg" diff --git a/content/posts/2025-09-08-from-accidental-discovery-to-agricultural-infrastructure-building-the-worlds-first-online-farmers-market-2002-2011.md b/content/posts/2025-09-08-from-accidental-discovery-to-agricultural-infrastructure-building-the-worlds-first-online-farmers-market-2002-2011.md index 5d9139da..d6775767 100644 --- a/content/posts/2025-09-08-from-accidental-discovery-to-agricultural-infrastructure-building-the-worlds-first-online-farmers-market-2002-2011.md +++ b/content/posts/2025-09-08-from-accidental-discovery-to-agricultural-infrastructure-building-the-worlds-first-online-farmers-market-2002-2011.md @@ -10,6 +10,8 @@ categories: - locallygrown lastmod: 2025-09-22T20:54:42.989Z slug: locallygrown-origin-story +series: ["LocallyGrown.net: The 23-Year Journey"] +series_order: 1 --- _How a failed wholesale experiment in Athens, Georgia became the foundation for nationwide local food systems_ @@ -251,4 +253,4 @@ _This is part one of a series documenting the creation, evolution, and rescue of 3. [The Architecture Challenge: Translating 19 Years of Rails Logic to Modern SvelteKit](https://blog.kestrelsnest.social/posts/locallygrown-rails-svelte-migration/) 4. [The Reality of Production: When Hope Meets Live Users](https://blog.kestrelsnest.social/posts/locallygrown-reality-of-production/) 5. [Lessons from the Solo Developer Using Modern Tools](https://blog.kestrelsnest.social/posts/locallygrown-lessons/) -6. The Future: Building on Modern Foundations +6. [From Survival to Sustainability: The Next 20 Years for LocallyGrown.net](https://blog.kestrelsnest.social/posts/locallygrown-survival-to-sustainability/) diff --git a/content/posts/2025-09-09-the-23-year-rescue-mission-saving-agricultural-innovation-from-technical-extinction.md b/content/posts/2025-09-09-the-23-year-rescue-mission-saving-agricultural-innovation-from-technical-extinction.md index 19e98621..82f5e890 100644 --- a/content/posts/2025-09-09-the-23-year-rescue-mission-saving-agricultural-innovation-from-technical-extinction.md +++ b/content/posts/2025-09-09-the-23-year-rescue-mission-saving-agricultural-innovation-from-technical-extinction.md @@ -12,6 +12,8 @@ lastmod: 2025-09-22T20:54:49.481Z keywords: - locallygrown slug: locallygrown-rescue-mission +series: ["LocallyGrown.net: The 23-Year Journey"] +series_order: 2 --- _How a platform serving thousands of farmers and customers nearly died from its own success—and the impossible choice I had to make to save it_ @@ -253,4 +255,4 @@ _This is part two of a series documenting the rescue and modernization of Locall 3. [The Architecture Challenge: Translating 19 Years of Rails Logic to Modern SvelteKit](https://blog.kestrelsnest.social/posts/locallygrown-rails-svelte-migration/) 4. [The Reality of Production: When Hope Meets Live Users](https://blog.kestrelsnest.social/posts/locallygrown-reality-of-production/) 5. [Lessons from the Solo Developer Using Modern Tools](https://blog.kestrelsnest.social/posts/locallygrown-lessons/) -6. The Future: Building on Modern Foundations +6. [From Survival to Sustainability: The Next 20 Years for LocallyGrown.net](https://blog.kestrelsnest.social/posts/locallygrown-survival-to-sustainability/) diff --git a/content/posts/2025-09-15-the-architecture-challenge-translating-19-years-of-rails-logic-to-modern-sveltekit.md b/content/posts/2025-09-15-the-architecture-challenge-translating-19-years-of-rails-logic-to-modern-sveltekit.md index cf076ccf..18f7b216 100644 --- a/content/posts/2025-09-15-the-architecture-challenge-translating-19-years-of-rails-logic-to-modern-sveltekit.md +++ b/content/posts/2025-09-15-the-architecture-challenge-translating-19-years-of-rails-logic-to-modern-sveltekit.md @@ -17,6 +17,8 @@ keywords: - svelte - rails slug: locallygrown-rails-svelte-migration +series: ["LocallyGrown.net: The 23-Year Journey"] +series_order: 3 --- _How I migrated decades of complex ActiveRecord relationships, subdomain multitenancy, and business logic to a modern stack without losing a single feature_ @@ -985,4 +987,4 @@ Part 4 is the messy part: real users, real money, and the bugs that only show up 3. **The Architecture Challenge: Translating 19 Years of Rails Logic to Modern SvelteKit** ← _You are here_ 4. [The Reality of Production: When Hope Meets Live Users](https://blog.kestrelsnest.social/posts/locallygrown-reality-of-production/) 5. [Lessons from the Solo Developer Using Modern Tools](https://blog.kestrelsnest.social/posts/locallygrown-lessons/) -6. The Future: Building on Modern Foundations +6. [From Survival to Sustainability: The Next 20 Years for LocallyGrown.net](https://blog.kestrelsnest.social/posts/locallygrown-survival-to-sustainability/) diff --git a/content/posts/2025-09-17-the-reality-of-production-when-hope-meets-live-users.md b/content/posts/2025-09-17-the-reality-of-production-when-hope-meets-live-users.md index 89863731..eb03d0d6 100644 --- a/content/posts/2025-09-17-the-reality-of-production-when-hope-meets-live-users.md +++ b/content/posts/2025-09-17-the-reality-of-production-when-hope-meets-live-users.md @@ -17,6 +17,8 @@ keywords: - svelte - rails slug: locallygrown-reality-of-production +series: ["LocallyGrown.net: The 23-Year Journey"] +series_order: 4 --- _Three thousand passing tests don't mean your system works_ @@ -351,4 +353,4 @@ _This is part four of a series documenting the rescue and modernization of Local 3. [The Architecture Challenge: Translating 19 Years of Rails Logic to Modern SvelteKit](https://blog.kestrelsnest.social/posts/locallygrown-architecture-challenge/) 4. **The Reality of Production: When Hope Meets Live Users** ← _You are here_ 5. [Lessons from the Solo Developer Using Modern Tools](https://blog.kestrelsnest.social/posts/locallygrown-lessons/) -6. The Future: Building on Modern Foundations +6. [From Survival to Sustainability: The Next 20 Years for LocallyGrown.net](https://blog.kestrelsnest.social/posts/locallygrown-survival-to-sustainability/) diff --git a/content/posts/2025-09-22-lessons-from-the-solo-developer-trenches.md b/content/posts/2025-09-22-lessons-from-the-solo-developer-trenches.md index 57c00a39..d8238b06 100644 --- a/content/posts/2025-09-22-lessons-from-the-solo-developer-trenches.md +++ b/content/posts/2025-09-22-lessons-from-the-solo-developer-trenches.md @@ -22,6 +22,8 @@ keywords: - rails - claude slug: locallygrown-lessons +series: ["LocallyGrown.net: The 23-Year Journey"] +series_order: 5 --- _Advanced Developer Tools, Real Tradeoffs_ @@ -1177,4 +1179,4 @@ _This is part five of a series documenting the rescue and modernization of Local 3. [The Architecture Challenge: Translating 19 Years of Rails Logic to Modern SvelteKit](https://blog.kestrelsnest.social/posts/locallygrown-architecture-challenge/) 4. [The Reality of Production: When Hope Meets Live Users](https://blog.kestrelsnest.social/posts/locallygrown-reality-of-production/) 5. **Lessons from the Solo Developer Using Modern Tools** ← _You are here_ -6. The Future: Building on Modern Foundations +6. [From Survival to Sustainability: The Next 20 Years for LocallyGrown.net](https://blog.kestrelsnest.social/posts/locallygrown-survival-to-sustainability/) diff --git a/content/posts/2025-09-29-from-survival-to-sustainability-the-next-20-years-for-locallygrownnet.md b/content/posts/2025-09-29-from-survival-to-sustainability-the-next-20-years-for-locallygrownnet.md new file mode 100644 index 00000000..6eac434d --- /dev/null +++ b/content/posts/2025-09-29-from-survival-to-sustainability-the-next-20-years-for-locallygrownnet.md @@ -0,0 +1,241 @@ +--- +title: "From Survival to Sustainability: The Next 20 Years for LocallyGrown.net" +description: Six weeks after the rebuild, the crisis is over. Here’s the focused roadmap—EBT access, delivery tools, and quiet reliability—for community-run, multi-grower markets. +date: 2025-09-29T04:24:13.598Z +preview: "" +draft: false +tags: + - locallygrown +categories: + - locallygrown +lastmod: 2025-09-29T05:11:13.711Z +keywords: + - locallygrown +slug: locallygrown-survival-to-sustainability +series: + - "LocallyGrown.net: The 23-Year Journey" +series_order: 6 +--- + +_Why saving a 23-year-old farmers market platform matters more now than ever—and how modern architecture enables the next chapter of local food systems_ + +--- + +## TL;DR + +{{< callout type="warning" title="The Path Forward" >}} +Six weeks post-launch, I'm still squashing bugs daily, but the existential crisis is over. The platform that was one hardware failure away from extinction now has a solid foundation. With a clear niche (community-run, multi-grower cooperative markets), I'm focused on thoughtful improvements: automation that removes friction, EBT support for equitable access, and delivery tools for the last mile. This is about preserving vital community infrastructure that hundreds of growers and thousands of customers rely on. +{{< /callout >}} + +--- + +Over the last five posts, I've walked you through a 23-year journey. I started with an accidental discovery that became pioneering infrastructure for a movement that barely existed. I sat with you in the crushing weight of a 14-year technical stagnation that brought the platform to the brink of extinction. I dissected the six-month, part-time rescue mission to rebuild everything from scratch, the architectural choices that made it possible, and the modern tools that made it feasible for a solo developer. And I lived through the brutal, humbling reality of the post-launch "bug apocalypse". + +Six weeks after launch, after hundreds of commits and countless fixes, the platform has stabilized. I'm still fixing bugs (two just today) and keeping an eagle eye on Sentry metrics while refining performance. But the constant, gnawing anxiety of imminent server failure that I lived with for years is gone. The old Rails app that could die at any moment has been replaced by a modern system that, while still needing attention, is fundamentally sound. For the first time in a long time, I can think beyond just keeping the lights on. I can think about the future. + +But the world LocallyGrown.net has been reborn into is not the one it left behind. The local food movement I helped nurture is now a vibrant, competitive industry. So, for this final post in the series, I want to talk about what's next. It's time to look at the crowded landscape I now find myself in, define my place in it, and chart a course for the future. + +## Finding My Place in a Crowded Field + +When I started this in 2002, the idea of an online farmers market was a novelty. Today, it's a standard. Dozens of companies, many of them well-funded, now offer sophisticated platforms for selling local food. To understand where I go from here, I first have to understand where I fit. + +The competitive landscape is diverse, with platforms specializing in different parts of the local food ecosystem: + +- **Platforms for Individual Farms:** Solutions like GrazeCart are built "by farmers for farmers," offering an all-in-one system for a single farm to manage its e-commerce and in-person POS sales, with a strong focus on features like selling meat by weight. + +- **Comprehensive Food Hub Software:** Competitors like Local Food Marketplace provide powerful, all-in-one SaaS solutions for established food hubs, farms, and CSAs that need to manage multiple sales channels, from direct-to-consumer to wholesale. + +- **The Modern SaaS Powerhouse:** Then there's a competitor like Local Line, a feature-rich "farm-to-fork commerce platform" that serves both suppliers and wholesale buyers. With sophisticated tools for subscriptions, custom price lists for different customer types (retail vs. wholesale), and advanced inventory management, it's a powerful option for farms ready to scale their operations. + +Seeing this, it would be easy to feel outmatched. But that analysis is missing the point. It's also missing my history. These platforms aren't competitors so much as fellow travelers, each serving different needs in the growing local food ecosystem. The diversity of solutions reflects the diversity of communities we all serve. We’re not competing to replace each other so much as completing the ecosystem from different angles. + +LocallyGrown.net was never just a generic e-commerce platform. It was built to solve a specific problem for a specific type of organization: the community-run, multi-grower, cooperative online market. My core innovation wasn't just a shopping cart; it was the "Predictable Harvesting" model that the software enabled. Farmers harvest only what's been pre-ordered, eliminating waste while giving customers the full selection of a farmers market with the convenience of online shopping. I helped de-risk small-scale farming by eliminating waste and gave customers unprecedented choice and convenience, combining the best of farmers markets, CSAs, and buying clubs. + +That is still my niche. That is still my strength. I am not trying to build the best platform for a single farm selling meat, nor am I building a sourcing platform for national grocery chains. I am, and will remain, focused on building the best platform for a community that wants to build its own online market together. My 23 years of experience are focused on that single, powerful goal. + +## The Path Forward: From Stability to Service + +The rescue was about survival. The future is about service. Having a stable, modern platform means I can finally stop patching holes and start building bridges. I can add features that make a real difference in the day-to-day lives of the market managers and growers who depend on this system. I can't match the big competitors feature for feature, but I can be smarter and more focused. My roadmap is about adding thoughtful improvements that align with the core mission of the platform. + +### 1. Small Automations, Big Impact + +One of the most consistent pieces of feedback I get revolves around the manual work of running a market cycle. A simple but powerful improvement is to automate the market schedule. Market managers should be able to set their ordering windows (when the market opens for shopping and when it closes) on a recurring schedule and then forget about it. No more late-night logins to manually open the market. This is a perfect example of a subtle automation that removes a recurring point of friction and frees up a manager's time for more important work. + +### 2. Expanding Access with Online EBT + +A core principle of local food is that it should be for everyone. A major step toward that goal is accepting SNAP/EBT payments online. This is not a simple feature to add. It involves a rigorous authorization process with the USDA's Food and Nutrition Service (FNS) to become an approved online SNAP retailer. An e-commerce platform must meet specific technical requirements for secure, encrypted PIN entry and submit a letter of intent to the FNS to even begin the process. While SNAP benefits can only be used for eligible food items and not for delivery or service fees, offering this payment option is a critical quality-of-life improvement that makes local food more accessible to more members of the community. It's a complex challenge, but it's one that goes to the very heart of what LocallyGrown.net is about. + +{{< callout type="info" title="Why this matters" >}} +Nationally, SNAP participation skews rural, and rural broadband can be spotty. Enabling secure online EBT reduces travel burdens, expands choice, and keeps dollars circulating locally. +{{< /callout >}} + +### 3. Solving the Last Mile: Better Delivery Support + +As more markets explore delivery, the logistical challenges become clear. It's one thing to have customers pick up from a central point; it's another to efficiently route deliveries to dozens of individual homes. While I have no intention of building a full-blown transportation management system like those used by large-scale haulers, there is a clear need for better delivery tools. This means features like delivery route management and optimization, which are common in CSA-focused software. The goal is to give market managers the tools they need to plan efficient routes, manage drivers, and provide customers with accurate delivery information, making home delivery a viable and scalable option. + +## A Renewed Commitment + +Knowing who I am is the first step. The next is committing to a path that honors my past while ensuring a sustainable future. The rescue mission was a success, but it came with hard-won lessons. The existential risk is no longer technical failure. It's ensuring that local food remains accessible to all communities, not just those with privilege. The next challenge is about equity, reach, and sustainability in the truest sense. + +Moving forward, my commitment is threefold: + +**First, a commitment to stability and trust.** Six weeks post-launch, I'm still fixing bugs and watching metrics like a hawk. The "bug apocalypse" taught me that my code has real-world consequences for people running their businesses. My first priority will always be quiet reliability and responding quickly to the needs of my users. + +**Second, a commitment to my story.** I can't outspend or out-develop the competition, and I won't try. My strength is my authenticity: 23 years of being built from within the local food movement, by a grower who lived the problems he was solving. I will continue to build a platform that reflects that unique experience. + +**Finally, a commitment to never again.** The 14-year stagnation was a crisis born from perpetually deferred maintenance. That will not happen again. A portion of my development time is now permanently allocated to the unglamorous but essential work of keeping the platform healthy. I will never again be one hardware failure away from extinction. + +## The Current State: By the Numbers + +As of September 2025, LocallyGrown.net serves: + +- 25+ active markets across North America +- 500+ growers and food producers +- Thousands of customers weekly +- Over $1.3 million in annual sales flowing directly to small farms + +These aren't Silicon Valley numbers, and they never will be. But they represent real communities, real farms, and real families making a living from the land. + +## The Technical Foundation for the Future + +The modern SvelteKit architecture I've built isn't just about escaping Rails. It's about enabling capabilities that were impossible before. The new, decoupled service layer means I can integrate complex third-party APIs for things like EBT and delivery logistics without risking the stability of the core platform—a task that would have been impossible on the old Rails monolith. Every integration point is now isolated, testable, and replaceable. A failed Stripe webhook can't bring down the shopping experience. A slow USDA API call for EBT verification won't freeze the entire application. This architecture makes the ambitious roadmap above not just possible, but achievable for a solo developer. + +### Mobile-First by Default + +```svelte + +