From 257d484add5ec36a9519c06cde4ef9b1c54f3eb7 Mon Sep 17 00:00:00 2001 From: cha0s Date: Wed, 31 Jan 2024 06:13:38 -0600 Subject: [PATCH] 612569f25405ab6833b1d2428a5840edae0c4545 --- 404.html | 2 +- assets/js/{7279d61b.b26424e3.js => 7279d61b.e41b20e5.js} | 2 +- assets/js/{89927158.593780f0.js => 89927158.537fbd2c.js} | 2 +- assets/js/{a0957561.44f59c72.js => a0957561.77649b93.js} | 2 +- ...runtime~main.13cb1aa2.js => runtime~main.1e74adc2.js} | 2 +- blog/archive/index.html | 2 +- blog/atom.xml | 7 +++++-- blog/index.html | 2 +- blog/introducing-flecks/index.html | 9 ++++++--- blog/rss.xml | 7 +++++-- blog/tags/announcement/index.html | 2 +- blog/tags/flecks/index.html | 2 +- blog/tags/index.html | 2 +- blog/tags/introducing/index.html | 2 +- blog/tags/release/index.html | 2 +- docs/adding-flecks/index.html | 2 +- docs/building/index.html | 2 +- docs/category/generated-details/index.html | 2 +- docs/category/getting-started/index.html | 2 +- docs/category/guides/index.html | 2 +- docs/category/writing-your-flecks/index.html | 2 +- docs/cli/index.html | 2 +- docs/configuration/index.html | 2 +- docs/creating-a-fleck/index.html | 2 +- docs/database/index.html | 2 +- docs/docker/index.html | 2 +- docs/documentation/index.html | 2 +- docs/electron/index.html | 2 +- docs/environment/index.html | 2 +- docs/flecks/build-files/index.html | 2 +- docs/flecks/config/index.html | 2 +- docs/flecks/hooks/index.html | 2 +- docs/flecks/todos/index.html | 2 +- docs/gathering/index.html | 2 +- docs/hooks/index.html | 2 +- docs/index.html | 2 +- docs/installation/index.html | 2 +- docs/ordering/index.html | 2 +- docs/package-json/index.html | 2 +- docs/platforms/index.html | 2 +- docs/react/index.html | 2 +- docs/redux/index.html | 2 +- docs/repl/index.html | 2 +- docs/sockets/index.html | 2 +- docs/testing/index.html | 2 +- flecks/index.html | 2 +- index.html | 2 +- 47 files changed, 60 insertions(+), 51 deletions(-) rename assets/js/{7279d61b.b26424e3.js => 7279d61b.e41b20e5.js} (97%) rename assets/js/{89927158.593780f0.js => 89927158.537fbd2c.js} (90%) rename assets/js/{a0957561.44f59c72.js => a0957561.77649b93.js} (96%) rename assets/js/{runtime~main.13cb1aa2.js => runtime~main.1e74adc2.js} (97%) diff --git a/404.html b/404.html index eebf48b0..4edbb809 100644 --- a/404.html +++ b/404.html @@ -5,7 +5,7 @@ Page Not Found | flecks - + diff --git a/assets/js/7279d61b.b26424e3.js b/assets/js/7279d61b.e41b20e5.js similarity index 97% rename from assets/js/7279d61b.b26424e3.js rename to assets/js/7279d61b.e41b20e5.js index ae217ef6..e26e35d3 100644 --- a/assets/js/7279d61b.b26424e3.js +++ b/assets/js/7279d61b.e41b20e5.js @@ -1 +1 @@ -"use strict";(self.webpackChunkflecks_docusaurus=self.webpackChunkflecks_docusaurus||[]).push([[3729],{1053:(e,t,n)=>{n.r(t),n.d(t,{Tiny:()=>u,assets:()=>i,contentTitle:()=>o,default:()=>f,frontMatter:()=>a,metadata:()=>l,toc:()=>r});var s=n(5893),c=n(1151);n(9960);const a={title:"flecks: NOT a fullstack framework",description:"Introducing flecks: an exceptionally-extensible application production system.",slug:"introducing-flecks",authors:[{name:"cha0s",title:"Creator of flecks",url:"https://github.com/cha0s",image_url:"https://github.com/cha0s.png"}],tags:["announcement","introducing","flecks","release"],hide_table_of_contents:!1},o=void 0,l={permalink:"/flecks/blog/introducing-flecks",source:"@site/blog/2024-01-30-introducing-flecks.mdx",title:"flecks: NOT a fullstack framework",description:"Introducing flecks: an exceptionally-extensible application production system.",date:"2024-01-30T00:00:00.000Z",formattedDate:"January 30, 2024",tags:[{label:"announcement",permalink:"/flecks/blog/tags/announcement"},{label:"introducing",permalink:"/flecks/blog/tags/introducing"},{label:"flecks",permalink:"/flecks/blog/tags/flecks"},{label:"release",permalink:"/flecks/blog/tags/release"}],readingTime:7.465,hasTruncateMarker:!0,authors:[{name:"cha0s",title:"Creator of flecks",url:"https://github.com/cha0s",image_url:"https://github.com/cha0s.png",imageURL:"https://github.com/cha0s.png"}],frontMatter:{title:"flecks: NOT a fullstack framework",description:"Introducing flecks: an exceptionally-extensible application production system.",slug:"introducing-flecks",authors:[{name:"cha0s",title:"Creator of flecks",url:"https://github.com/cha0s",image_url:"https://github.com/cha0s.png",imageURL:"https://github.com/cha0s.png"}],tags:["announcement","introducing","flecks","release"],hide_table_of_contents:!1},unlisted:!1},i={authorsImageUrls:[void 0]},r=[];function u({children:e}){const t={span:"span",...(0,c.a)()};return(0,s.jsx)(t.span,{style:{fontSize:"0.75em"},children:e})}function p(e){const t={p:"p",strong:"strong",...(0,c.a)(),...e.components};return(0,s.jsxs)(t.p,{children:["Introducing flecks: an ",(0,s.jsx)(t.strong,{children:"exceptionally-extensible application production system"}),"."]})}function f(e={}){const{wrapper:t}={...(0,c.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>o});var s=n(7294);const c={},a=s.createContext(c);function o(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:o(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkflecks_docusaurus=self.webpackChunkflecks_docusaurus||[]).push([[3729],{1053:(e,t,n)=>{n.r(t),n.d(t,{Tiny:()=>u,assets:()=>i,contentTitle:()=>o,default:()=>f,frontMatter:()=>a,metadata:()=>l,toc:()=>r});var s=n(5893),c=n(1151);n(9960);const a={title:"flecks: NOT a fullstack framework",description:"Introducing flecks: an exceptionally-extensible application production system.",slug:"introducing-flecks",authors:[{name:"cha0s",title:"Creator of flecks",url:"https://github.com/cha0s",image_url:"https://github.com/cha0s.png"}],tags:["announcement","introducing","flecks","release"],hide_table_of_contents:!1},o=void 0,l={permalink:"/flecks/blog/introducing-flecks",source:"@site/blog/2024-01-30-introducing-flecks.mdx",title:"flecks: NOT a fullstack framework",description:"Introducing flecks: an exceptionally-extensible application production system.",date:"2024-01-30T00:00:00.000Z",formattedDate:"January 30, 2024",tags:[{label:"announcement",permalink:"/flecks/blog/tags/announcement"},{label:"introducing",permalink:"/flecks/blog/tags/introducing"},{label:"flecks",permalink:"/flecks/blog/tags/flecks"},{label:"release",permalink:"/flecks/blog/tags/release"}],readingTime:7.635,hasTruncateMarker:!0,authors:[{name:"cha0s",title:"Creator of flecks",url:"https://github.com/cha0s",image_url:"https://github.com/cha0s.png",imageURL:"https://github.com/cha0s.png"}],frontMatter:{title:"flecks: NOT a fullstack framework",description:"Introducing flecks: an exceptionally-extensible application production system.",slug:"introducing-flecks",authors:[{name:"cha0s",title:"Creator of flecks",url:"https://github.com/cha0s",image_url:"https://github.com/cha0s.png",imageURL:"https://github.com/cha0s.png"}],tags:["announcement","introducing","flecks","release"],hide_table_of_contents:!1},unlisted:!1},i={authorsImageUrls:[void 0]},r=[];function u({children:e}){const t={span:"span",...(0,c.a)()};return(0,s.jsx)(t.span,{style:{fontSize:"0.75em"},children:e})}function p(e){const t={p:"p",strong:"strong",...(0,c.a)(),...e.components};return(0,s.jsxs)(t.p,{children:["Introducing flecks: an ",(0,s.jsx)(t.strong,{children:"exceptionally-extensible application production system"}),"."]})}function f(e={}){const{wrapper:t}={...(0,c.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>o});var s=n(7294);const c={},a=s.createContext(c);function o(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:o(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/89927158.593780f0.js b/assets/js/89927158.537fbd2c.js similarity index 90% rename from assets/js/89927158.593780f0.js rename to assets/js/89927158.537fbd2c.js index cfdc4b27..0ebaa472 100644 --- a/assets/js/89927158.593780f0.js +++ b/assets/js/89927158.537fbd2c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkflecks_docusaurus=self.webpackChunkflecks_docusaurus||[]).push([[5563],{1620:(e,t,n)=>{n.r(t),n.d(t,{Tiny:()=>d,assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>a,metadata:()=>l,toc:()=>h});var s=n(5893),i=n(1151),o=n(9960);const a={title:"flecks: NOT a fullstack framework",description:"Introducing flecks: an exceptionally-extensible application production system.",slug:"introducing-flecks",authors:[{name:"cha0s",title:"Creator of flecks",url:"https://github.com/cha0s",image_url:"https://github.com/cha0s.png"}],tags:["announcement","introducing","flecks","release"],hide_table_of_contents:!1},r=void 0,l={permalink:"/flecks/blog/introducing-flecks",source:"@site/blog/2024-01-30-introducing-flecks.mdx",title:"flecks: NOT a fullstack framework",description:"Introducing flecks: an exceptionally-extensible application production system.",date:"2024-01-30T00:00:00.000Z",formattedDate:"January 30, 2024",tags:[{label:"announcement",permalink:"/flecks/blog/tags/announcement"},{label:"introducing",permalink:"/flecks/blog/tags/introducing"},{label:"flecks",permalink:"/flecks/blog/tags/flecks"},{label:"release",permalink:"/flecks/blog/tags/release"}],readingTime:7.465,hasTruncateMarker:!0,authors:[{name:"cha0s",title:"Creator of flecks",url:"https://github.com/cha0s",image_url:"https://github.com/cha0s.png",imageURL:"https://github.com/cha0s.png"}],frontMatter:{title:"flecks: NOT a fullstack framework",description:"Introducing flecks: an exceptionally-extensible application production system.",slug:"introducing-flecks",authors:[{name:"cha0s",title:"Creator of flecks",url:"https://github.com/cha0s",image_url:"https://github.com/cha0s.png",imageURL:"https://github.com/cha0s.png"}],tags:["announcement","introducing","flecks","release"],hide_table_of_contents:!1},unlisted:!1},c={authorsImageUrls:[void 0]},h=[{value:"First off, thanks for your time \ud83d\ude4f",id:"first-off-thanks-for-your-time-pray",level:2},{value:"Is it webscale fullstack?",id:"is-it-webscale-fullstack",level:2},{value:"For real, though",id:"for-real-though",level:3},{value:"Don't get it twisted",id:"dont-get-it-twisted",level:3},{value:"Do one thing and do it well",id:"do-one-thing-and-do-it-well",level:2},{value:"Small core",id:"small-core",level:3},{value:"So where's asset optimization, data fetching, filetree routing, RSC...?",id:"so-wheres-asset-optimization-data-fetching-filetree-routing-rsc",level:3},{value:"Better no abstraction than the wrong abstraction",id:"better-no-abstraction-than-the-wrong-abstraction",level:3},{value:"The flecks way",id:"the-flecks-way",level:3},{value:"Why though?",id:"why-though",level:2},{value:"Separation of concerns",id:"separation-of-concerns",level:3},{value:"Joy",id:"joy",level:3},{value:"Because I can",id:"because-i-can",level:3},{value:"Thanks again",id:"thanks-again",level:2}];function d({children:e}){const t={span:"span",...(0,i.a)()};return(0,s.jsx)(t.span,{style:{fontSize:"0.75em"},children:e})}function u(e){const t={a:"a",admonition:"admonition",code:"code",del:"del",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",mdxAdmonitionTitle:"mdxAdmonitionTitle",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["Introducing flecks: an ",(0,s.jsx)(t.strong,{children:"exceptionally-extensible application production system"}),"."]}),"\n","\n",(0,s.jsxs)(t.h2,{id:"first-off-thanks-for-your-time-pray",children:["First off, thanks for your time ","\ud83d\ude4f"]}),"\n",(0,s.jsxs)(t.p,{children:["I appreciate you checking out the project! I truly hope that you will find working with flecks\nto be a joy. Feedback is welcome over on the\n",(0,s.jsx)(t.a,{href:"https://github.com/cha0s/flecks/discussions",children:"Github discussions page"}),"!"]}),"\n",(0,s.jsx)(t.admonition,{title:'What\'s the letter before "alpha"?',type:"warning",children:(0,s.jsxs)(t.p,{children:["This is a new release and worked on by only one person: ",(0,s.jsx)(t.a,{href:"https://github.com/cha0s",children:"me"}),"! Please\nkeep this in mind!"]})}),"\n",(0,s.jsxs)(t.h2,{id:"is-it-webscale-fullstack",children:["Is it ",(0,s.jsx)(t.del,{children:"webscale"})," fullstack?"]}),"\n",(0,s.jsx)("figure",{children:(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"A screenshot from the 2010 "MongoDB is webscale" cartoon",src:n(6522).Z+"",width:"480",height:"360"}),"\n",(0,s.jsx)("figcaption",{style:{fontSize:"0.8rem"},children:(0,s.jsx)(t.em,{children:"yes, I remember"})})]})}),"\n",(0,s.jsxs)(t.p,{children:["I admit, I clickbaited with the title there just a little bit. I love fullstack! flecks is more\nthan capable of building fullstack applications. If you just want to jump to more of that sort\nof thing, you might be interested in the ",(0,s.jsx)(o.Z,{target:"_blank",to:"https://cha0s.github.io/flecks/docs/react",children:"React"}),"\npage in the documentation."]}),"\n",(0,s.jsx)(t.h3,{id:"for-real-though",children:"For real, though"}),"\n",(0,s.jsxs)(t.p,{children:["A fullstack JS application is basically appception: what you actually have is a server\napplication written in JS that serves a client application written in JS. Using\nthe same language obscures (arguably, ",(0,s.jsx)(t.em,{children:"by design"}),") the fact that these are actually two distinct\napplications."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"A screenshot of Doctor Olivia Octopus saying "There's two, actually"",src:n(3069).Z+"",width:"790",height:"371"})}),"\n",(0,s.jsx)(t.admonition,{title:"Hot take",type:"danger",children:(0,s.jsxs)(t.p,{children:["Some modern framework APIs are becoming increasingly esoteric in their attempt to paper over\nthis reality\n(",(0,s.jsx)(t.a,{href:"https://github.com/cha0s/flecks/blob/master/packages/react/src/client.js#L24",children:(0,s.jsx)(t.em,{children:"*ahem*"})}),"... and\ndon't get me started on ",(0,s.jsx)(t.a,{href:"https://www.mayank.co/blog/react-server-components/",children:(0,s.jsx)(t.strong,{children:"RSC"})}),"...)."]})}),"\n",(0,s.jsx)(t.h3,{id:"dont-get-it-twisted",children:"Don't get it twisted"}),"\n",(0,s.jsxs)(t.p,{children:["To put it in basic terms: A web server is a core aspect of a fullstack application, but ",(0,s.jsx)(t.strong,{children:"a\nweb server is not a core aspect of an application"}),". The same could be said about asset\noptimization, routing, and many other core fullstack JS concepts."]}),"\n",(0,s.jsxs)(t.p,{children:["flecks is concerned with ",(0,s.jsx)(t.strong,{children:"writing applications"}),"; fullstack applications are merely a subset of\nthat."]}),"\n",(0,s.jsx)(t.h2,{id:"do-one-thing-and-do-it-well",children:"Do one thing and do it well"}),"\n",(0,s.jsxs)(t.p,{children:["The core primitive is the ",(0,s.jsx)(t.strong,{children:"fleck"})," which is... just a JS module. There exists a server\nfleck, a web fleck, a React fleck, and so on."]}),"\n",(0,s.jsx)(t.p,{children:"Here's a simple fleck that says hello when the application is starting:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-js",children:"export const hooks = {\n '@flecks/core.starting': () => {\n console.log('hey you');\n },\n};\n"})}),"\n",(0,s.jsxs)(t.p,{children:["That's it. It's a module that exports some hook implementations. If you're curious what kind of\nhooks we're talking about, check out\n",(0,s.jsx)(o.Z,{target:"_blank",to:"https://cha0s.github.io/flecks/docs/flecks/hooks",children:"the hooks reference page"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["You add a reference to your fleck to a file called\n",(0,s.jsx)(o.Z,{target:"_blank",to:"https://cha0s.github.io/flecks/docs/creating-a-fleck",children:(0,s.jsx)(t.code,{children:"flecks.yml"})})," and you're rolling. Again,\n",(0,s.jsx)(t.strong,{children:"a flecks application is just flecks"})," having their hook implementations invoked."]}),"\n",(0,s.jsxs)(t.p,{children:["What are multiple flecks called? ",(0,s.jsx)(t.strong,{children:"flecks"}),"!"]}),"\n",(0,s.jsx)(t.admonition,{title:"Flickin' fleckers",type:"tip",children:(0,s.jsxs)(t.p,{children:["It is not a coincidence that the name of the framework uses the same word as the plural form of\nits constituting elements: the implication is that ",(0,s.jsx)(t.strong,{children:"flecks is just flecks"}),", it's not really doing\nanything special on its own. Sure, it ",(0,s.jsx)(t.em,{children:"does something"}),", but the something that it does is provide\ntools with which to orchestrate your flecks together into an application."]})}),"\n",(0,s.jsx)(t.h3,{id:"small-core",children:"Small core"}),"\n",(0,s.jsxs)(t.p,{children:["Creating an application with ",(0,s.jsx)(t.code,{children:"@flecks/create-app"})," and then doing\ne.g. ",(0,s.jsx)(t.code,{children:"yarn install --production"})," will result in a full working application with a size of\n",(0,s.jsx)(t.strong,{children:"less than 7 MB"}),". Granted, it's only a server that will start, have nothing to do, and halt in\nabout 100 ms, but it illustrates that flecks builds what you tell it to, ",(0,s.jsx)(t.strong,{children:"it is not a kitchen\nsink system"}),"."]}),"\n",(0,s.jsx)("figure",{children:(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"A screenshot of Fry from Futurama captioned "Not sure if you're overly specific or not specific enough"",src:n(1048).Z+"",width:"552",height:"414"}),"\n",(0,s.jsx)("figcaption",{style:{fontSize:"0.8rem"},children:(0,s.jsx)(t.em,{children:"When you're writing an article and curious about how the Big Kid on the Block performs in terms of raw default production application size, but can't even figure out how to measure it because you have already downloaded more than 7MB of ads for their \"hosting solution\" into your brain in the process"})})]})}),"\n",(0,s.jsx)(t.h3,{id:"so-wheres-asset-optimization-data-fetching-filetree-routing-rsc",children:"So where's asset optimization, data fetching, filetree routing, RSC...?"}),"\n",(0,s.jsx)(t.p,{children:"Well, I do admit that I don't stand before you today with a solution for every problem around\nfullstack development."}),"\n",(0,s.jsxs)(t.p,{children:["flecks is made with ",(0,s.jsx)(t.strong,{children:"cooperation and collaboration as a primary concern"}),". A fleck is ",(0,s.jsx)(t.em,{children:"just\na package"})," exactly for that reason: it should be frictionless to publish a package (or a suite)\nto the world and then add them to a project just like you would with any other package! ",(0,s.jsx)(t.strong,{children:"It should\nbe as frictionless"}),' for a developer to say "I don\'t agree with how this fleck is\nimplemented" and write their own, interacting seamlessly with everything else they actually want.']}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"I believe we can design modular solutions to these problems!"})," In order to do this, it's probably\nbetter to be standing on top of less, not more."]}),"\n",(0,s.jsx)(t.h3,{id:"better-no-abstraction-than-the-wrong-abstraction",children:(0,s.jsxs)("ins",{children:["Better ",(0,s.jsx)(t.em,{children:"no"})," abstraction than the ",(0,s.jsx)(t.em,{children:"wrong"})," abstraction"]})}),"\n",(0,s.jsxs)(t.p,{children:["I know this will come off as inflammatory but I ",(0,s.jsx)(t.em,{children:"honestly feel"}),' like some of the more recent\nJS framework "paradigms" feel like someone coding at midnight and having an epiphany about the\n"killer new paradigm" which they are now going to spend the next 5 hours implementing in all\ntheir code only to wake up the next morning absolutely exhausted with a broken codebase and a\ndeep sense of regret as they revert all the changes and pretend that it never happened.']}),"\n",(0,s.jsx)("figure",{children:(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"A picture of a person with their head down pouring coffee all over the place captioned "I'm never drinking again"",src:n(1235).Z+"",width:"480",height:"325"}),"\n",(0,s.jsx)("figcaption",{style:{fontSize:"0.8rem"},children:(0,s.jsxs)(t.em,{children:[(0,s.jsx)(t.strong,{children:"obviously"})," this has never happened to ",(0,s.jsx)(t.strong,{children:"my"})," projects. ",(0,s.jsx)(d,{children:(0,s.jsx)(d,{children:"Also, you ran your credit card the whole time."})})]})})]})}),"\n",(0,s.jsx)(t.h3,{id:"the-flecks-way",children:"The flecks way"}),"\n",(0,s.jsx)(t.p,{children:"The few core architectural opinions that are held are presented as suggestions, not requirements."}),"\n",(0,s.jsxs)(t.admonition,{type:"info",children:[(0,s.jsx)(t.mdxAdmonitionTitle,{children:(0,s.jsx)(t.strong,{children:"\u201cI hold it to be the inalienable right of anybody to go to hell in his own way.\u201d"})}),(0,s.jsx)(t.p,{children:"\u2015 Robert Frost"})]}),"\n",(0,s.jsxs)(t.p,{children:["A few motivating philosophies which I ",(0,s.jsx)(t.strong,{children:"do not"})," consider to be suggestions regarding this\nproject:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["You ",(0,s.jsx)(t.strong,{children:"shouldn't be unpleasantly surprised"})," by what happens"]}),"\n",(0,s.jsxs)(t.li,{children:["Your application has what ",(0,s.jsx)(t.strong,{children:"you"})," want in it, not what ",(0,s.jsx)(t.strong,{children:"flecks"})," wants in it"]}),"\n",(0,s.jsxs)(t.li,{children:["Developer ",(0,s.jsx)(t.strong,{children:"comfort and confidence are essential"}),", not just a nice-to-have"]}),"\n",(0,s.jsxs)(t.li,{children:["You ",(0,s.jsx)(t.strong,{children:"shouldn't have to have a full budget"})," for production deployment"]}),"\n",(0,s.jsxs)(t.li,{children:["Core architectural ",(0,s.jsx)(t.strong,{children:"opinions require transparency and justification"})]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"why-though",children:"Why though?"}),"\n",(0,s.jsx)(t.p,{children:"You might be thinking something like:"}),"\n",(0,s.jsx)("figure",{children:(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"A screenshot of Michael from The Office shouting "NO GOD PLEASE NO"",src:n(9151).Z+"",width:"720",height:"405"}),"\n",(0,s.jsxs)("figcaption",{style:{fontSize:"0.8rem"},children:[(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:"Why?!"})})," ",(0,s.jsx)(t.em,{children:"A new JavaScript framework is the last thing we need."})]})]})}),"\n",(0,s.jsxs)(t.p,{children:["Perhaps you will write a thesis explaining in great detail why there is no\nobjective reason for flecks to exist. ",(0,s.jsx)(t.strong,{children:"I'm fine with that"}),",\n",(0,s.jsx)(d,{children:"because I love it and there's nothing you can do about it."})]}),"\n",(0,s.jsx)(t.p,{children:"Seriously though, a couple reasons why I made flecks and use it to develop applications are:"}),"\n",(0,s.jsx)(t.h3,{id:"separation-of-concerns",children:"Separation of concerns"}),"\n",(0,s.jsxs)(t.p,{children:["JS has matured a lot over the years, and modules are all but a first-class concept. This has been\na huge win for Properly Structured","\u2122\ufe0f"," applications."]}),"\n",(0,s.jsxs)(t.p,{children:["However, I believe the real reason many fullstack frameworks exist today is to\n",(0,s.jsx)(t.em,{children:"centralize concerns"}),". No one wants to set up a whole database, a routing system, a webserver,\netc, ",(0,s.jsxs)(d,{children:["etc, ",(0,s.jsx)(d,{children:"etc."})]})," every time. So, the default approach has been to reach out\nfor a framework to tie it all together. To some extent this is an inevitable evolution."]}),"\n",(0,s.jsx)("figure",{children:(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"Screenshot of Patrick Star with the caption "Push them somewhere else"",src:n(3948).Z+"",width:"478",height:"345"}),"\n",(0,s.jsx)("figcaption",{style:{fontSize:"0.8rem"},children:(0,s.jsxs)(t.em,{children:["You've never even ",(0,s.jsx)(t.strong,{children:"seen"})," a real ",(0,s.jsx)(o.Z,{target:"_blank",to:"https://cha0s.github.io/flecks/docs/redux",children:"duck"})]})})]})}),"\n",(0,s.jsxs)(t.p,{children:["With flecks, the first principle is to push these concerns out into modular units which do one\nthing and do it immaculately.\n",(0,s.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Unix_philosophy",children:"This is not a new concept"}),"! These units can be\ncomposed into an application that does as much or as little as you like, ",(0,s.jsxs)(d,{children:["without requiring\nyour application structure to follow some corporate diktat ",(0,s.jsxs)(d,{children:["requiring you to enter a mailing\naddress to submit a pull request. ",(0,s.jsx)(d,{children:"(don't ask...)"})]})]})]}),"\n",(0,s.jsx)(t.h3,{id:"joy",children:"Joy"}),"\n",(0,s.jsx)("div",{style:{float:"right",padding:"0 1.5rem"},children:(0,s.jsx)(t.img,{alt:"A screenshot of Marie Kondo stating "This one sparks joy."",src:n(8749).Z+"",width:"242",height:"242"})}),"\n",(0,s.jsxs)(t.p,{children:["I have found this structure to work very well and to ",(0,s.jsx)(t.em,{children:"feel pleasant"}),". It's great to get up and\nrunning super quickly without having to repeat a monolithic structure over and over. It's almost\nreminiscent of those small plastic building blocks my parents used to step on. Super fun!"]}),"\n",(0,s.jsxs)(t.p,{children:["I find that I ",(0,s.jsx)(t.strong,{children:"don't have to think about what flecks is doing"})," most of the time, which is exactly\nwhat I want."]}),"\n",(0,s.jsxs)(t.p,{children:["flecks is at its best when you can forget that it exists and everything Just Works","\u2122\ufe0f","."]}),"\n",(0,s.jsx)(t.h3,{id:"because-i-can",children:"Because I can"}),"\n",(0,s.jsx)(t.p,{children:"No, seriously! Over the years interacting with various parts of the JS ecosystem I have experienced\nall manner of closed-minded hostile encounters with people who regrettably lacked the imagination\nto understand something which may have ran counter to the established wisdom of the week."}),"\n",(0,s.jsxs)(t.p,{children:["So I guess anyone who told me that it won't work, doesn't make sense, or other copium-based\nresponses: Here it is! Eat your hearts out and haterz get meme'd on. ","\ud83d\udc85"]}),"\n",(0,s.jsx)(t.h2,{id:"thanks-again",children:"Thanks again"}),"\n",(0,s.jsxs)(t.p,{children:["I do appreciate you reading all that! Come send me love (or threats or whatever) at the\n",(0,s.jsx)(t.a,{href:"https://github.com/cha0s/flecks/discussions",children:"Github discussions page"}),"! ","\ud83d\ude0c"]})]})}function p(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},1235:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/drinking-b50862bbaec8f4900ea0c20af31576bf.jpg"},8749:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/kondo-8ca202a300547b698dedad3b3e1299e0.jpg"},3948:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/over-there-19c01e6cdf39cc325266aa184db093f0.jpg"},9151:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/pls-no-1cfa9e8bc25e1ee3d412e5c5ddbab291.jpg"},1048:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/specific-enough-7a5f7bca00d317ed79832a435f5bcedd.jpg"},3069:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/two-actually-12439fdd460029f7bf3d496e63e09b96.jpg"},6522:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/webscale-c13cfc37833381fdb967bdd730a5d584.jpg"},1151:(e,t,n)=>{n.d(t,{Z:()=>r,a:()=>a});var s=n(7294);const i={},o=s.createContext(i);function a(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkflecks_docusaurus=self.webpackChunkflecks_docusaurus||[]).push([[5563],{1620:(e,t,n)=>{n.r(t),n.d(t,{Tiny:()=>d,assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>a,metadata:()=>l,toc:()=>h});var s=n(5893),i=n(1151),o=n(9960);const a={title:"flecks: NOT a fullstack framework",description:"Introducing flecks: an exceptionally-extensible application production system.",slug:"introducing-flecks",authors:[{name:"cha0s",title:"Creator of flecks",url:"https://github.com/cha0s",image_url:"https://github.com/cha0s.png"}],tags:["announcement","introducing","flecks","release"],hide_table_of_contents:!1},r=void 0,l={permalink:"/flecks/blog/introducing-flecks",source:"@site/blog/2024-01-30-introducing-flecks.mdx",title:"flecks: NOT a fullstack framework",description:"Introducing flecks: an exceptionally-extensible application production system.",date:"2024-01-30T00:00:00.000Z",formattedDate:"January 30, 2024",tags:[{label:"announcement",permalink:"/flecks/blog/tags/announcement"},{label:"introducing",permalink:"/flecks/blog/tags/introducing"},{label:"flecks",permalink:"/flecks/blog/tags/flecks"},{label:"release",permalink:"/flecks/blog/tags/release"}],readingTime:7.635,hasTruncateMarker:!0,authors:[{name:"cha0s",title:"Creator of flecks",url:"https://github.com/cha0s",image_url:"https://github.com/cha0s.png",imageURL:"https://github.com/cha0s.png"}],frontMatter:{title:"flecks: NOT a fullstack framework",description:"Introducing flecks: an exceptionally-extensible application production system.",slug:"introducing-flecks",authors:[{name:"cha0s",title:"Creator of flecks",url:"https://github.com/cha0s",image_url:"https://github.com/cha0s.png",imageURL:"https://github.com/cha0s.png"}],tags:["announcement","introducing","flecks","release"],hide_table_of_contents:!1},unlisted:!1},c={authorsImageUrls:[void 0]},h=[{value:"First off, thanks for your time \ud83d\ude4f",id:"first-off-thanks-for-your-time-pray",level:2},{value:"Is it webscale fullstack?",id:"is-it-webscale-fullstack",level:2},{value:"For real, though",id:"for-real-though",level:3},{value:"Don't get it twisted",id:"dont-get-it-twisted",level:3},{value:"Do one thing and do it well",id:"do-one-thing-and-do-it-well",level:2},{value:"Small core",id:"small-core",level:3},{value:"So where's asset optimization, data fetching, filetree routing, RSC...?",id:"so-wheres-asset-optimization-data-fetching-filetree-routing-rsc",level:3},{value:"Better no abstraction than the wrong abstraction",id:"better-no-abstraction-than-the-wrong-abstraction",level:3},{value:"The flecks way",id:"the-flecks-way",level:3},{value:"Why though?",id:"why-though",level:2},{value:"Separation of concerns",id:"separation-of-concerns",level:3},{value:"Joy",id:"joy",level:3},{value:"Because I can",id:"because-i-can",level:3},{value:"Thanks again",id:"thanks-again",level:2}];function d({children:e}){const t={span:"span",...(0,i.a)()};return(0,s.jsx)(t.span,{style:{fontSize:"0.75em"},children:e})}function u(e){const t={a:"a",admonition:"admonition",code:"code",del:"del",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",mdxAdmonitionTitle:"mdxAdmonitionTitle",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["Introducing flecks: an ",(0,s.jsx)(t.strong,{children:"exceptionally-extensible application production system"}),"."]}),"\n","\n",(0,s.jsxs)(t.h2,{id:"first-off-thanks-for-your-time-pray",children:["First off, thanks for your time ","\ud83d\ude4f"]}),"\n",(0,s.jsxs)(t.p,{children:["I appreciate you checking out the project! I truly hope that you will find working with flecks\nto be a joy. Feedback is welcome over on the\n",(0,s.jsx)(t.a,{href:"https://github.com/cha0s/flecks/discussions",children:"Github discussions page"}),"!"]}),"\n",(0,s.jsx)(t.admonition,{title:'What\'s the letter before "alpha"?',type:"warning",children:(0,s.jsxs)(t.p,{children:["This is a new release and worked on by only one person: ",(0,s.jsx)(t.a,{href:"https://github.com/cha0s",children:"me"}),"! Please\nkeep this in mind!"]})}),"\n",(0,s.jsxs)(t.h2,{id:"is-it-webscale-fullstack",children:["Is it ",(0,s.jsx)(t.del,{children:"webscale"})," fullstack?"]}),"\n",(0,s.jsx)("figure",{children:(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"A screenshot from the 2010 "MongoDB is webscale" cartoon",src:n(6522).Z+"",width:"480",height:"360"}),"\n",(0,s.jsx)("figcaption",{style:{fontSize:"0.8rem"},children:(0,s.jsx)(t.em,{children:"yes, I remember"})})]})}),"\n",(0,s.jsxs)(t.p,{children:["I admit, I clickbaited with the title there just a little bit. I love fullstack! flecks is more\nthan capable of building fullstack applications. If you just want to jump to more of that sort\nof thing, you might be interested in the ",(0,s.jsx)(o.Z,{target:"_blank",to:"https://cha0s.github.io/flecks/docs/react",children:"React"}),"\npage in the documentation."]}),"\n",(0,s.jsx)(t.h3,{id:"for-real-though",children:"For real, though"}),"\n",(0,s.jsxs)(t.p,{children:["A fullstack JS application is basically appception: what you actually have is a server\napplication written in JS that serves a client application written in JS. Using\nthe same language obscures (arguably, ",(0,s.jsx)(t.em,{children:"by design"}),") the fact that these are actually two distinct\napplications."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"A screenshot of Doctor Olivia Octopus saying "There's two, actually"",src:n(3069).Z+"",width:"790",height:"371"})}),"\n",(0,s.jsx)(t.admonition,{title:"Hot take",type:"danger",children:(0,s.jsxs)(t.p,{children:["Some modern framework APIs are becoming increasingly esoteric in their attempt to paper over\nthis reality\n(",(0,s.jsx)(t.a,{href:"https://github.com/cha0s/flecks/blob/master/packages/react/src/client.js#L24",children:(0,s.jsx)(t.em,{children:"*ahem*"})}),"... and\ndon't get me started on ",(0,s.jsx)(t.a,{href:"https://www.mayank.co/blog/react-server-components/",children:(0,s.jsx)(t.strong,{children:"RSC"})}),"...)."]})}),"\n",(0,s.jsx)(t.h3,{id:"dont-get-it-twisted",children:"Don't get it twisted"}),"\n",(0,s.jsxs)(t.p,{children:["To put it in basic terms: A web server is a core aspect of a fullstack application, but ",(0,s.jsx)(t.strong,{children:"a\nweb server is not a core aspect of an application"}),". The same could be said about asset\noptimization, routing, and many other core fullstack JS concepts."]}),"\n",(0,s.jsxs)(t.p,{children:["flecks is concerned with ",(0,s.jsx)(t.strong,{children:"writing applications"}),"; fullstack applications are merely a subset of\nthat."]}),"\n",(0,s.jsx)(t.h2,{id:"do-one-thing-and-do-it-well",children:"Do one thing and do it well"}),"\n",(0,s.jsxs)(t.p,{children:["The core primitive is the ",(0,s.jsx)(t.strong,{children:"fleck"})," which is... just a JS module. There exists a server\nfleck, a web fleck, a React fleck, and so on."]}),"\n",(0,s.jsx)(t.p,{children:"Here's a simple fleck that says hello when the application is starting:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-js",children:"export const hooks = {\n '@flecks/core.starting': () => {\n console.log('hey you');\n },\n};\n"})}),"\n",(0,s.jsxs)(t.p,{children:["That's it. It's a module that exports some hook implementations. If you're curious what kind of\nhooks we're talking about, check out\n",(0,s.jsx)(o.Z,{target:"_blank",to:"https://cha0s.github.io/flecks/docs/flecks/hooks",children:"the hooks reference page"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["You add a reference to your fleck to a file called\n",(0,s.jsx)(o.Z,{target:"_blank",to:"https://cha0s.github.io/flecks/docs/creating-a-fleck",children:(0,s.jsx)(t.code,{children:"flecks.yml"})})," and you're rolling. Again,\n",(0,s.jsx)(t.strong,{children:"a flecks application is just flecks"})," having their hook implementations invoked."]}),"\n",(0,s.jsxs)(t.p,{children:["What are multiple flecks called? ",(0,s.jsx)(t.strong,{children:"flecks"}),"!"]}),"\n",(0,s.jsx)(t.admonition,{title:"Flickin' fleckers",type:"tip",children:(0,s.jsxs)(t.p,{children:["It is not a coincidence that the name of the framework uses the same word as the plural form of\nits constituting elements: the implication is that ",(0,s.jsx)(t.strong,{children:"flecks is just flecks"}),", it's not really doing\nanything special on its own. Sure, it ",(0,s.jsx)(t.em,{children:"does something"}),", but the something that it does is provide\ntools with which to orchestrate your flecks together into an application."]})}),"\n",(0,s.jsx)(t.h3,{id:"small-core",children:"Small core"}),"\n",(0,s.jsxs)(t.p,{children:["Creating an application with ",(0,s.jsx)(t.code,{children:"@flecks/create-app"})," and then doing\ne.g. ",(0,s.jsx)(t.code,{children:"yarn install --production"})," will result in a full working application with a size of\n",(0,s.jsx)(t.strong,{children:"less than 7 MB"}),". Granted, it's only a server that will start, have nothing to do, and halt in\nabout 100 ms, but it illustrates that flecks builds what you tell it to, ",(0,s.jsx)(t.strong,{children:"it is not a kitchen\nsink system"}),"."]}),"\n",(0,s.jsx)("figure",{children:(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"A screenshot of Fry from Futurama captioned "Not sure if you're overly specific or not specific enough"",src:n(1048).Z+"",width:"552",height:"414"}),"\n",(0,s.jsx)("figcaption",{style:{fontSize:"0.8rem"},children:(0,s.jsx)(t.em,{children:"When you're writing an article and curious about how the Big Kid on the Block performs in terms of raw default production application size, but can't even figure out how to measure it because you have already downloaded more than 7MB of ads for their \"hosting solution\" into your brain in the process"})})]})}),"\n",(0,s.jsx)(t.h3,{id:"so-wheres-asset-optimization-data-fetching-filetree-routing-rsc",children:"So where's asset optimization, data fetching, filetree routing, RSC...?"}),"\n",(0,s.jsx)(t.p,{children:"Well, I do admit that I don't stand before you today with a solution for every problem around\nfullstack development."}),"\n",(0,s.jsxs)(t.p,{children:["flecks is made with ",(0,s.jsx)(t.strong,{children:"cooperation and collaboration as a primary concern"}),". A fleck is ",(0,s.jsx)(t.em,{children:"just\na package"})," exactly for that reason: it should be frictionless to publish a package (or a suite)\nto the world and then add them to a project just like you would with any other package! ",(0,s.jsx)(t.strong,{children:"It should\nbe as frictionless"}),' for a developer to say "I don\'t agree with how this fleck is\nimplemented" and write their own, interacting seamlessly with everything else they actually want.']}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"I believe we can design modular solutions to these problems!"})," In order to do this, it's probably\nbetter to be standing on top of less, not more."]}),"\n",(0,s.jsx)(t.h3,{id:"better-no-abstraction-than-the-wrong-abstraction",children:(0,s.jsxs)("ins",{children:["Better ",(0,s.jsx)(t.em,{children:"no"})," abstraction than the ",(0,s.jsx)(t.em,{children:"wrong"})," abstraction"]})}),"\n",(0,s.jsxs)(t.p,{children:["I know this will come off as inflammatory but I ",(0,s.jsx)(t.em,{children:"honestly feel"}),' like some of the more recent\nJS framework "paradigms" feel like someone coding at midnight and having an epiphany about the\n"killer new paradigm" which they are now going to spend the next 5 hours implementing in all\ntheir code only to wake up the next morning absolutely exhausted with a broken codebase and a\ndeep sense of regret as they revert all the changes and pretend that it never happened.']}),"\n",(0,s.jsx)("figure",{children:(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"A picture of a person with their head down pouring coffee all over the place captioned "I'm never drinking again"",src:n(1235).Z+"",width:"480",height:"325"}),"\n",(0,s.jsx)("figcaption",{style:{fontSize:"0.8rem"},children:(0,s.jsxs)(t.em,{children:[(0,s.jsx)(t.strong,{children:"obviously"})," this has never happened to ",(0,s.jsx)(t.strong,{children:"my"})," projects. ",(0,s.jsx)(d,{children:(0,s.jsx)(d,{children:"Also, you ran your credit card the whole time."})})]})})]})}),"\n",(0,s.jsx)(t.h3,{id:"the-flecks-way",children:"The flecks way"}),"\n",(0,s.jsx)(t.p,{children:"The few core architectural opinions that are held are presented as suggestions, not requirements."}),"\n",(0,s.jsxs)(t.admonition,{type:"info",children:[(0,s.jsx)(t.mdxAdmonitionTitle,{children:(0,s.jsx)(t.strong,{children:"\u201cI hold it to be the inalienable right of anybody to go to hell in his own way.\u201d"})}),(0,s.jsx)(t.p,{children:"\u2015 Robert Frost"})]}),"\n",(0,s.jsxs)(t.p,{children:["A few motivating philosophies which I ",(0,s.jsx)(t.strong,{children:"do not"})," consider to be suggestions regarding this\nproject:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["You ",(0,s.jsx)(t.strong,{children:"shouldn't be unpleasantly surprised"})," by what happens"]}),"\n",(0,s.jsxs)(t.li,{children:["Your application has what ",(0,s.jsx)(t.strong,{children:"you"})," want in it, not what ",(0,s.jsx)(t.strong,{children:"flecks"})," wants in it"]}),"\n",(0,s.jsxs)(t.li,{children:["Developer ",(0,s.jsx)(t.strong,{children:"comfort and confidence are essential"}),", not just a nice-to-have"]}),"\n",(0,s.jsxs)(t.li,{children:["You ",(0,s.jsx)(t.strong,{children:"shouldn't have to have a full budget"})," for production deployment"]}),"\n",(0,s.jsxs)(t.li,{children:["Core architectural ",(0,s.jsx)(t.strong,{children:"opinions require transparency and justification"})]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"why-though",children:"Why though?"}),"\n",(0,s.jsx)(t.p,{children:"You might be thinking something like:"}),"\n",(0,s.jsx)("figure",{children:(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"A screenshot of Michael from The Office shouting "NO GOD PLEASE NO"",src:n(9151).Z+"",width:"720",height:"405"}),"\n",(0,s.jsxs)("figcaption",{style:{fontSize:"0.8rem"},children:[(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:"Why?!"})})," ",(0,s.jsx)(t.em,{children:"A new JavaScript framework is the last thing we need."})]})]})}),"\n",(0,s.jsxs)(t.p,{children:["Perhaps you will write a thesis explaining in great detail why there is no\nobjective reason for flecks to exist. ",(0,s.jsx)(t.strong,{children:"I'm fine with that"}),",\n",(0,s.jsx)(d,{children:"because I love it and there's nothing you can do about it."})]}),"\n",(0,s.jsx)(t.p,{children:"Seriously though, a couple reasons why I made flecks and use it to develop applications are:"}),"\n",(0,s.jsx)(t.h3,{id:"separation-of-concerns",children:"Separation of concerns"}),"\n",(0,s.jsxs)(t.p,{children:["JS has matured a lot over the years, and modules are all but a first-class concept. This has been\na huge win for Properly Structured","\u2122\ufe0f"," applications."]}),"\n",(0,s.jsxs)(t.p,{children:["However, I believe the real reason many fullstack frameworks exist today is to\n",(0,s.jsx)(t.em,{children:"centralize concerns"}),". No one wants to set up a whole database, a routing system, a webserver,\netc, ",(0,s.jsxs)(d,{children:["etc, ",(0,s.jsx)(d,{children:"etc."})]})," every time. So, the default approach has been to reach out\nfor a framework to tie it all together. To some extent this is an inevitable evolution."]}),"\n",(0,s.jsx)("figure",{children:(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"Screenshot of Patrick Star with the caption "Push them somewhere else"",src:n(3948).Z+"",width:"478",height:"345"}),"\n",(0,s.jsx)("figcaption",{style:{fontSize:"0.8rem"},children:(0,s.jsxs)(t.em,{children:["You've never even ",(0,s.jsx)(t.strong,{children:"seen"})," a real ",(0,s.jsx)(o.Z,{target:"_blank",to:"https://cha0s.github.io/flecks/docs/redux",children:"duck"})]})})]})}),"\n",(0,s.jsxs)(t.p,{children:["With flecks, the first principle is to push these concerns out into modular units which do one\nthing and do it immaculately.\n",(0,s.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Unix_philosophy",children:"This is not a new concept"}),"! These units can be\ncomposed into an application that does as much or as little as you like, ",(0,s.jsxs)(d,{children:["without requiring\nyour application structure to follow some corporate diktat ",(0,s.jsxs)(d,{children:["requiring you to enter a mailing\naddress to submit a pull request. ",(0,s.jsx)(d,{children:"(don't ask...)"})]})]})]}),"\n",(0,s.jsx)(t.h3,{id:"joy",children:"Joy"}),"\n",(0,s.jsx)("div",{style:{float:"right",padding:"0 1.5rem"},children:(0,s.jsx)(t.img,{alt:"A screenshot of Marie Kondo stating "This one sparks joy."",src:n(8749).Z+"",width:"242",height:"242"})}),"\n",(0,s.jsxs)(t.p,{children:["I have found this structure to work very well and to ",(0,s.jsx)(t.em,{children:"feel pleasant"}),". It's great to get up and\nrunning super quickly without having to repeat a monolithic structure over and over. It's almost\nreminiscent of those small plastic building blocks my parents used to step on. Super fun!"]}),"\n",(0,s.jsxs)(t.p,{children:["I find that I ",(0,s.jsx)(t.strong,{children:"don't have to think about what flecks is doing"})," most of the time, which is exactly\nwhat I want."]}),"\n",(0,s.jsxs)(t.p,{children:["flecks is at its best when you can forget that it exists and everything Just Works","\u2122\ufe0f","."]}),"\n",(0,s.jsx)(t.h3,{id:"because-i-can",children:"Because I can"}),"\n",(0,s.jsx)(t.p,{children:"No, seriously! Over the years interacting with various parts of the JS ecosystem I have experienced\nall manner of closed-minded hostile encounters with people who regrettably lacked the imagination\nto understand something which may have ran counter to the established wisdom of the week."}),"\n",(0,s.jsxs)(t.p,{children:["So I guess anyone who told me that it won't work, doesn't make sense, or other copium-based\nresponses: Here it is! Eat your hearts out and haterz get meme'd on. ","\ud83d\udc85"]}),"\n",(0,s.jsx)(t.h2,{id:"thanks-again",children:"Thanks again"}),"\n",(0,s.jsxs)(t.p,{children:["I do appreciate you reading all that! I apologize if my tone came off as overly-antagonistic (as\nopposed to *the-correct-amount-of-*antagonistic). I actually think people are ",(0,s.jsx)(t.em,{children:"afraid"})," to say some\nof the things I've said here out loud! Come send me love (or threats or whatever) at the\n",(0,s.jsx)(t.a,{href:"https://github.com/cha0s/flecks/discussions",children:"Github discussions page"}),"!"]}),"\n",(0,s.jsxs)(t.p,{children:["Most importantly: ",(0,s.jsx)(t.strong,{children:"have fun"}),"! ","\u2764\ufe0f"]})]})}function p(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},1235:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/drinking-b50862bbaec8f4900ea0c20af31576bf.jpg"},8749:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/kondo-8ca202a300547b698dedad3b3e1299e0.jpg"},3948:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/over-there-19c01e6cdf39cc325266aa184db093f0.jpg"},9151:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/pls-no-1cfa9e8bc25e1ee3d412e5c5ddbab291.jpg"},1048:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/specific-enough-7a5f7bca00d317ed79832a435f5bcedd.jpg"},3069:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/two-actually-12439fdd460029f7bf3d496e63e09b96.jpg"},6522:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/webscale-c13cfc37833381fdb967bdd730a5d584.jpg"},1151:(e,t,n)=>{n.d(t,{Z:()=>r,a:()=>a});var s=n(7294);const i={},o=s.createContext(i);function a(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a0957561.44f59c72.js b/assets/js/a0957561.77649b93.js similarity index 96% rename from assets/js/a0957561.44f59c72.js rename to assets/js/a0957561.77649b93.js index 7a09f877..cafe570c 100644 --- a/assets/js/a0957561.44f59c72.js +++ b/assets/js/a0957561.77649b93.js @@ -1 +1 @@ -"use strict";(self.webpackChunkflecks_docusaurus=self.webpackChunkflecks_docusaurus||[]).push([[5048],{8536:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"introducing-flecks","metadata":{"permalink":"/flecks/blog/introducing-flecks","source":"@site/blog/2024-01-30-introducing-flecks.mdx","title":"flecks: NOT a fullstack framework","description":"Introducing flecks: an exceptionally-extensible application production system.","date":"2024-01-30T00:00:00.000Z","formattedDate":"January 30, 2024","tags":[{"label":"announcement","permalink":"/flecks/blog/tags/announcement"},{"label":"introducing","permalink":"/flecks/blog/tags/introducing"},{"label":"flecks","permalink":"/flecks/blog/tags/flecks"},{"label":"release","permalink":"/flecks/blog/tags/release"}],"readingTime":7.465,"hasTruncateMarker":true,"authors":[{"name":"cha0s","title":"Creator of flecks","url":"https://github.com/cha0s","image_url":"https://github.com/cha0s.png","imageURL":"https://github.com/cha0s.png"}],"frontMatter":{"title":"flecks: NOT a fullstack framework","description":"Introducing flecks: an exceptionally-extensible application production system.","slug":"introducing-flecks","authors":[{"name":"cha0s","title":"Creator of flecks","url":"https://github.com/cha0s","image_url":"https://github.com/cha0s.png","imageURL":"https://github.com/cha0s.png"}],"tags":["announcement","introducing","flecks","release"],"hide_table_of_contents":false},"unlisted":false},"content":"import Link from \'@docusaurus/Link\';\\n\\nexport function Tiny({children}) {\\n return {children};\\n}\\n\\nIntroducing flecks: an **exceptionally-extensible application production system**.\\n\\n{/* truncate */}\\n\\n## First off, thanks for your time :pray:\\n\\nI appreciate you checking out the project! I truly hope that you will find working with flecks\\nto be a joy. Feedback is welcome over on the\\n[Github discussions page](https://github.com/cha0s/flecks/discussions)!\\n\\n:::warning[What\'s the letter before \\"alpha\\"?]\\n\\nThis is a new release and worked on by only one person: [me](https://github.com/cha0s)! Please\\nkeep this in mind!\\n\\n:::\\n\\n## Is it ~~webscale~~ fullstack?\\n\\n
\\n ![A screenshot from the 2010 \\"MongoDB is webscale\\" cartoon](./webscale.jpg)\\n
*yes, I remember*
\\n
\\n\\nI admit, I clickbaited with the title there just a little bit. I love fullstack! flecks is more\\nthan capable of building fullstack applications. If you just want to jump to more of that sort\\nof thing, you might be interested in the React\\npage in the documentation.\\n\\n### For real, though\\n\\nA fullstack JS application is basically appception: what you actually have is a server\\napplication written in JS that serves a client application written in JS. Using\\nthe same language obscures (arguably, *by design*) the fact that these are actually two distinct\\napplications.\\n\\n![A screenshot of Doctor Olivia Octopus saying \\"There\'s two, actually\\"](./two-actually.jpg)\\n\\n:::danger[Hot take]\\n\\nSome modern framework APIs are becoming increasingly esoteric in their attempt to paper over\\nthis reality\\n([*\\\\*ahem\\\\**](https://github.com/cha0s/flecks/blob/master/packages/react/src/client.js#L24)... and\\ndon\'t get me started on [**RSC**](https://www.mayank.co/blog/react-server-components/)...).\\n\\n:::\\n\\n### Don\'t get it twisted\\n\\nTo put it in basic terms: A web server is a core aspect of a fullstack application, but **a\\nweb server is not a core aspect of an application**. The same could be said about asset\\noptimization, routing, and many other core fullstack JS concepts.\\n\\nflecks is concerned with **writing applications**; fullstack applications are merely a subset of\\nthat.\\n\\n## Do one thing and do it well\\n\\nThe core primitive is the **fleck** which is... just a JS module. There exists a server\\nfleck, a web fleck, a React fleck, and so on.\\n\\nHere\'s a simple fleck that says hello when the application is starting:\\n\\n```js\\nexport const hooks = {\\n \'@flecks/core.starting\': () => {\\n console.log(\'hey you\');\\n },\\n};\\n```\\n\\nThat\'s it. It\'s a module that exports some hook implementations. If you\'re curious what kind of\\nhooks we\'re talking about, check out\\nthe hooks reference page.\\n\\nYou add a reference to your fleck to a file called\\n`flecks.yml` and you\'re rolling. Again,\\n**a flecks application is just flecks** having their hook implementations invoked.\\n\\nWhat are multiple flecks called? **flecks**!\\n\\n:::tip[Flickin\' fleckers]\\n\\nIt is not a coincidence that the name of the framework uses the same word as the plural form of\\nits constituting elements: the implication is that **flecks is just flecks**, it\'s not really doing\\nanything special on its own. Sure, it *does something*, but the something that it does is provide\\ntools with which to orchestrate your flecks together into an application.\\n\\n:::\\n\\n### Small core\\n\\nCreating an application with `@flecks/create-app` and then doing\\ne.g. `yarn install --production` will result in a full working application with a size of\\n**less than 7 MB**. Granted, it\'s only a server that will start, have nothing to do, and halt in\\nabout 100 ms, but it illustrates that flecks builds what you tell it to, **it is not a kitchen\\nsink system**.\\n\\n
\\n ![A screenshot of Fry from Futurama captioned \\"Not sure if you\'re overly specific or not specific enough\\"](./specific-enough.jpg)\\n
*When you\'re writing an article and curious about how the Big Kid on the Block performs in terms of raw default production application size, but can\'t even figure out how to measure it because you have already downloaded more than 7MB of ads for their \\"hosting solution\\" into your brain in the process*
\\n
\\n\\n### So where\'s asset optimization, data fetching, filetree routing, RSC...?\\n\\nWell, I do admit that I don\'t stand before you today with a solution for every problem around\\nfullstack development.\\n\\nflecks is made with **cooperation and collaboration as a primary concern**. A fleck is *just\\na package* exactly for that reason: it should be frictionless to publish a package (or a suite)\\nto the world and then add them to a project just like you would with any other package! **It should\\nbe as frictionless** for a developer to say \\"I don\'t agree with how this fleck is\\nimplemented\\" and write their own, interacting seamlessly with everything else they actually want.\\n\\n**I believe we can design modular solutions to these problems!** In order to do this, it\'s probably\\nbetter to be standing on top of less, not more.\\n\\n### Better *no* abstraction than the *wrong* abstraction\\n\\nI know this will come off as inflammatory but I *honestly feel* like some of the more recent\\nJS framework \\"paradigms\\" feel like someone coding at midnight and having an epiphany about the\\n\\"killer new paradigm\\" which they are now going to spend the next 5 hours implementing in all\\ntheir code only to wake up the next morning absolutely exhausted with a broken codebase and a\\ndeep sense of regret as they revert all the changes and pretend that it never happened.\\n\\n
\\n ![A picture of a person with their head down pouring coffee all over the place captioned \\"I\'m never drinking again\\"](./drinking.jpg)\\n
***obviously** this has never happened to **my** projects. Also, you ran your credit card the whole time.*
\\n
\\n\\n### The flecks way\\n\\nThe few core architectural opinions that are held are presented as suggestions, not requirements.\\n\\n:::info[**\u201cI hold it to be the inalienable right of anybody to go to hell in his own way.\u201d**]\\n\\n\u2015 Robert Frost\\n\\n:::\\n\\nA few motivating philosophies which I **do not** consider to be suggestions regarding this\\nproject:\\n\\n- You **shouldn\'t be unpleasantly surprised** by what happens\\n- Your application has what **you** want in it, not what **flecks** wants in it\\n- Developer **comfort and confidence are essential**, not just a nice-to-have\\n- You **shouldn\'t have to have a full budget** for production deployment\\n- Core architectural **opinions require transparency and justification**\\n\\n## Why though?\\n\\nYou might be thinking something like:\\n\\n
\\n ![A screenshot of Michael from The Office shouting \\"NO GOD PLEASE NO\\"](./pls-no.jpg)\\n
***Why?!*** *A new JavaScript framework is the last thing we need.*
\\n
\\n\\nPerhaps you will write a thesis explaining in great detail why there is no\\nobjective reason for flecks to exist. **I\'m fine with that**,\\nbecause I love it and there\'s nothing you can do about it.\\n\\nSeriously though, a couple reasons why I made flecks and use it to develop applications are:\\n\\n### Separation of concerns\\n\\nJS has matured a lot over the years, and modules are all but a first-class concept. This has been\\na huge win for Properly Structured:tm: applications.\\n\\nHowever, I believe the real reason many fullstack frameworks exist today is to\\n*centralize concerns*. No one wants to set up a whole database, a routing system, a webserver,\\netc, etc, etc. every time. So, the default approach has been to reach out\\nfor a framework to tie it all together. To some extent this is an inevitable evolution.\\n\\n
\\n ![Screenshot of Patrick Star with the caption \\"Push them somewhere else\\"](./over-there.jpg)\\n
*You\'ve never even **seen** a real duck*
\\n
\\n\\n\\nWith flecks, the first principle is to push these concerns out into modular units which do one\\nthing and do it immaculately.\\n[This is not a new concept](https://en.wikipedia.org/wiki/Unix_philosophy)! These units can be\\ncomposed into an application that does as much or as little as you like, without requiring\\nyour application structure to follow some corporate diktat requiring you to enter a mailing\\naddress to submit a pull request. (don\'t ask...)\\n\\n### Joy\\n\\n
![A screenshot of Marie Kondo stating \\"This one sparks joy.\\"](./kondo.jpg)
\\n\\nI have found this structure to work very well and to *feel pleasant*. It\'s great to get up and\\nrunning super quickly without having to repeat a monolithic structure over and over. It\'s almost\\nreminiscent of those small plastic building blocks my parents used to step on. Super fun!\\n\\nI find that I **don\'t have to think about what flecks is doing** most of the time, which is exactly\\nwhat I want.\\n\\nflecks is at its best when you can forget that it exists and everything Just Works:tm:.\\n\\n### Because I can\\n\\nNo, seriously! Over the years interacting with various parts of the JS ecosystem I have experienced\\nall manner of closed-minded hostile encounters with people who regrettably lacked the imagination\\nto understand something which may have ran counter to the established wisdom of the week.\\n\\nSo I guess anyone who told me that it won\'t work, doesn\'t make sense, or other copium-based\\nresponses: Here it is! Eat your hearts out and haterz get meme\'d on. :nail_care:\\n\\n## Thanks again\\n\\nI do appreciate you reading all that! Come send me love (or threats or whatever) at the\\n[Github discussions page](https://github.com/cha0s/flecks/discussions)! :relieved:"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkflecks_docusaurus=self.webpackChunkflecks_docusaurus||[]).push([[5048],{8536:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"introducing-flecks","metadata":{"permalink":"/flecks/blog/introducing-flecks","source":"@site/blog/2024-01-30-introducing-flecks.mdx","title":"flecks: NOT a fullstack framework","description":"Introducing flecks: an exceptionally-extensible application production system.","date":"2024-01-30T00:00:00.000Z","formattedDate":"January 30, 2024","tags":[{"label":"announcement","permalink":"/flecks/blog/tags/announcement"},{"label":"introducing","permalink":"/flecks/blog/tags/introducing"},{"label":"flecks","permalink":"/flecks/blog/tags/flecks"},{"label":"release","permalink":"/flecks/blog/tags/release"}],"readingTime":7.635,"hasTruncateMarker":true,"authors":[{"name":"cha0s","title":"Creator of flecks","url":"https://github.com/cha0s","image_url":"https://github.com/cha0s.png","imageURL":"https://github.com/cha0s.png"}],"frontMatter":{"title":"flecks: NOT a fullstack framework","description":"Introducing flecks: an exceptionally-extensible application production system.","slug":"introducing-flecks","authors":[{"name":"cha0s","title":"Creator of flecks","url":"https://github.com/cha0s","image_url":"https://github.com/cha0s.png","imageURL":"https://github.com/cha0s.png"}],"tags":["announcement","introducing","flecks","release"],"hide_table_of_contents":false},"unlisted":false},"content":"import Link from \'@docusaurus/Link\';\\n\\nexport function Tiny({children}) {\\n return {children};\\n}\\n\\nIntroducing flecks: an **exceptionally-extensible application production system**.\\n\\n{/* truncate */}\\n\\n## First off, thanks for your time :pray:\\n\\nI appreciate you checking out the project! I truly hope that you will find working with flecks\\nto be a joy. Feedback is welcome over on the\\n[Github discussions page](https://github.com/cha0s/flecks/discussions)!\\n\\n:::warning[What\'s the letter before \\"alpha\\"?]\\n\\nThis is a new release and worked on by only one person: [me](https://github.com/cha0s)! Please\\nkeep this in mind!\\n\\n:::\\n\\n## Is it ~~webscale~~ fullstack?\\n\\n
\\n ![A screenshot from the 2010 \\"MongoDB is webscale\\" cartoon](./webscale.jpg)\\n
*yes, I remember*
\\n
\\n\\nI admit, I clickbaited with the title there just a little bit. I love fullstack! flecks is more\\nthan capable of building fullstack applications. If you just want to jump to more of that sort\\nof thing, you might be interested in the React\\npage in the documentation.\\n\\n### For real, though\\n\\nA fullstack JS application is basically appception: what you actually have is a server\\napplication written in JS that serves a client application written in JS. Using\\nthe same language obscures (arguably, *by design*) the fact that these are actually two distinct\\napplications.\\n\\n![A screenshot of Doctor Olivia Octopus saying \\"There\'s two, actually\\"](./two-actually.jpg)\\n\\n:::danger[Hot take]\\n\\nSome modern framework APIs are becoming increasingly esoteric in their attempt to paper over\\nthis reality\\n([*\\\\*ahem\\\\**](https://github.com/cha0s/flecks/blob/master/packages/react/src/client.js#L24)... and\\ndon\'t get me started on [**RSC**](https://www.mayank.co/blog/react-server-components/)...).\\n\\n:::\\n\\n### Don\'t get it twisted\\n\\nTo put it in basic terms: A web server is a core aspect of a fullstack application, but **a\\nweb server is not a core aspect of an application**. The same could be said about asset\\noptimization, routing, and many other core fullstack JS concepts.\\n\\nflecks is concerned with **writing applications**; fullstack applications are merely a subset of\\nthat.\\n\\n## Do one thing and do it well\\n\\nThe core primitive is the **fleck** which is... just a JS module. There exists a server\\nfleck, a web fleck, a React fleck, and so on.\\n\\nHere\'s a simple fleck that says hello when the application is starting:\\n\\n```js\\nexport const hooks = {\\n \'@flecks/core.starting\': () => {\\n console.log(\'hey you\');\\n },\\n};\\n```\\n\\nThat\'s it. It\'s a module that exports some hook implementations. If you\'re curious what kind of\\nhooks we\'re talking about, check out\\nthe hooks reference page.\\n\\nYou add a reference to your fleck to a file called\\n`flecks.yml` and you\'re rolling. Again,\\n**a flecks application is just flecks** having their hook implementations invoked.\\n\\nWhat are multiple flecks called? **flecks**!\\n\\n:::tip[Flickin\' fleckers]\\n\\nIt is not a coincidence that the name of the framework uses the same word as the plural form of\\nits constituting elements: the implication is that **flecks is just flecks**, it\'s not really doing\\nanything special on its own. Sure, it *does something*, but the something that it does is provide\\ntools with which to orchestrate your flecks together into an application.\\n\\n:::\\n\\n### Small core\\n\\nCreating an application with `@flecks/create-app` and then doing\\ne.g. `yarn install --production` will result in a full working application with a size of\\n**less than 7 MB**. Granted, it\'s only a server that will start, have nothing to do, and halt in\\nabout 100 ms, but it illustrates that flecks builds what you tell it to, **it is not a kitchen\\nsink system**.\\n\\n
\\n ![A screenshot of Fry from Futurama captioned \\"Not sure if you\'re overly specific or not specific enough\\"](./specific-enough.jpg)\\n
*When you\'re writing an article and curious about how the Big Kid on the Block performs in terms of raw default production application size, but can\'t even figure out how to measure it because you have already downloaded more than 7MB of ads for their \\"hosting solution\\" into your brain in the process*
\\n
\\n\\n### So where\'s asset optimization, data fetching, filetree routing, RSC...?\\n\\nWell, I do admit that I don\'t stand before you today with a solution for every problem around\\nfullstack development.\\n\\nflecks is made with **cooperation and collaboration as a primary concern**. A fleck is *just\\na package* exactly for that reason: it should be frictionless to publish a package (or a suite)\\nto the world and then add them to a project just like you would with any other package! **It should\\nbe as frictionless** for a developer to say \\"I don\'t agree with how this fleck is\\nimplemented\\" and write their own, interacting seamlessly with everything else they actually want.\\n\\n**I believe we can design modular solutions to these problems!** In order to do this, it\'s probably\\nbetter to be standing on top of less, not more.\\n\\n### Better *no* abstraction than the *wrong* abstraction\\n\\nI know this will come off as inflammatory but I *honestly feel* like some of the more recent\\nJS framework \\"paradigms\\" feel like someone coding at midnight and having an epiphany about the\\n\\"killer new paradigm\\" which they are now going to spend the next 5 hours implementing in all\\ntheir code only to wake up the next morning absolutely exhausted with a broken codebase and a\\ndeep sense of regret as they revert all the changes and pretend that it never happened.\\n\\n
\\n ![A picture of a person with their head down pouring coffee all over the place captioned \\"I\'m never drinking again\\"](./drinking.jpg)\\n
***obviously** this has never happened to **my** projects. Also, you ran your credit card the whole time.*
\\n
\\n\\n### The flecks way\\n\\nThe few core architectural opinions that are held are presented as suggestions, not requirements.\\n\\n:::info[**\u201cI hold it to be the inalienable right of anybody to go to hell in his own way.\u201d**]\\n\\n\u2015 Robert Frost\\n\\n:::\\n\\nA few motivating philosophies which I **do not** consider to be suggestions regarding this\\nproject:\\n\\n- You **shouldn\'t be unpleasantly surprised** by what happens\\n- Your application has what **you** want in it, not what **flecks** wants in it\\n- Developer **comfort and confidence are essential**, not just a nice-to-have\\n- You **shouldn\'t have to have a full budget** for production deployment\\n- Core architectural **opinions require transparency and justification**\\n\\n## Why though?\\n\\nYou might be thinking something like:\\n\\n
\\n ![A screenshot of Michael from The Office shouting \\"NO GOD PLEASE NO\\"](./pls-no.jpg)\\n
***Why?!*** *A new JavaScript framework is the last thing we need.*
\\n
\\n\\nPerhaps you will write a thesis explaining in great detail why there is no\\nobjective reason for flecks to exist. **I\'m fine with that**,\\nbecause I love it and there\'s nothing you can do about it.\\n\\nSeriously though, a couple reasons why I made flecks and use it to develop applications are:\\n\\n### Separation of concerns\\n\\nJS has matured a lot over the years, and modules are all but a first-class concept. This has been\\na huge win for Properly Structured:tm: applications.\\n\\nHowever, I believe the real reason many fullstack frameworks exist today is to\\n*centralize concerns*. No one wants to set up a whole database, a routing system, a webserver,\\netc, etc, etc. every time. So, the default approach has been to reach out\\nfor a framework to tie it all together. To some extent this is an inevitable evolution.\\n\\n
\\n ![Screenshot of Patrick Star with the caption \\"Push them somewhere else\\"](./over-there.jpg)\\n
*You\'ve never even **seen** a real duck*
\\n
\\n\\n\\nWith flecks, the first principle is to push these concerns out into modular units which do one\\nthing and do it immaculately.\\n[This is not a new concept](https://en.wikipedia.org/wiki/Unix_philosophy)! These units can be\\ncomposed into an application that does as much or as little as you like, without requiring\\nyour application structure to follow some corporate diktat requiring you to enter a mailing\\naddress to submit a pull request. (don\'t ask...)\\n\\n### Joy\\n\\n
![A screenshot of Marie Kondo stating \\"This one sparks joy.\\"](./kondo.jpg)
\\n\\nI have found this structure to work very well and to *feel pleasant*. It\'s great to get up and\\nrunning super quickly without having to repeat a monolithic structure over and over. It\'s almost\\nreminiscent of those small plastic building blocks my parents used to step on. Super fun!\\n\\nI find that I **don\'t have to think about what flecks is doing** most of the time, which is exactly\\nwhat I want.\\n\\nflecks is at its best when you can forget that it exists and everything Just Works:tm:.\\n\\n### Because I can\\n\\nNo, seriously! Over the years interacting with various parts of the JS ecosystem I have experienced\\nall manner of closed-minded hostile encounters with people who regrettably lacked the imagination\\nto understand something which may have ran counter to the established wisdom of the week.\\n\\nSo I guess anyone who told me that it won\'t work, doesn\'t make sense, or other copium-based\\nresponses: Here it is! Eat your hearts out and haterz get meme\'d on. :nail_care:\\n\\n## Thanks again\\n\\nI do appreciate you reading all that! I apologize if my tone came off as overly-antagonistic (as\\nopposed to *the-correct-amount-of-*antagonistic). I actually think people are *afraid* to say some\\nof the things I\'ve said here out loud! Come send me love (or threats or whatever) at the\\n[Github discussions page](https://github.com/cha0s/flecks/discussions)!\\n\\nMost importantly: **have fun**! :heart:"}]}')}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.13cb1aa2.js b/assets/js/runtime~main.1e74adc2.js similarity index 97% rename from assets/js/runtime~main.13cb1aa2.js rename to assets/js/runtime~main.1e74adc2.js index 8043072e..ad6d2616 100644 --- a/assets/js/runtime~main.13cb1aa2.js +++ b/assets/js/runtime~main.1e74adc2.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,c,f,d,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(c.exports,c,c.exports,r),c.loaded=!0,c.exports}r.m=b,r.c=t,e=[],r.O=(a,c,f,d)=>{if(!c){var b=1/0;for(i=0;i=d)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[c,f,d]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var b={};a=a||[null,c({}),c([]),c(c)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(d,b),d},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",107:"cdb1c15d",196:"cbb899e4",937:"972d9d57",944:"57cdf011",1052:"3c291670",1073:"9967cc6c",1144:"773fe5c0",1204:"be07d3f5",1540:"c6ac44d3",1695:"2357b171",1825:"c208b484",1851:"b045326f",2163:"14f78a16",2297:"e6ab389f",2528:"1dc09441",2535:"814f3328",2596:"357e2da2",2873:"18911325",3089:"a6aa9e1f",3541:"af7d3287",3608:"9e4087bc",3630:"f9a0490a",3729:"7279d61b",3850:"1ecec20c",4013:"01a85c17",4100:"cdde611f",4138:"3d909a3c",4364:"5df00a39",4368:"a94703ab",4639:"8d4b214a",4861:"e98a169a",5048:"a0957561",5287:"8d2f4c1c",5563:"89927158",5679:"72512343",5722:"c6694cff",5930:"fa4d91bf",6103:"ccc49370",6128:"160a3b85",6324:"01bbcd7b",6325:"8f92789c",6419:"55ec95f7",6911:"8b0cd02a",7041:"ba61d949",7279:"8333feff",7639:"e7335c9b",7918:"17896441",8151:"0a6dca49",8312:"bfa2a205",8518:"a7bd4aaa",8532:"32a57bab",8610:"6875c492",9091:"06d8b529",9247:"e973a941",9661:"5e95c892",9686:"041c5cc5",9817:"14eb3368",9828:"fb49b6cf",9832:"dad808ed"}[e]||e)+"."+{53:"eac8b57d",107:"ab15be17",109:"32733b05",130:"8b1c1c76",132:"ae35eca4",196:"c02bcdbb",240:"07917f61",937:"eeafcbae",944:"f3413ebc",1052:"1e709b46",1073:"bcd36cc4",1144:"316c3d4e",1204:"c7b06e53",1504:"957f1d57",1540:"614ef72f",1644:"d976dcda",1695:"eefa1299",1763:"7daca6d0",1772:"897dbcaa",1825:"5a907d2a",1851:"909142db",2163:"6cc5601e",2183:"3334b572",2297:"e68c3902",2312:"2c0c9fc1",2528:"916770d3",2535:"9fe043da",2596:"b6b0f02c",2661:"5f234f73",2693:"a00fcec7",2696:"43f9fa5f",2700:"b8c28ffc",2873:"480d97ab",3076:"1e2e3390",3089:"5a7199a7",3343:"e0acdec4",3541:"fa80ef56",3608:"b89e0d4b",3619:"fbb2fff5",3630:"be9bef1a",3729:"b26424e3",3850:"37a9cd97",4013:"6da1492b",4100:"256de7a8",4138:"afbd58cb",4238:"641fbfe9",4364:"7bfa3769",4368:"0848533e",4639:"c10327d7",4706:"a02e6509",4861:"514fa2db",5048:"44f59c72",5269:"c28d6be0",5287:"012e4fbc",5326:"b2028c2d",5563:"593780f0",5679:"9128bb81",5722:"41180ac6",5790:"4a3585b2",5930:"927421e0",5943:"426845a9",6103:"39584db3",6128:"fda5294a",6255:"d3d0f009",6324:"1dfb9d17",6325:"873ed1ac",6419:"284324d4",6648:"b268d988",6911:"c73f1091",6985:"bd79313b",7041:"4e3e182e",7279:"17ba8d09",7639:"23ab21f9",7918:"715b14e3",7936:"8edc4d0d",8016:"5c15b204",8071:"898f9a7d",8151:"4c1a6630",8312:"fe5e394a",8518:"b46b1112",8532:"394a7c49",8610:"0c8c3ca7",8955:"e03572fe",9091:"bd3e3f50",9138:"8c3e3e31",9247:"f4111635",9661:"68abf1d3",9686:"d6ff3d43",9817:"e9035a2d",9828:"10ec73be",9832:"7e1a6050",9893:"cf0ffbf2"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},d="flecks-docusaurus:",r.l=(e,a,c,b)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var d=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/flecks/",r.gca=function(e){return e={17896441:"7918",18911325:"2873",72512343:"5679",89927158:"5563","935f2afb":"53",cdb1c15d:"107",cbb899e4:"196","972d9d57":"937","57cdf011":"944","3c291670":"1052","9967cc6c":"1073","773fe5c0":"1144",be07d3f5:"1204",c6ac44d3:"1540","2357b171":"1695",c208b484:"1825",b045326f:"1851","14f78a16":"2163",e6ab389f:"2297","1dc09441":"2528","814f3328":"2535","357e2da2":"2596",a6aa9e1f:"3089",af7d3287:"3541","9e4087bc":"3608",f9a0490a:"3630","7279d61b":"3729","1ecec20c":"3850","01a85c17":"4013",cdde611f:"4100","3d909a3c":"4138","5df00a39":"4364",a94703ab:"4368","8d4b214a":"4639",e98a169a:"4861",a0957561:"5048","8d2f4c1c":"5287",c6694cff:"5722",fa4d91bf:"5930",ccc49370:"6103","160a3b85":"6128","01bbcd7b":"6324","8f92789c":"6325","55ec95f7":"6419","8b0cd02a":"6911",ba61d949:"7041","8333feff":"7279",e7335c9b:"7639","0a6dca49":"8151",bfa2a205:"8312",a7bd4aaa:"8518","32a57bab":"8532","6875c492":"8610","06d8b529":"9091",e973a941:"9247","5e95c892":"9661","041c5cc5":"9686","14eb3368":"9817",fb49b6cf:"9828",dad808ed:"9832"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,c)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var d=new Promise(((c,d)=>f=e[a]=[c,d]));c.push(f[2]=d);var b=r.p+r.u(a),t=new Error;r.l(b,(c=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var d=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",t.name="ChunkLoadError",t.type=d,t.request=b,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var f,d,b=c[0],t=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(c);n{"use strict";var e,a,c,f,d,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(c.exports,c,c.exports,r),c.loaded=!0,c.exports}r.m=b,r.c=t,e=[],r.O=(a,c,f,d)=>{if(!c){var b=1/0;for(i=0;i=d)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[c,f,d]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var b={};a=a||[null,c({}),c([]),c(c)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(d,b),d},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",107:"cdb1c15d",196:"cbb899e4",937:"972d9d57",944:"57cdf011",1052:"3c291670",1073:"9967cc6c",1144:"773fe5c0",1204:"be07d3f5",1540:"c6ac44d3",1695:"2357b171",1825:"c208b484",1851:"b045326f",2163:"14f78a16",2297:"e6ab389f",2528:"1dc09441",2535:"814f3328",2596:"357e2da2",2873:"18911325",3089:"a6aa9e1f",3541:"af7d3287",3608:"9e4087bc",3630:"f9a0490a",3729:"7279d61b",3850:"1ecec20c",4013:"01a85c17",4100:"cdde611f",4138:"3d909a3c",4364:"5df00a39",4368:"a94703ab",4639:"8d4b214a",4861:"e98a169a",5048:"a0957561",5287:"8d2f4c1c",5563:"89927158",5679:"72512343",5722:"c6694cff",5930:"fa4d91bf",6103:"ccc49370",6128:"160a3b85",6324:"01bbcd7b",6325:"8f92789c",6419:"55ec95f7",6911:"8b0cd02a",7041:"ba61d949",7279:"8333feff",7639:"e7335c9b",7918:"17896441",8151:"0a6dca49",8312:"bfa2a205",8518:"a7bd4aaa",8532:"32a57bab",8610:"6875c492",9091:"06d8b529",9247:"e973a941",9661:"5e95c892",9686:"041c5cc5",9817:"14eb3368",9828:"fb49b6cf",9832:"dad808ed"}[e]||e)+"."+{53:"eac8b57d",107:"ab15be17",109:"32733b05",130:"8b1c1c76",132:"ae35eca4",196:"c02bcdbb",240:"07917f61",937:"eeafcbae",944:"f3413ebc",1052:"1e709b46",1073:"bcd36cc4",1144:"316c3d4e",1204:"c7b06e53",1504:"957f1d57",1540:"614ef72f",1644:"d976dcda",1695:"eefa1299",1763:"7daca6d0",1772:"897dbcaa",1825:"5a907d2a",1851:"909142db",2163:"6cc5601e",2183:"3334b572",2297:"e68c3902",2312:"2c0c9fc1",2528:"916770d3",2535:"9fe043da",2596:"b6b0f02c",2661:"5f234f73",2693:"a00fcec7",2696:"43f9fa5f",2700:"b8c28ffc",2873:"480d97ab",3076:"1e2e3390",3089:"5a7199a7",3343:"e0acdec4",3541:"fa80ef56",3608:"b89e0d4b",3619:"fbb2fff5",3630:"be9bef1a",3729:"e41b20e5",3850:"37a9cd97",4013:"6da1492b",4100:"256de7a8",4138:"afbd58cb",4238:"641fbfe9",4364:"7bfa3769",4368:"0848533e",4639:"c10327d7",4706:"a02e6509",4861:"514fa2db",5048:"77649b93",5269:"c28d6be0",5287:"012e4fbc",5326:"b2028c2d",5563:"537fbd2c",5679:"9128bb81",5722:"41180ac6",5790:"4a3585b2",5930:"927421e0",5943:"426845a9",6103:"39584db3",6128:"fda5294a",6255:"d3d0f009",6324:"1dfb9d17",6325:"873ed1ac",6419:"284324d4",6648:"b268d988",6911:"c73f1091",6985:"bd79313b",7041:"4e3e182e",7279:"17ba8d09",7639:"23ab21f9",7918:"715b14e3",7936:"8edc4d0d",8016:"5c15b204",8071:"898f9a7d",8151:"4c1a6630",8312:"fe5e394a",8518:"b46b1112",8532:"394a7c49",8610:"0c8c3ca7",8955:"e03572fe",9091:"bd3e3f50",9138:"8c3e3e31",9247:"f4111635",9661:"68abf1d3",9686:"d6ff3d43",9817:"e9035a2d",9828:"10ec73be",9832:"7e1a6050",9893:"cf0ffbf2"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},d="flecks-docusaurus:",r.l=(e,a,c,b)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var d=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/flecks/",r.gca=function(e){return e={17896441:"7918",18911325:"2873",72512343:"5679",89927158:"5563","935f2afb":"53",cdb1c15d:"107",cbb899e4:"196","972d9d57":"937","57cdf011":"944","3c291670":"1052","9967cc6c":"1073","773fe5c0":"1144",be07d3f5:"1204",c6ac44d3:"1540","2357b171":"1695",c208b484:"1825",b045326f:"1851","14f78a16":"2163",e6ab389f:"2297","1dc09441":"2528","814f3328":"2535","357e2da2":"2596",a6aa9e1f:"3089",af7d3287:"3541","9e4087bc":"3608",f9a0490a:"3630","7279d61b":"3729","1ecec20c":"3850","01a85c17":"4013",cdde611f:"4100","3d909a3c":"4138","5df00a39":"4364",a94703ab:"4368","8d4b214a":"4639",e98a169a:"4861",a0957561:"5048","8d2f4c1c":"5287",c6694cff:"5722",fa4d91bf:"5930",ccc49370:"6103","160a3b85":"6128","01bbcd7b":"6324","8f92789c":"6325","55ec95f7":"6419","8b0cd02a":"6911",ba61d949:"7041","8333feff":"7279",e7335c9b:"7639","0a6dca49":"8151",bfa2a205:"8312",a7bd4aaa:"8518","32a57bab":"8532","6875c492":"8610","06d8b529":"9091",e973a941:"9247","5e95c892":"9661","041c5cc5":"9686","14eb3368":"9817",fb49b6cf:"9828",dad808ed:"9832"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,c)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var d=new Promise(((c,d)=>f=e[a]=[c,d]));c.push(f[2]=d);var b=r.p+r.u(a),t=new Error;r.l(b,(c=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var d=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",t.name="ChunkLoadError",t.type=d,t.request=b,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var f,d,b=c[0],t=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(c);n Archive | flecks - + diff --git a/blog/atom.xml b/blog/atom.xml index cf2537fd..a6a1b48e 100644 --- a/blog/atom.xml +++ b/blog/atom.xml @@ -136,8 +136,11 @@ to understand something which may have ran counter to the established wisdom of

So I guess anyone who told me that it won't work, doesn't make sense, or other copium-based responses: Here it is! Eat your hearts out and haterz get meme'd on. 💅

Thanks again

-

I do appreciate you reading all that! Come send me love (or threats or whatever) at the -Github discussions page! 😌

]]> +

I do appreciate you reading all that! I apologize if my tone came off as overly-antagonistic (as +opposed to *the-correct-amount-of-*antagonistic). I actually think people are afraid to say some +of the things I've said here out loud! Come send me love (or threats or whatever) at the +Github discussions page!

+

Most importantly: have fun! ❤️

]]> cha0s https://github.com/cha0s diff --git a/blog/index.html b/blog/index.html index fb088872..305f0699 100644 --- a/blog/index.html +++ b/blog/index.html @@ -5,7 +5,7 @@ Blog | flecks - + diff --git a/blog/introducing-flecks/index.html b/blog/introducing-flecks/index.html index e2ab674b..f112d2e8 100644 --- a/blog/introducing-flecks/index.html +++ b/blog/introducing-flecks/index.html @@ -5,7 +5,7 @@ flecks: NOT a fullstack framework | flecks - + @@ -132,7 +132,10 @@

Because I can<

So I guess anyone who told me that it won't work, doesn't make sense, or other copium-based responses: Here it is! Eat your hearts out and haterz get meme'd on. 💅

Thanks again

-

I do appreciate you reading all that! Come send me love (or threats or whatever) at the -Github discussions page! 😌

+

I do appreciate you reading all that! I apologize if my tone came off as overly-antagonistic (as +opposed to *the-correct-amount-of-*antagonistic). I actually think people are afraid to say some +of the things I've said here out loud! Come send me love (or threats or whatever) at the +Github discussions page!

+

Most importantly: have fun! ❤️

\ No newline at end of file diff --git a/blog/rss.xml b/blog/rss.xml index abfcdc2a..1fb70bc9 100644 --- a/blog/rss.xml +++ b/blog/rss.xml @@ -137,8 +137,11 @@ to understand something which may have ran counter to the established wisdom of

So I guess anyone who told me that it won't work, doesn't make sense, or other copium-based responses: Here it is! Eat your hearts out and haterz get meme'd on. 💅

Thanks again

-

I do appreciate you reading all that! Come send me love (or threats or whatever) at the -Github discussions page! 😌

]]> +

I do appreciate you reading all that! I apologize if my tone came off as overly-antagonistic (as +opposed to *the-correct-amount-of-*antagonistic). I actually think people are afraid to say some +of the things I've said here out loud! Come send me love (or threats or whatever) at the +Github discussions page!

+

Most importantly: have fun! ❤️

]]> announcement introducing flecks diff --git a/blog/tags/announcement/index.html b/blog/tags/announcement/index.html index 6391648d..b2602a98 100644 --- a/blog/tags/announcement/index.html +++ b/blog/tags/announcement/index.html @@ -5,7 +5,7 @@ One post tagged with "announcement" | flecks - + diff --git a/blog/tags/flecks/index.html b/blog/tags/flecks/index.html index 838c1fa7..1407bc92 100644 --- a/blog/tags/flecks/index.html +++ b/blog/tags/flecks/index.html @@ -5,7 +5,7 @@ One post tagged with "flecks" | flecks - + diff --git a/blog/tags/index.html b/blog/tags/index.html index 378b0bdc..ba0d9895 100644 --- a/blog/tags/index.html +++ b/blog/tags/index.html @@ -5,7 +5,7 @@ Tags | flecks - + diff --git a/blog/tags/introducing/index.html b/blog/tags/introducing/index.html index cba7ce8b..c17d8912 100644 --- a/blog/tags/introducing/index.html +++ b/blog/tags/introducing/index.html @@ -5,7 +5,7 @@ One post tagged with "introducing" | flecks - + diff --git a/blog/tags/release/index.html b/blog/tags/release/index.html index fc1537b8..9412b181 100644 --- a/blog/tags/release/index.html +++ b/blog/tags/release/index.html @@ -5,7 +5,7 @@ One post tagged with "release" | flecks - + diff --git a/docs/adding-flecks/index.html b/docs/adding-flecks/index.html index 7f651f24..1f92d5ff 100644 --- a/docs/adding-flecks/index.html +++ b/docs/adding-flecks/index.html @@ -5,7 +5,7 @@ Adding flecks | flecks - + diff --git a/docs/building/index.html b/docs/building/index.html index 1a972ebd..6ac9d2a9 100644 --- a/docs/building/index.html +++ b/docs/building/index.html @@ -5,7 +5,7 @@ Building | flecks - + diff --git a/docs/category/generated-details/index.html b/docs/category/generated-details/index.html index 27328e59..4377582d 100644 --- a/docs/category/generated-details/index.html +++ b/docs/category/generated-details/index.html @@ -5,7 +5,7 @@ Generated details | flecks - + diff --git a/docs/category/getting-started/index.html b/docs/category/getting-started/index.html index 8e507c83..3a7bab87 100644 --- a/docs/category/getting-started/index.html +++ b/docs/category/getting-started/index.html @@ -5,7 +5,7 @@ Getting Started | flecks - + diff --git a/docs/category/guides/index.html b/docs/category/guides/index.html index 3bcb7566..e13f0e7d 100644 --- a/docs/category/guides/index.html +++ b/docs/category/guides/index.html @@ -5,7 +5,7 @@ Guides | flecks - + diff --git a/docs/category/writing-your-flecks/index.html b/docs/category/writing-your-flecks/index.html index 2c8977eb..44eccf51 100644 --- a/docs/category/writing-your-flecks/index.html +++ b/docs/category/writing-your-flecks/index.html @@ -5,7 +5,7 @@ Writing your fleck(s) | flecks - + diff --git a/docs/cli/index.html b/docs/cli/index.html index 353c0d43..3930d048 100644 --- a/docs/cli/index.html +++ b/docs/cli/index.html @@ -5,7 +5,7 @@ Command-line interface | flecks - + diff --git a/docs/configuration/index.html b/docs/configuration/index.html index 3c9425ab..5fc976d1 100644 --- a/docs/configuration/index.html +++ b/docs/configuration/index.html @@ -5,7 +5,7 @@ Configuration | flecks - + diff --git a/docs/creating-a-fleck/index.html b/docs/creating-a-fleck/index.html index 2e3e5045..305a59c8 100644 --- a/docs/creating-a-fleck/index.html +++ b/docs/creating-a-fleck/index.html @@ -5,7 +5,7 @@ Creating a fleck | flecks - + diff --git a/docs/database/index.html b/docs/database/index.html index 01f4fe22..17aa4fc7 100644 --- a/docs/database/index.html +++ b/docs/database/index.html @@ -5,7 +5,7 @@ Database | flecks - + diff --git a/docs/docker/index.html b/docs/docker/index.html index 88ff66a8..997ba2f1 100644 --- a/docs/docker/index.html +++ b/docs/docker/index.html @@ -5,7 +5,7 @@ Docker | flecks - + diff --git a/docs/documentation/index.html b/docs/documentation/index.html index 0ffc2439..8a680ac1 100644 --- a/docs/documentation/index.html +++ b/docs/documentation/index.html @@ -5,7 +5,7 @@ Documentation | flecks - + diff --git a/docs/electron/index.html b/docs/electron/index.html index e969dbe9..5e20a335 100644 --- a/docs/electron/index.html +++ b/docs/electron/index.html @@ -5,7 +5,7 @@ Electron | flecks - + diff --git a/docs/environment/index.html b/docs/environment/index.html index a665c07e..fd422229 100644 --- a/docs/environment/index.html +++ b/docs/environment/index.html @@ -5,7 +5,7 @@ Environment Variables | flecks - + diff --git a/docs/flecks/build-files/index.html b/docs/flecks/build-files/index.html index 20098796..5a6944af 100644 --- a/docs/flecks/build-files/index.html +++ b/docs/flecks/build-files/index.html @@ -5,7 +5,7 @@ Build files | flecks - + diff --git a/docs/flecks/config/index.html b/docs/flecks/config/index.html index 3cca75fa..93d9ecb6 100644 --- a/docs/flecks/config/index.html +++ b/docs/flecks/config/index.html @@ -5,7 +5,7 @@ Fleck configuration | flecks - + diff --git a/docs/flecks/hooks/index.html b/docs/flecks/hooks/index.html index 5ac55f19..c8b9203e 100644 --- a/docs/flecks/hooks/index.html +++ b/docs/flecks/hooks/index.html @@ -5,7 +5,7 @@ Hooks | flecks - + diff --git a/docs/flecks/todos/index.html b/docs/flecks/todos/index.html index bb973cdd..10e85158 100644 --- a/docs/flecks/todos/index.html +++ b/docs/flecks/todos/index.html @@ -5,7 +5,7 @@ TODO list | flecks - + diff --git a/docs/gathering/index.html b/docs/gathering/index.html index e7045239..d2442141 100644 --- a/docs/gathering/index.html +++ b/docs/gathering/index.html @@ -5,7 +5,7 @@ Gathering and Providing | flecks - + diff --git a/docs/hooks/index.html b/docs/hooks/index.html index 497d0dac..e7fceb5b 100644 --- a/docs/hooks/index.html +++ b/docs/hooks/index.html @@ -5,7 +5,7 @@ Hooks | flecks - + diff --git a/docs/index.html b/docs/index.html index def1c314..145cfdf3 100644 --- a/docs/index.html +++ b/docs/index.html @@ -5,7 +5,7 @@ Introduction | flecks - + diff --git a/docs/installation/index.html b/docs/installation/index.html index fc1c55c7..28bc7e13 100644 --- a/docs/installation/index.html +++ b/docs/installation/index.html @@ -5,7 +5,7 @@ Installation | flecks - + diff --git a/docs/ordering/index.html b/docs/ordering/index.html index d1520891..1c9e50d2 100644 --- a/docs/ordering/index.html +++ b/docs/ordering/index.html @@ -5,7 +5,7 @@ Ordering | flecks - + diff --git a/docs/package-json/index.html b/docs/package-json/index.html index e561dacb..07030f38 100644 --- a/docs/package-json/index.html +++ b/docs/package-json/index.html @@ -5,7 +5,7 @@ package.json and entrypoints | flecks - + diff --git a/docs/platforms/index.html b/docs/platforms/index.html index 75d48997..68bce06f 100644 --- a/docs/platforms/index.html +++ b/docs/platforms/index.html @@ -5,7 +5,7 @@ Platforms | flecks - + diff --git a/docs/react/index.html b/docs/react/index.html index 231de9fe..75f2f2d8 100644 --- a/docs/react/index.html +++ b/docs/react/index.html @@ -5,7 +5,7 @@ React | flecks - + diff --git a/docs/redux/index.html b/docs/redux/index.html index 6fc0fafa..8734e191 100644 --- a/docs/redux/index.html +++ b/docs/redux/index.html @@ -5,7 +5,7 @@ Redux | flecks - + diff --git a/docs/repl/index.html b/docs/repl/index.html index 7aa6e3f8..4eaf9da1 100644 --- a/docs/repl/index.html +++ b/docs/repl/index.html @@ -5,7 +5,7 @@ REPL | flecks - + diff --git a/docs/sockets/index.html b/docs/sockets/index.html index 9e4576ab..f8d525b6 100644 --- a/docs/sockets/index.html +++ b/docs/sockets/index.html @@ -5,7 +5,7 @@ Sockets | flecks - + diff --git a/docs/testing/index.html b/docs/testing/index.html index ab121bbe..b03ee0d0 100644 --- a/docs/testing/index.html +++ b/docs/testing/index.html @@ -5,7 +5,7 @@ Testing | flecks - + diff --git a/flecks/index.html b/flecks/index.html index 96c82d62..ff91d185 100644 --- a/flecks/index.html +++ b/flecks/index.html @@ -5,7 +5,7 @@ flecks - + diff --git a/index.html b/index.html index 00da6bfe..3db99662 100644 --- a/index.html +++ b/index.html @@ -5,7 +5,7 @@ Build a flexible and powerful application in no time | flecks - +