Alternatives to JSX
blog.bloomca.me
blog.bloomca.me
I think the general distaste for JMX is that it "feels" backwards initially: it mixes in HTML snippets within code, while many people are used to template files, which are mainly markup with small bits of "presentational" code injected.
But once you realize and really understand that JSX is just shorthand for javascript calls (and the article does a good job of explaining this), you hopefully eventually reach an "Aha!" moment of thinking of JSX in terms of underlying component creation. That's what happened to me, anyway,.
IDK, hyperscript (or even just aliased createElement) is enjoyable, not that verbose, and not needing a compilation pipeline just for JSX is nice. As in, I want to drop in an interactive bit inside a wider static page, dropping in react's JS (or linking in a CDN copy) and using createElement is way more convenient than having to set up a compilation pipeline.
Are there other frontend component libraries that embrace web standard HTML and CSS, and in particular Web Components?
let value = ‘example’;
let x = Math.random();
h(‘form.Foo[action=/whatever]’,
h(‘input.Bar[type=text]’, {
value,
oninput(event) {
value = event.target.value;
}
}),
h(‘button.button-small.button-primary[type=submit]’,
(x > 0.5) ?
h(‘strong’, ‘Submit’) :
h(‘em’, Submit)
)
)
vs. let value = ‘example’;
let x = Math.random();
<form className=“Foo” action=“/whatever”>
<input
className=“Bar”
type=“text”
placeholder={}
value={value}
onInput={
(e) => value = e.target.value
}
/>
<button className=“button-small button-primary” type=“submit”>
{
(x > 0.5) ?
<strong>Submit</strong> :
<em>Submit</em>
}
</button>
</form>
Although the example is contrived, it highlights several of my pain points from when I used react/jsx.The equivalent jsx requires transpilation, dipping back into js via {}, is far more verbose, and is particularly annoying when logic inevitably becomes part of your template. Whereas hyperscript style js solutions to view templating have straightforward access to loops, array methods, ternaries, objects, functions, etc. jsx requires you to either reinvent js functionality as components or switch back and forth between contexts to use js in your jsx template.
Hyperscript also nicely separates static vs dynamic properties in elements, making understanding a large code base easier. All the static stuff is in the selector, all dynamic stuff is in the optional second argument. There’s no equivalent in jsx.
As an aside, React’s hyperscript is kind of a pain to write on its own and there are many good reasons to stick with jsx if you’re using React. (Last I checked, React was strict about the second argument being an options object or null and the third argument being specifically an array of children.) My arguments in favor of hyperscript are most applicable if you’re using a library that was intended to be used with hyperscript, like Mithril or snabbdom.
Does the same level of tooling exists for hyperscript seeing that it's so much more string-based?
- You need to close tags you wouldn't need to close in HTML (breaks copy+pasted HTML)
- Argument quoting isn't optional (breaks copy+pasted HTML)
- HTML style Comments aren't allowed (breaks copy+pasted HTML)
- Whitespace gets stripped for all elements (breaks PREs)
- There's a JSX-specific syntax for "fragments" that seem to only exist for parser reasons?
- Variable references work inside of text nodes but don't inside of attributes.
After I googled a bunch and read the spec it helped a bit, but it left a bit of a bad taste in my mouth. I'm still left scratching my head over why you should be able to use an element as the value for an attribute though, like this: <foo a=<bar> test </bar>/> <FancyArticle heading={<h1>...</h1>} body={<main>...</main>} />I dislike the attribute way because:
- attributes are used for everything. It seems nice and simple - one single way to do all things ! - but it means when you see something passed this way, you never know what it's for without diving into the code or doc. There is no convention. Is it data ? Is it a children ? Is it a callback ? If yes, what for ?
- it allows people to make big inline blobs of code. And as often, when something ugly is easy on the short run, and the clean things is hard, they do the easy thing. JS is full of those stuff, and I wish we would not add new ones in the tooling we use.
- The syntax is so unatural when you have been doing HTML for decades. I understand the desire not to be limited by legacy, but here it's not working around any limit. There are alternatives. So we just break habits to break habits. Again something quite common in modern JS: let's replace the wheel by a different one. Not better. Just different. Because, reasons.
- It's easy to get wrong. Case in point, your comment and the parent don't even have the same syntax because one of you couldn't, from the top of the head, come up with the proper one.
<Route
path="/petition/:petitionId/page/next"
render={({ match }) => (
<InRoles
roles={Roles.pageReviewer}
deny={`/`}
allow={PS(match.params.petitionId, SECTION.PAGES, null, ({ petitionId }) => (
<PageReviewNextPage petition={petitionId} page={'-'} direction={1} />
))}
/>
)}
/>
Route comes from react-router. InRoles is internal to the application and accepts a string or function/component... if it's a string it redirects as appropriate, or renders. if null/empty just hides the result. PS is a function that returns a nested/common component structure.A more simple example would be...
<Fragment>
<Switch>
<Route exact path="/" render={({ location }) => <Home search={location.search} />} />I'm not sure what you mean by this. They're both valid. I don't find the one enclosed in {} nearly as confusing, because once you're inside curly braces you can have arbitrary javascript expressions so all bets are off.
The thing that's strange is being able to have a JSX Element as an attribute value without enclosing curly braces. Perhaps the use case of passing arguments to custom elements is more common than I thought thought.
Specifically "<foo a=<bar/>/>" is weird.
<Panel>
<Panel.Heading>Foobar</Panel.Heading>
<Panel.Body>
Panel body contents
</Panel.Body>
<Panel>
Which is itself just passing the Panel.Heading and Panel.Body elements as an array to Panel's children prop, but it's much more natural than having some arbitrarily complex hierarchy of elements passed in another prop.In other words, I've seen this:
<SomeComponent leftPanel={<LeftPane />} />
but I didn't even know you could do this: <SomeComponent leftPanel=<LeftPane /> />
Small quirk of JSX syntax that almost no one knows exists, I guess. - You need to close tags you wouldn't need to close in HTML (breaks copy+pasted HTML)
- Argument quoting isn't optional (breaks copy+pasted HTML)
- HTML style Comments aren't allowed (breaks copy+pasted HTML)
- Whitespace gets stripped for all elements (breaks PREs)
JSX is based on XML rather than HTML because XML is a version of HTML with all the backwards-compatibility weirdness stripped out, which makes it easier to parse. If you've learned XHTML, JSX isn't very hard.The stuff about <pre> elements and elements as values are pretty easy if you remember that all attributes are just JavaScript values, and the contents of a JSX element is just the "children" attribute.
In other words, these are the same:
<foo>{bar}</foo>
<foo children={bar} />
And `bar` is just a JavaScript value - a JSX fragment, a string, a number, whatever you want it to be.4 is valid, though: XML requires special directives to preserve whitespace. JSX requires different syntax with {`...`}, but it's a similar idea.
Not in what you would consider content: from http://usingxml.com/Basics/XmlSpace: "White space in any other location must be passed on to the processing application, according to the XML specification."
By "easier to parse", I mean "easier to parse for humans as well as computers".
I, a human, would also prefer not to memorize the list of self-closing tags, or the arcane rules for when <p> and <li> autoclose. Not having to do these things _blatantly_ makes XHTML more readable.
<pre class="debug">{JSON.stringify(store, null, 4)}</pre> <pre>
foo</pre>It seems that the rules are, for any run of literal text:
- preserve runs of whitespace that don't contain newlines - drop initial and final whitespace if it contains a newline - collapse any internal runs of whitespace containing newlines to a single space.
(based on a quick experiment with tsc.)
I expect a templating engine equivalent to php's twig becoming the standard way to separate the views from the behavior soon enough.
[1] https://www.facebook.com/notes/facebook-engineering/xhp-a-new-way-to-write-php/294003943919/
[2] https://docs.hhvm.com/hack/XHP/introductionI really wish XHP had been on the list of features PHP7 had taken from Hack and that it was default. Of course you can compile it in as a plugin, but that doesn't help the majority of PHP users nor does it encourage developers.
Having to compile your javascript sucks.
If your framework requires me to have a build system in place just to write some javascript, I’m either not going to use it or, if forced, I’ll find whatever way I need to to get the code written without having to stand up a giant build system.
Naturally, the true solution for people like me is to use Vue or Angular or another library that’s not as intrusive as React. But sometimes we’re forced, so we use that terrible createElement syntax. And come away disliking React even more.
Although frankly if I was doing lots of small projects I'm sure I'd have one of the many starter projects set up how I like it and it would just be running a script once.
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.6/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.6/react-dom.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.js"></script>
</head>
<body>
<div id="app"></div>
<script type="text/babel">
// React with JSX goes here
</script>
</body>
It it is less performant than compiled setup, of course.https://raw.githubusercontent.com/reactjs/reactjs.org/master...
And have actual instructions here:
That's why I don't like typescript :) Also because typescript makes things way less understandable than without type annotations
Strange proposition. No dev I know who has professionally worked with both would claim the same, even the skeptics long term ended up grokking types as a way to make it easier to understand the intent behind a piece of code, even when they prefer JS for writing, never for reading other people's code.
How long have you worked with each? What editor tools have you used for TS? I'm really curious about your experience.
The getting started, learning curve, and "wtf is happening here" curve is rather high. Especially once you add in Redux and React Navigation.
It doesn't help that all of the "getting started with RN and TS!" assume a decent understanding of TS.
I eventually got TSX working, but yeah, figuring out what you need to declare to make it all work is not easy.
Redux having 5 major ways (or whatever it is) of using it didn't help any. I use the shorthand form of mapDispatchToProps in my connect call, which none of the "TS in Redux" tutorials seem to use. (Why not? It is so much easier and shorter!)
I eventually gave up on typing Redux, IMHO the last thing Redux needs is more boilerplate! I rarely have type problems in my Redux code anyway. I probably understand enough to do it now (or maybe not, haven't investigated what typing redux-thunk looks like), but I'm going for "less bugs" not ideological purity in my code.
The tl;dr is that you have to declare an interface for your props, an interface for your state, and your props interface has to include a NavigationScreenProp which I honestly declared as
navigation: NavigationScreenProp<any>;
because I have better things to do in life than spend yet more time trying to figure out how to type something I never actually use. (state is in Redux, so the NavigationScreenProp is of very little use to me)All that said, the one time learning curve was worth it.
Typescript definitions can get super complicated though, my 90% use case is preventing typos and allowing for refactoring, so I only type objects I pass around as interfaces and I type functions that have been the source of bugs. Mostly anything that comes from my backend DB I want typed end to end. The majority of my REST endpoints use Typescript to pull from the DB so I just share interfaces across my backend and frontend.
It has been worth the hassle just for that.
Interesting. Was that your first time reading TS? Higher order functions, specially when combined with optional arguments, in JavaScript are an easy source of bugs for me but never when using TS, since I can simply see what I'm being asked for and getting back.
>Also I am a solo developer in my company
I actually forgot that scenario. Yes, unless you have adapted to the type-driven development way of thinking you will hardly see many of the benefits of maintaining code that has types vs code that does not.
When you're the one that wrote the code, you'll have an unfair advantage at understanding how the author meant the code to be used. When you don't have that luxury, types can be a great aid in most situations. Of course, it's a question of time and codebase size until you break your own preconditions when changing something, but you'll not notice how the type system can save you from that until it you actually learn how to take advantage of it.
It's a catch-22, so if you're curious and want to see what's meant by "taking advantage of the type system", I can only suggest you that you give something like Elm a try. There you'll see many times in the first couple of weeks what types can do for you when changing code.
But for a backend I would certainly have used static types as it's way more critical.
So I'm coming from a perspective where I will definitely be compiling my JavaScript regardless, and adding JSX doesn't make much difference complexity wise (and provides a much nicer syntax).
There is one benefit to Angular's templates that is pretty nice due to its use of TypeScript - you get intellisense in editors on your templates.
Then I learned how much nicer Javascript is with Babel.
No worrying about browser compatibility, Babel just makes it all work.
If I see some stage 3 proposal that I want to use, no problem, drop it in.
When I wanted to start moving over to Typescript, one line in Babel and I could start writing .ts files.
While learning what in the world was going in with regards to Babel was a bit of a painful start, now that I have it up and running, life is good.
I do like hyperscript better than JSX... precisely because it's not a syntax for function calls. Because it's just a function.
You should check out Elm: https://elm-lang.org/. It uses a hyperscript like syntax for rendering in a functional style. It's all just functions, and it reads that way too.
There are good reasons to be skeptical about JSX simply because of the worry about how much business logic may accidentally be embedded directly into views. For JSX, the answer is typically to solve that in other areas of workflow and patterns of habit. But the war between "as dumb as possible a templating language" and "just let me use my real language for templates" will probably wage on in the web space forever.
As a loop: Store -> State -> Reducer -> Component -> Action -> Dispatch -> Store ...
Or if you want something closer to MVC, you could use MobX or similar.
I just also remember being an idealistic Django-loving youth that wanted the dumbest possible template engine to avoid teenage PHP drama, so I definitely sympathize with folks whose gut reaction is upset with JSX for crossing the streams (again), and thought to make sure it was clear that it isn't a straw man argument to many. (Even if it is also, as in my case, an argument that can be won in favor of JSX. Though also in my case one of the big factors winning that argument was TSX [Typescript type checking of JSX views] versus many of the alternatives and their [lack of] static checking/analysis.)
JSX is just a more natural syntax to those used to HTML/XML directly as an expressive syntax. Nobody is forcing anyone to use it... `const h = React.createElement;` if you prefer the functional syntax directly.
Plus, many people consider the presentation like something that should be limited and stay that way. Having a turing complete language in it defeat that purpose.
But I agree, the alternative presented in the article don't address those issues at all so I can't see advantages over JSX.
import { html, render } from 'https://unpkg.com/lit-html';
const benefitTpl = ({name, desc}) => html`
<dt>${name}</dt>
<dd>${desc}</dd>
`;
render(html`
<lit-rocks>
<dl>${benefits.map(benefitTpl)}</dl>
</lit-rocks>`, document.body)
And updates are fast without any VDOM overhead.Also, don't forget your `?module` at the end of your unpkg link to get that running
Having been using it for the past 3-4 years I think its an above agerage elegant solution when it comes to templating solutions.
Put another way, if you have a skillset that includes configuring and/or maintaining non-trivial build pipelines, you're not a junior Engineer any more.
Junior developers are often just fine trusting build systems as block boxes once you've got them setup for them.
- Modules - TypeScript - Newer JavaScript syntax - SASS compilation - Code splitting
etc.
For me, it's hard to imagine a medium/large sized JS project without using some kind of module system. And once you've setup the build system for that, you might as well use all of the other features that it enables.
Code splitting/vendoring has changed with HTTP2, and will continue to change as HTTP3 comes along.
SASS compilation, and if you choose to use TypeScript, will require a build step, but at least the SASS side of that is very easy and straight forward by itself.
These days the solution usually falls into 3 camps:
1) Write everything in JS like React.createElement or Mithril. No build setup but a pain to use.
2) JSX. Requires a build setup which might become complex as the project grows.
3) Templates. Probably the less elegant of all 3 but the most pragmatic and easy to use.
Someone attempted to solve this and created a new language called Imba. It's like a mutant Ruby with HTML that compiles to JS.
It has a lot of productivity benefits compared to previous attempts at solving the same problem, but goddammit it's ugly.
It's easy enough to create a template/starter kit the way you want it and tweak it to your taste. Also when (not if) you get a problem you know what's going on instead of a black box.
For me, ClojureScript/Reagent [1] has been a dream come true. It marries JS, HTML and React very, very well. I still use normal CSS because I haven't hit a pain point with it yet, but there's some nice CSS tools that use EDN syntax and get rid of many CSS pain points. So far, I've only been able to use it for personal projects but they're not all small. I work with normal React at work on large projects and I've yet to run into anything I thought would be harder to do if were done with Reagent.
https://toggl.com/programming-princess/
I will take a more serious look at ClojureScript, thanks for the suggestion.
I jump around between C#, JS, HTML, XML, JSON, JSX, CSS, SQL and Clojure all day long. I have to do the non-Clojure stuff a lot more and have been doing them decades longer, after just a few weeks of getting used to it, Clojure would be my first choice.
We have webpack hot reloading so we can work on UI without any page refreshes.
It’s been very productive. I love the brevity of jade/pug. Jsx feels like a lot of boilerplate braces and ending tags.
Also: projects are still using the "jade" name? I thought they were forced to change?
The only reason I bear with the superfluous verbosity of JSX is because it plays well with typescript. The moment you switch to text based templates typesafety goes out of the window.
I really wish javascript/typescript had a good builder syntax like Ruby. Hyperstack [1] (previously Hyperloop) is a great project that uses ruby blocks for component composition. I wish this was possible in javascript.
But still I would recommend using JSX because it the "standard". Every documentation and problem solution you find on the internet is written with JSX. Using a JSX alternative will make debugging much harder for you.
One thing I like about JSX is that it looks and feels like HTML.
For me, that has two huge benefits:
1. It narrows the dissonance between the code I'm writing and the actual structure that will be rendering into the DOM. I find it much easier to write and debug when I don't have translate between some JS factory function and the actual DOM implementation.
2. It's almost pure HTML. Sure I'll have to change class to className and update some other tags. Generally, though, if something works in HTML, it's little fuss to do in JSX. With tools like JSX, I can write in a single templating language across all of my software.
It's also a pretty impressive demonstration of the typesafe flexibility of Kotlin's DSL support, but that's another conversation.
Purported benefits from the readme:
- Use the full expressiveness of ES6 / TypeScript to define user interfaces
- No enforced opinion about state handling, very flexible
- Clean, functional component composition & reuse, optionally w/ lazy evaluation
- No source pre-processing, transpiling or string interpolation
- Less verbose than HTML / JSX, resulting in smaller file sizes
- Supports arbitrary elements (incl. SVG), attributes and events in uniform, S-expression based syntax
- Supports branch-local custom update behaviors & arbitrary (e.g. non-DOM) target data structures to which tree diffs are applied to
- Component life cycle methods & behavior control attributes
- Suitable for server-side rendering and then "hydrating" listeners and components with life cycle methods on the client side
- Can use JSON for static components (or component templates)
- Optional dynamic user context injection (an arbitrary object/value passed to all component functions embedded in the tree)
- Default implementation supports CSS conversion from JS objects for style attribs (also see: @thi.ng/hiccup-css)
- Auto-expansion of embedded values / types which implement the IToHiccup or IDeref interfaces (e.g. atoms, cursors, derived views, streams etc.)
- Fast (see benchmark examples)
- Only ~6.2KB gzipped
Paired with Tachyons (best atomic CSS lib) you get superpowers and can write code like
const someComponent = ()
=> pug`
ul.p2.f3 Some list
li.red Some text
li.pink Some more`
[1] https://github.com/pugjs/babel-plugin-transform-react-pugI created a small language to demonstrate what I mean https://github.com/batiste/blop-language
JSX is a simple wrapper around a JS call, it is trivial to mentally convert from JSX to what the real JS is.
JSX is also super copy-pastable. Less logic and all that.
If you want complex logic around what JSX to render, it get factored out into a function call (or its own component), which returns the appropriate JSX after evaluating any required logic. This means you are back to plain JS with all the existing tooling and language features around it.
JSX being simple also makes the learning curve simple.
Then maybe it is an indication is not worth very much. Why not using something like hyperscript instead if it is just some javascript.
> JSX is also super copy-pastable. Less logic and all that.
In my experience the copy-paste-reuse in FE is a red herring. And React is no exception. And a logic less templating is not necessarily helping with a flexible/reusable piece of code.
> JSX being simple also makes the learning curve simple.
Not so sure about that. I think I would have personally preferred not having to learn a new DSL if some basic function call in Javascript can do the same job.
I guess I have been scared by colleagues using ugly ternary operator expressions with React.
I also used so many template languages in the past: PHP, Django, Pug, Rails, etc, etc. That I try to reproduce similar features/mistakes.
The only decision I dislike is renaming class to className. Why not klass, cls, cs... anything shorter.
ClassName is simple to understand but adds a lot of clutter to component files.
https://developer.mozilla.org/en-US/docs/Web/API/Element/cla...
- ES6 string literals
- partial template rendering
are few cool features with it.
Lit HTML seems very extensible, so it should be possible to add support for thus.
- no build step
- ergonomic
- fast
- flexible
- useful whether alone or in a library/framework wrapper (see LitElement, https://lit-element.polymer-project.org/, Haunted, https://github.com/matthewp/haunted, et al.)
Getting just about all the convenience of JSX with the ability to have your templates run in pure JS in the browser, with no build step is pretty rad. Even if the difference is just a few seconds here or there, multiply that by the amount of work I'm supposed to be getting done in a day, and it starts to add up.
It's also nice to have control over whether to work with attributes or properties. A level of control that is mirrored by having direct access to event binding (rather than an abstraction of it) so you can pin down whatever custom events you might be passing around your application.
Maybe that's my favorite part, you get control. Whether via the time you get back, the say you have over your templates, the interoperability of your code, you have it with lit-html in a way that JSX hasn't really allowed me to in my experiences with it.
It's an excellent project, pretty decently fast (checkout the js-framework-benchmark[1] code, or more specifically the results of round 8[2]) -- but is currently suffering from a lack of recognition. It's the kind of project that absolutely doesn't care about that kind of metric (as in, the team seems to be more focused on slow, steady improvement of the library rather than chasing stars on github), but I figured I should say something.
Shameless plug: I recently really wanted to contribute something (and kick the tires more) so I wrote an article that goes through replicating a simple mail design I saw[3] -- it might be a decent overview of what mithril is like to write (though I'm certainly not a mithril expert).
This brings me back to the point at hand -- as others have noted, in my opinion one of the best things about hyperscript is the straight-forwardness with which you construct the render function. I'm not convinced it's necessary to segregate stateless/stateful components -- and mithril is simpler in that it doesn't introduce this dichotomy -- in the end there's the render function, and that's it. If you want to use state, go ahead -- if you don't, then don't. It's the simplicity I've wanted from component frameworks (and mostly get with Vue) without any of the posturing/looming complexity.
Also there's the fact that you could write a completely vanilla es5 application with hyperscript (arguments whether you should or not aside) -- JSX is/was revolutionary, but is basically required in practice, which often makes people jump into bed with webpack without thinking, and makes frontend development harder than it has to be.
[EDIT] - Another point for mithril is that it's self contained -- routing and ajax calls some with the framework. When people these days talk about "react" or "vue" what they're really talking about is react/vue + react-router/vue-router + flux/vuex and some other odds and ends. Mithril is by far the simplest and most feature-complete of these frameworks despite being smaller (both conceptually and on-the-wire).
One of my only current gripes with Mithril is the lack of controllable subtree rendering (it isn't as much of a problem in practice, but more me wanting to optimize early).
[1]: https://github.com/krausest/js-framework-benchmark
[2]: https://www.stefankrause.net/wp/?p=504
[3]: https://vadosware.io/post/mithril-systemjs-and-rollup-gettin...
If you just want a vdom library, I would recommend something like https://github.com/snabbdom/snabbdom
The rationale is that mithril always tries to be explicit, whereas treeshaking is a form of compiler magic.
https://github.com/MithrilJS/mithril.js/graphs/contributors
Thanks to you and the team of contributors for your continued hard work on Mithril! I'm having a blast using it.
Adopting Mithril also opened me up to a whole list of lesser known but vigorously thought through projects like BSS, Patchinko and the beautiful Meiosis pattern which changed the way I went about developing resulting in far better productivity.
> Since I come across Mithril I have used it exclusively on all internal projects at our agency and haven't looked back.
I'd love to see some writing on some of the patterns you've developed with it! Also, it might be cool for mithril to have a "trusted by" section on their main page to showcase some companies that use mithril to increase trust for people who wander in (though I'm also OK with mithril not having this section -- it's a bit overly-prodcuty and distracting).
> Adopting Mithril also opened me up to a whole list of lesser known but vigorously thought through projects like BSS, Patchinko and the beautiful Meiosis pattern which changed the way I went about developing resulting in far better productivity.
> Adopting Mithril also opened me up to a whole list of lesser known but vigorously thought through projects like BSS, Patchinko and the beautiful Meiosis pattern which changed the way I went about developing resulting in far better productivity.
Thanks a ton for the references, looking up all those things right now, looks like more pieces of the Mithril ecosystem that I've never heard of. Patchinko looks super useful (I'm surprised I've never needed something like this in the past...), and Meiosis looks like a simpler version of the reactive/flux pattern, and looks interesting to me since it's cross-framework!
You should definitely join the Gitter chat for Mithril. It's a very active channel and a little lesser known part of the internet where you will get a constant flow of engaged developers of all levels discussing Mithril and also where some of the core team discuss concepts, roadmaps, ideas and drop knowledge.