🎯 Sick of JavaScript framework fatigue? Here’s a breath of fresh air — meet Oat. In a world overloaded with massive UI libraries, tangled dependency trees, and constant churn in the Node.js ecosystem, Oat is a reminder that simplicity still matters. Built by Kailash Nadh, CTO at Zerodha (and seasoned open‑source developer), Oat is an ultra-lightweight UI library designed out of pure frustration with complexity... especially the bloat and dependency-hell of mainstream JS tools. 🔥 What makes Oat stand out? • Just ~8 KB total (≈6 KB CSS + ~2.2 KB JavaScript, gzipped)...tiny and fast to load. • Zero dependencies — no frameworks, no build tools, no package managers. • Semantic HTML-first — native elements are styled without cluttering your markup with classes. • Accessible by default — built with proper ARIA roles and keyboard support baked in. • Easy to theme — customize with CSS variables and even dark mode out of the box. • A library you just include and start building — no tooling or framework lock-in required. The creator openly talks about building this after “unending frustration” with over-engineered solutions and what he calls “Node.js ecosystem trauma” — and honestly, there’s something compelling about that perspective. In the chaos of AI hype and ever-changing web stacks, finding a simple, effective solution feels oddly refreshing — like rediscovering craftsmanship in code. 👉 Is this the future of web development? Or are we just romanticizing the past? Either way, a UI library that prioritizes minimalism, performance, and longevity feels like a much-needed alternative in 2026. https://oat.ink/ #WebDevelopment #JavaScript #UIDesign #DeveloperTools #OpenSource #NotSoAI
Meet Oat: A Lightweight UI Library for a Simpler Web
More Relevant Posts
-
🔥 JavaScript Event Loop Explained (Simply) JavaScript is single-threaded. But then how does this work? 👇 console.log("Start"); setTimeout(() => { console.log("Timeout"); }, 0); Promise.resolve().then(() => { console.log("Promise"); }); console.log("End"); Most developers get this wrong in interviews. Let’s break it down properly 👇 🧠 1️⃣ Call Stack Think of the Call Stack as: The place where JavaScript executes code line by line. It follows LIFO (Last In, First Out). console.log("Start") → runs immediately console.log("End") → runs immediately Simple so far. 🌐 2️⃣ Web APIs When JavaScript sees: setTimeout() It sends it to the browser’s Web APIs. Web APIs handle: setTimeout DOM events fetch Geolocation JavaScript doesn’t wait for them. 📦 3️⃣ Callback Queue (Macrotask Queue) After setTimeout finishes, its callback goes into the Callback Queue. But it must wait… Until the Call Stack is empty. ⚡ 4️⃣ Microtask Queue Promises don’t go to the normal queue. They go to the Microtask Queue. And here’s the important rule 👇 Microtasks run BEFORE macrotasks. So the execution order becomes: 1️⃣ Start 2️⃣ End 3️⃣ Promise 4️⃣ Timeout 🎯 Final Output: Start End Promise Timeout 💡 Why This Matters Understanding the Event Loop helps you: ✔ Debug async issues ✔ Write better Angular apps ✔ Avoid race conditions ✔ Pass senior-level interviews Most developers memorize async code. Senior developers understand the Event Loop. Which one are you? 👀 #JavaScript #Angular #Frontend #WebDevelopment #EventLoop #Async
To view or add a comment, sign in
-
-
🟨 𝗝𝗮𝘃𝗮𝗦𝗰𝗿𝗶𝗽𝘁 𝗗𝗮𝘆 𝟱𝟰: 𝗧𝗵𝗲 .sort() 𝗠𝘂𝘁𝗮𝘁𝗶𝗼𝗻 𝗧𝗿𝗮𝗽 (𝗥𝗲𝗮𝗰𝘁 𝗦𝘁𝗮𝘁𝗲 𝗕𝘂𝗴) In JavaScript, .sort() looks harmless — but in React apps it can break your UI with a confusing error. 🔹 𝗧𝗵𝗲 𝗣𝗿𝗼𝗯𝗹𝗲𝗺 𝗜 𝗙𝗮𝗰𝗲𝗱 While rendering a list, I sorted the data directly before mapping. Everything worked… until this error appeared: ❌ 𝘊𝘢𝘯𝘯𝘰𝘵 𝘢𝘴𝘴𝘪𝘨𝘯 𝘵𝘰 𝘳𝘦𝘢𝘥 𝘰𝘯𝘭𝘺 𝘱𝘳𝘰𝘱𝘦𝘳𝘵𝘺 '0' 𝘰𝘧 𝘰𝘣𝘫𝘦𝘤𝘵 '[𝘰𝘣𝘫𝘦𝘤𝘵 𝘈𝘳𝘳𝘢𝘺]' 🔹 𝗪𝗵𝘆 𝗧𝗵𝗶𝘀 𝗛𝗮𝗽𝗽𝗲𝗻𝘀 .sort() mutates the original array. In React: • State and props are treated as immutable • Libraries like Redux / React Query may freeze data • Mutating them directly can cause runtime errors 🔹 𝗧𝗵𝗲 𝗕𝘂𝗴 𝘵𝘳𝘢𝘯𝘴𝘢𝘤𝘵𝘪𝘰𝘯𝘴.𝘴𝘰𝘳𝘵((𝘢, 𝘣) => 𝘯𝘦𝘸 𝘋𝘢𝘵𝘦(𝘣.𝘥𝘢𝘵𝘦) - 𝘯𝘦𝘸 𝘋𝘢𝘵𝘦(𝘢.𝘥𝘢𝘵𝘦)); Here: • transactions came from state/props • .sort() tried to modify it in-place • React blocked the mutation → 💥 error 🔹 𝗧𝗵𝗲 𝗙𝗶𝘅 Always clone before sorting. [...transactions].sort((a, b) => new Date(b.date) - new Date(a.date)); Now: • Original state stays untouched • Sorting happens on a new array • React stays happy ✅ 🔹 𝗠𝘂𝘁𝗮𝘁𝗶𝗻𝗴 𝗠𝗲𝘁𝗵𝗼𝗱𝘀 𝘁𝗼 𝗪𝗮𝘁𝗰𝗵 𝗢𝘂𝘁 𝗙𝗼𝗿 • sort() • reverse() • push() / pop() • splice() 🔹 𝗞𝗲𝘆 𝗧𝗮𝗸𝗲𝗮𝘄𝗮𝘆 .sort() mutates. React state should not. Immutability in React isn't optional — it's the rule. 💬 GitHub example in the comments. #JavaScript #React #Frontend #100DaysOfCode #Day54
To view or add a comment, sign in
-
Is your React component becoming a "Fat Component"? We’ve all been there. You start a project, and everything is clean. But then... 1. You add an API fetch. 2. You add form validation. 3. You add window resize listeners. Suddenly, your 20-line component is 150 lines long, and your UI is buried under a mountain of logic. The fix? Custom Hooks. I call it the "Power Strip" pattern. Instead of plugging everything into your component, you plug it into a hook and just use one line of code to bring that logic in. In my latest article, I break down: How to identify "Logic Bloat." The 3 rules of building your own hooks. A real-world useFetch example you can use today. If you want to shrink your codebase and write professional-grade React, check out the full guide here: https://lnkd.in/gNqZkznW What’s one logic block you find yourself copying and pasting constantly? Let’s talk in the comments! #ReactJS #WebDevelopment #CleanCode #JavaScript #ProgrammingTips #Frontend
To view or add a comment, sign in
-
𝐈𝐬 𝐲𝐨𝐮𝐫 𝐮𝐬𝐞𝐄𝐟𝐟𝐞𝐜𝐭 𝐫𝐮𝐧𝐧𝐢𝐧𝐠 𝐢𝐧𝐟𝐢𝐧𝐢𝐭𝐞𝐥𝐲 𝐨𝐫 𝐦𝐨𝐫𝐞 𝐭𝐡𝐚𝐧 𝐢𝐭 𝐬𝐡𝐨𝐮𝐥𝐝? 𝐓𝐡𝐞 𝐜𝐮𝐥𝐩𝐫𝐢𝐭 𝐢𝐬 𝐨𝐟𝐭𝐞𝐧 𝐬𝐢𝐦𝐩𝐥𝐞𝐫 𝐭𝐡𝐚𝐧 𝐲𝐨𝐮 𝐭𝐡𝐢𝐧𝐤. One of the most common pitfalls with `useEffect` in React is including non-primitive values (objects, arrays, functions) directly in its dependency array without proper handling. Every time your component re-renders, if you create a new object or array literal, or a new function instance, its reference changes. ```javascript useEffect(() => { /* fetch data using config */ }, [config]); ``` If `config` is an object created directly inside your component, even if its properties are identical, `useEffect` sees a new object reference on every render. This forces the effect to re-run, leading to unnecessary computation, API calls, or even infinite loops. **The Fix:** 1. **Destructure Primitives:** If you only need specific primitive properties from an object, destructure them out and add only those to the dependency array. ```javascript const { baseUrl, timeout } = apiConfig; ``` ```javascript useEffect(() => { // ... use baseUrl, timeout }, [baseUrl, timeout]); ``` 2. **Memoize Objects/Arrays:** If the entire object/array is a dependency and is derived from stable values, use `useMemo` to memoize its creation. This ensures its reference remains stable across renders unless its own dependencies change. ```javascript const stableConfig = useMemo(() => ({ baseUrl: '/api', timeout: 5000 }), []); ``` ```javascript useEffect(() => { // ... use stableConfig }, [stableConfig]); ``` 3. **Memoize Functions:** For functions, use `useCallback` to prevent new function instances on every render, ensuring a stable reference for your dependency array. Understanding how JavaScript handles reference equality is key to mastering `useEffect` and writing performant React applications. What's your go-to strategy for managing complex `useEffect` dependencies? #React #ReactJS #Frontend #JavaScript #WebDevelopment #Performance
To view or add a comment, sign in
-
Favorite Project Starter and Tooling for Frontend Efficiency ⚡ Over the past few years, I’ve refined a personal stack that optimizes for type safety, scalability, and developer efficiency. These are the tools I reach for when starting serious frontend and full-stack projects: Framework: React.js Still the most flexible UI library. The ecosystem maturity and composability make it hard to beat. Router: TanStack Router Been using it for ~2 years, and it’s been rock solid. Why I prefer it: • First-class type safety for routes • File-based + code-based routing flexibility • Excellent DX and scalability model Styling: Chakra UI v2 I’ve used Tailwind, ShadCN, Ant Design, Bootstrap, and Chakra UI — but Chakra UI v2 remains my favorite. It strikes the right balance between: • Developer speed • Composability • Clean component architecture Dev Server / Bundler: Vite Fast, minimal config, and no webpack or babel overhead. It removes friction so you can focus on building. Schema Validation: Zod (or Yup) Runtime validation + type safety is essential, especially at API boundaries. Forms: Formik & React Hook Form Both are excellent, but I personally enjoy Formik’s component-based architecture. I liked the pattern so much that I built custom React Hook Form abstractions inspired by Formik’s declarative style. Data Fetching: TanStack Query (React Query) This is non-negotiable for serious apps. • Built-in caching • Cache invalidation • Server state synchronization • Eliminates most global state needs Redux Toolkit Thunk works, but the boilerplate and lack of native caching make it less efficient for modern apps. Full-stack additions: Framework: Next.js Despite frequent patches, it’s still the most production-proven full-stack React framework. Also keeping an eye on TanStack Start. Database: PostgreSQL Reliable, scalable, and production-tested. ORM: Prisma Clean, type-safe, functional query style. Excellent developer experience. Auth: Clerk or Kinde Both provide modern authentication flows with minimal setup. The biggest productivity gains don’t come from knowing more tools — they come from choosing the right ones and using them consistently. Curious — what’s your current go-to starter stack? #ReactJS #FrontendDevelopment #WebDevelopment #SoftwareEngineering #JavaScript #NextJS #TypeScript #DeveloperTools #FrontendEngineering #Programming
To view or add a comment, sign in
-
-
If the browser already updates the DOM efficiently… why are we simulating it in JavaScript? Modern frameworks introduced the Virtual DOM to solve real problems. - It abstracts direct DOM manipulation. - It batches updates. - It improves consistency. But here’s what often gets overlooked: The browser is already optimized to manipulate the DOM (jQuery was doing this already). When you click a button in a runtime-heavy framework, this typically happens: - State changes - A virtual tree is recreated - A diffing algorithm runs - Changes are calculated - Reconciliation happens - DOM updates are committed All inside the browser. Now compare that to a compile-time approach. Instead of shipping an engine that figures out what changed, the framework analyzes your component during build. It knows exactly which DOM node depends on which variable; So when state changes, it updates that node directly. - No virtual tree. - No diffing cycle. - No reconciliation bookkeeping. Just targeted DOM instructions. Here’s the deeper question: Are we optimizing around the DOM…; or avoiding trusting it? Typical runtime-heavy bundle overhead: 30–40KB+ core framework logic Typical compile-first runtime engine: near zero Average Time to Interactive: - Runtime-heavy apps: 3–4 seconds - Compile-optimized apps: 1.5–2 seconds These numbers aren’t magic. They’re architectural consequences. This isn’t React vs Svelte; It’s simulation vs precision. Tomorrow, we’ll look at where Virtual DOM still makes sense — and where it doesn’t. Stay tuned #Svelte #FrontendDevelopment #WebPerformance #JavaScript #ReactJS #UIArchitecture #CompiledSpeed #WebEngineering #SvelteWithSriman
To view or add a comment, sign in
-
🚀 JavaScript Event Loop – The Real Game Changer Behind Async Code Most developers use setTimeout, Promises, or async/await daily… But very few truly understand what’s happening behind the scenes. Let’s break down the JavaScript Event Loop 👇 🧠 First, Understand This: JavaScript is single-threaded. It has: • Call Stack • Web APIs (Browser / Node environment) • Microtask Queue • Macrotask Queue • Event Loop 📌 How It Works: 1️⃣ Code runs line by line in the Call Stack. 2️⃣ Async operations move to Web APIs. 3️⃣ When completed, they move to: • Microtask Queue → Promise.then, catch, finally • Macrotask Queue → setTimeout, setInterval 4️⃣ Event Loop checks: • Is Call Stack empty? • If yes → Run ALL Microtasks first • Then run ONE Macrotask • Repeat 💡 Example: console.log("Start"); setTimeout(() => { console.log("Timeout"); }, 0); Promise.resolve().then(() => { console.log("Promise"); }); console.log("End"); 👉 Output: Start End Promise Timeout Why? Because Microtasks (Promises) always execute before Macrotasks (setTimeout). 🎯 Why This Matters: Understanding the Event Loop helps you: • Debug async issues • Improve performance • Build real-time applications • Crack senior-level JavaScript interviews 🔥 Advanced Insight: In engines like V8 (used in Chrome and Node.js): • Call Stack uses stack memory • Objects are stored in heap memory • Garbage Collector cleans unused memory • Event Loop coordinates task execution JavaScript feels multi-threaded… But it's actually an illusion created by the Event Loop. If you had to explain it in one sentence: “The Event Loop is the traffic controller of asynchronous JavaScript.” #javascript #webdevelopment #nodejs #reactjs #async #eventloop #programming #softwareengineering
To view or add a comment, sign in
-
-
One thing that often surprises developers moving from JavaScript to Go is how differently memory leaks happen. In environments like Node.js running on JavaScript, memory leaks are usually associated with: forgotten event listeners large objects kept in closures growing caches or maps that are never cleaned Since JavaScript runs on a garbage-collected runtime, leaks usually mean objects remain referenced somewhere, preventing the GC from freeing them. But in Go, memory leaks often look very different. Go also has garbage collection, but many real-world leaks come from goroutines that never exit. Example: func worker(ch chan int) { for { value := <-ch process(value) } } If nothing ever sends data to ch, this goroutine will block forever. Individually this seems harmless, but imagine thousands of goroutines stuck waiting — each one still consumes stack memory and runtime resources. In production systems this pattern can slowly accumulate and behave exactly like a memory leak. A common fix is introducing cancellation signals using contexts: func worker(ctx context.Context, ch chan int) { for { select { case value := <-ch: process(value) case <-ctx.Done(): return } } } Another subtle leak pattern in Go is unbounded maps used as caches: var cache = map[string]Data{} Without eviction logic, this structure will grow forever. Unlike JavaScript environments where frameworks often provide caching utilities, Go encourages developers to design explicit lifecycle management. The key lesson when moving from JavaScript to Go: JavaScript leaks are often reference leaks. Go leaks are often lifecycle leaks. Understanding that difference changes how you think about system design. Memory management is not only about the garbage collector- it’s about how long your processes, goroutines, and data structures are allowed to live. #SoftwareDevelopment #Golang #CS #Javascript #MemoryLeaks
To view or add a comment, sign in
-
-
🚀 Simple CRUD User Form Project I recently built a Simple CRUD application to practice full-stack development concepts using HTML, CSS, JavaScript, and Node.js. 📌 Project Description This project allows users to enter their Name and Email ID through a form. Once submitted, the data is stored using Local Storage and displayed dynamically in a table on the UI. ✨ Features • User input form for Name and Email • Store data using Local Storage • Display stored users in a dynamic table • Perform CRUD operations (Create, Read, Update, Delete) • Simple and responsive UI 🛠 Tech Stack • HTML – Structure • CSS – Styling • JavaScript – Logic and DOM manipulation • Node.js – Backend practice environment • Local Storage – Data persistence in the browser 📚 What I Learned ✔ Handling form inputs and validation ✔ Working with Local Storage in JavaScript ✔ Implementing CRUD functionality ✔ Dynamically updating UI using DOM manipulation This project helped me understand how user input can be stored, managed, and displayed dynamically in a web application. Looking forward to building more projects and improving my full-stack development skills! #WebDevelopment #JavaScript #NodeJS #CRUD #FrontendDevelopment #LearningByDoing #TechnoHacks #MentorSandipGavit
To view or add a comment, sign in
-
Are React and Next.js Making Developers 'Lazy' and 'Weak' at JavaScript? We are living in the golden age of abstractions, but at what cost? Lately, I’ve noticed a shifting trend: new developers are jumping straight into Next.js or React before they even understand how the browser actually works. While these frameworks make building UIs faster, they are creating a generation of "Framework Operators" rather than "Software Engineers." Why we are becoming 'Lazy': Abstraction Overload: We know how useState works, but we don't understand Closures or Lexical Scope. Dependency Crutch: Instead of writing a simple utility function, we reach for an NPM package. We’ve traded logic for npm install. Magic Features: Next.js handles routing, data fetching, and SSR so seamlessly that many developers no longer understand Vanilla Web APIs, the Request/Response cycle, or DOM Manipulation. The Risk: When you only master a framework, your skills have an expiration date. Frameworks change, APIs get deprecated, and trends shift. If the "magic" of the framework is removed, can you still solve the problem? A framework should be a power tool for productivity, not a replacement for fundamental knowledge. 💡 My Advice: By all means, use React to build your products. But spend your weekends with Vanilla JavaScript. Master the language, not just the library. React will eventually be replaced. JavaScript (and your logic) will not. What’s your take? Are we losing our edge by relying too much on the "Magic" of modern frameworks? #JavaScript #ReactJS #NextJS #WebDevelopment #SoftwareEngineering #TechDebate #CleanCode
To view or add a comment, sign in
-
Explore content categories
- Career
- Productivity
- Finance
- Soft Skills & Emotional Intelligence
- Project Management
- Education
- Technology
- Leadership
- Ecommerce
- User Experience
- Recruitment & HR
- Customer Experience
- Real Estate
- Marketing
- Sales
- Retail & Merchandising
- Science
- Supply Chain Management
- Future Of Work
- Consulting
- Writing
- Economics
- Artificial Intelligence
- Employee Experience
- Workplace Trends
- Fundraising
- Networking
- Corporate Social Responsibility
- Negotiation
- Communication
- Engineering
- Hospitality & Tourism
- Business Strategy
- Change Management
- Organizational Culture
- Design
- Innovation
- Event Planning
- Training & Development