In this first development update, the tech, tools and development process of LightningLearn will be laid out. A recently coined new term called vibe coding will be introduced. Towards the end, some of the instrumentation choices still being evaluated will also be covered.

This will get technical. These development updates are meant for a technical audience – but if that’s not you, that’s ok! You can still glean some insight into things. Either way, thanks for being here.


Project Management

Obsidian

Internal documentation is done in Obsidian as local markdown files. The files are saved within the main git repository, but are not tracked by git (this is explained more below). Obsidian Sync is used to backup the vault.

To organize the vault, Maps of Content (MOCs) are primarily used. MOCs are markdown files that contain links to other markdown files. Right now, the vault has a MOC for each of the following:

  • Business
  • Product
  • Tech
  • Apps
  • Tools
  • Views
  • Features

Linear

For issue tracking and project management, Linear was chosen due to its extremely high quality and the Linear method approach to building software. It has all of the familiar concepts of traditional tools like Jira: issues, epics (projects), sprints (cycles), backlog and roadmaps. Linear keeps it lightweight and highly customizable, letting you scale complexity as you need.

I use a tool called a Linear MCP Server which allows reading from Linear within the IDE (more on that below).


Tech Stack

Monorepo

The code is version controlled with git and stored as a private repository on GitHub.

A monorepo is a single code repository that contains multiple projects or packages managed together. This monorepo is a pnpm workspace, therefore I am using pnpm to manage dependencies lightning fast since it installs dependencies concurrently.

In the pnpm workspace, there is a single node_modules folder at the root of the repo, yet each app can have it’s own package.json There is a root-level package.json which can control the individual packages files through pnpm filtering.

pnpm-workspace.yaml

packages:
  - "apps/**/*"
  - "libs/**/*"
  - "tools/**/*"

Blog

This blog is built with Hugo using a customized and extended PaperMod theme. Hugo was chosen for its speed and availability of theme templates.

I knew that I wanted a static site generator for the blog and to be able to write posts in markdown. It was important to begin writing the blog content quickly without worrying about the underlying technology, allowing me to focus on the main app as soon as possible.


Development Process

Windows Subsystem for Linux (WSL)

The development environment for LightningLearn is a Linux instance running on Windows using WSL. This allows me to use a native Linux command line and run Linux-specific packages.

Gitkraken

My git GUI of choice is Gitkraken running on WSL, chosen for its legendary status because of its developer experience and powerful, advanced features readily available through the UI.

VS Code

VS Code was a natural choice, given it’s dominance in the industry. Interestingly, the IDE runs on Windows but connects to the codebase on WSL using 2 official Windows extensions: Remote Explorer and WSL.

LLMs and Prompt Engineering

At the core of an AI-assisted development process are Large Language Models (LLMs). Explaining LLMs is beyond the scope of this blog post, but they are the key technology powering the AI boom in the world today, and there are many to choose from.

I use 2 LLMs primarily:

  • DeepSeek Reasoner for planning
  • Claude Sonnet 3.7 for coding

Cline

Cline is an AI assistant that can use the CLI aNd Editor. It is a VS code extension that actively seeks to understand the entire codebase. This is how I write natural language prompts to LLMs in order to generate source code.

Being able to understand the entire codebase as context for each prompt is a massive improvement from previous generations of AI-assistants. In the case of the LightningLearn codebase, since I keep the internal documentation inside of the repo (as markdown files in an Obsidian vault), Cline can understand more nuances about my requirements.

Having personally tested many other coding assistants, Cline has been the best developer experience for me, is functionally stable, and the successful launch of new features such as MCP Marketplace.

Cline Memory Bank

Due to the concept of a moving context window in the LLM, I use a modified version of the Cline Memory Bank in order to persist important knowledge and rules about the codebase that I want Cline to “remember” session after session.

Vibe Coding

A new term was recently coined from this X post by Andrej Karpathy, a founding member at OpenAI and a former Director of AI at Tesla.

There’s a new kind of coding I call “vibe coding”, where you fully give in to the vibes, embrace exponentials, and forget that the code even exists. It’s possible because the LLMs (e.g. Cursor Composer w Sonnet) are getting too good.

– Andrej Karpathy

It’s important to make a distinction here.

While vibe coding is a valid strategy for creating small projects quickly, it means letting the AI take the wheel and drive.

As a seasoned software engineer by career, I’m able to carefully plan and articulate to the AI exactly what I want done and even manually edit source code as needed. This is no longer vibe coding, but just AI-assisted development where I am in control. However, this should explain just how powerful the AI is at coding tasks today and why I believe that LightningLearn will be built quickly even as a solo dev.

MCP Servers

Model Context Protocol (MCP) is a new way to extend LLMs with custom plugins to extend their reach and capabilities. MCP Servers offer the AI-assistant new tools to use to accomplish specific tasks. The easiest way to get started with them is to use Cline’s MCP Marketplace.

The first one I am using is their Linear MCP Server to allow me to read and write to my Linear workspace for LightningLearn. By simply referencing an issue ID in my prompt, the LLM can call a tool to get the issue details and use those details to generate code. Very cool!


Other Tools

Cloudflare

The lightninglearn.ai domain is registered with Cloudflare, a leader in DNS services. This blog is hosted on Cloudflare Pages – their static site hosting which utilizes their worldwide CDN edge infrastructure.

Leonardo

Leonardo.ai is used to generate artwork. It has created the logo (book with a lightning bolt symbol), the blog cover images, and the X profile cover image from text prompts only.

They have an incredible feature called Flow State that generates many different versions from the same prompt. There is a small learning curve to get great results, but having tried many other AI art tools, I’ve found this to be the best for my needs.

Photopea

Photopea.com is best described as freemium, browser-based Photoshop alternative. If you’ve used Photoshop, you’ll find the interface strikingly similar. With this tool, the AI-generated images can be edited to add text, resize, crop and more.


Next Steps

Main app

I’ve reached the point where I feel it’s the right time to begin working on the main LightningLearn app for the web (mobile-responsive too). With the blog in place, the monorepo setup and the development environment running smoothly, I am now pivoting to finalizing the tech stack decision for the main app.

In a future post, the decision-making process will be explored as well as what decision I landed on. I’ve been experimenting with several different frameworks, libraries and service providers to see what I want to use for the main app, and after weeks of research I am “closing the loop” and seem to be arriving back at where I started: React and Supabase. We will see soon enough if that is what I decide to go with – or will SvelteKit win me over with its full-stack JavaScript capabilities?

The project is picking up speed and gaining momentum! Beta stage should be reached soon with the power of AI helping along the way. If you are interested in being a beta tester, please email [email protected]!