HearthCode.dev / Code by Hearthlight

Hearth Code

HearthCode is a warm, low-glare VSCode theme system: code by hearthlight on blackboard dark and parchment light.

Rate on Marketplace Star on GitHub Help HearthCode grow: rating + star
Hearth Dark · Default / Hearth Dark Soft / Hearth Light
scroll to explore

HearthCode Philosophy

01

Ember, not flame

High-saturation syntax colors burn bright but exhaust your eyes. Hearth keeps all highlight colors at 40–60% saturation — warm like cooling coal, not blinding like fire.

02

Neither black nor white

Pure black backgrounds cause halation around white text, blurring edges. Hearth Dark (default) uses #23201c, Dark Soft uses #2a2723, and Hearth Light uses #efe6d8 for a warmer low-glare paper tone.

03

Hierarchy as semantics

Brightness maps directly to semantic weight: keywords are brightest, functions next, variables after, and comments deliberately fade into the background.

04

Color temperature as comfort

The entire palette is warm-toned, below 4500K. High blue-light content strains the retina. A warm coding environment is easier on your eyes over long sessions.

Color System

bg · dark #23201c Dark canvas — soot blackboard beside the hearth
bg · dark-soft #2a2723 Dark Soft canvas — warmer gray-black for lower night contrast stress
fg · dark #d3c9b8 Dark foreground — chalky parchment white for long focus 9.9:1 AAA
keyword #d36b4a Keywords — ember red for control flow anchors 4.6:1 AA
function #e3b368 Functions — brass amber for callable targets 8.4:1 AAA
string #8fbd79 Strings — moss green with warm base 7.5:1 AAA
type #5aa7b6 Types — mineral teal + italic for structural symbols 5.9:1 AA
number #d5865f Numbers — terracotta red for constants 5.7:1 AA
comment #6b5f4d Comments — intentionally dim, eye skips naturally 2.6:1 dec
bg · light #efe6d8 Light background — parchment off-white to reduce glare
fg · light #2f210e Light foreground — deep walnut brown for long-form reading 12.6:1 AAA

HearthCode Preview

Hearth Dark
// async data fetching with full type safety
import { createContext, useContext } from 'react'

interface ApiResponse<T> {
  data: T
  status: number
  ok: boolean
}

async function request<T>(
  url: string,
  options?: RequestInit
): Promise<ApiResponse<T>> {
  const res = await fetch(url, options)
  const data = await res.json() as T
  return { data, status: res.status, ok: res.ok }
}

const BASE = 'https://api.hearthcode.dev'
const TIMEOUT = 5_000
Hearth Dark Soft
// async data fetching with full type safety
import { createContext, useContext } from 'react'

interface ApiResponse<T> {
  data: T
  status: number
  ok: boolean
}

async function request<T>(
  url: string,
  options?: RequestInit
): Promise<ApiResponse<T>> {
  const res = await fetch(url, options)
  const data = await res.json() as T
  return { data, status: res.status, ok: res.ok }
}

const BASE = 'https://api.hearthcode.dev'
const TIMEOUT = 5_000
Hearth Light
// async data fetching with full type safety
import { createContext, useContext } from 'react'

interface ApiResponse<T> {
  data: T
  status: number
  ok: boolean
}

async function request<T>(
  url: string,
  options?: RequestInit
): Promise<ApiResponse<T>> {
  const res = await fetch(url, options)
  const data = await res.json() as T
  return { data, status: res.status, ok: res.ok }
}

const BASE = 'https://api.hearthcode.dev'
const TIMEOUT = 5_000