Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
f603824
feat(http): scaffold space registration, route and locales
antonreshetov Apr 30, 2026
463d50a
feat(http): add storage types, paths and contracts
antonreshetov Apr 30, 2026
ef372d9
feat(http): add state, frontmatter parser and disk sync
antonreshetov Apr 30, 2026
508e091
feat(http): add folders and requests storages
antonreshetov Apr 30, 2026
989970e
feat(http): wire environments, history, provider and watcher
antonreshetov Apr 30, 2026
4140784
feat(http): add API DTOs and routes for folders, requests, environmen…
antonreshetov Apr 30, 2026
ccc817c
feat(http): add execute IPC handler with undici, env interpolation an…
antonreshetov Apr 30, 2026
3927edd
refactor(http): extract shared types to src/main/types/http.ts
antonreshetov Apr 30, 2026
d91d9b1
feat(http): add renderer composables for folders, requests, environme…
antonreshetov Apr 30, 2026
624ea4c
feat(http): scaffold 3-column space layout with sidebar/editor/response
antonreshetov Apr 30, 2026
25ed720
feat(http): render sidebar tree with folders, requests and context menus
antonreshetov Apr 30, 2026
a8b1f9b
feat(http): split layout into folders sidebar, requests list and edit…
antonreshetov Apr 30, 2026
028d0aa
fix(http): use registered Http* component names and add search input
antonreshetov Apr 30, 2026
3377808
fix(http): match notes list header layout (single search row with + b…
antonreshetov Apr 30, 2026
e697cf9
feat(http): add description and enabled flags on header/query KV entries
antonreshetov May 1, 2026
6304ca5
feat(http): redesign KeyValueTable with checkbox, description column …
antonreshetov May 1, 2026
4dab428
refactor(http-editor): polish header, drop save button and rename des…
antonreshetov May 1, 2026
6f0eff4
style(http): show full uppercase method label in HttpMethodBadge
antonreshetov May 1, 2026
34a817c
refactor(http): migrate folders sidebar to UiTree with multi-select a…
antonreshetov May 1, 2026
dddd45f
feat(http): multi-select, multi-delete and drag-drop in request list
antonreshetov May 1, 2026
513842d
feat(store): add http selection state to app store
antonreshetov May 1, 2026
da0a16d
feat(http): persist selected request and folder across reloads
antonreshetov May 1, 2026
9a05182
refactor(http): remove unused send button label and folder info display
antonreshetov May 1, 2026
a7df7d5
feat(http): bidirectional sync between request URL and query params
antonreshetov May 1, 2026
786cbf7
feat(http): implement body, auth and description tabs
antonreshetov May 1, 2026
a46bc35
feat(http): polish ResponsePanel with status, headers and copy
antonreshetov May 1, 2026
cd053a8
fix(http): use Http* prefix for tab components
antonreshetov May 1, 2026
3a0da80
feat(http): replace body textarea with CM6 editor and JSON validation
antonreshetov May 1, 2026
c630f6f
feat(http): validate JSON body on blur instead of every change
antonreshetov May 1, 2026
018f9d7
fix(http): hide internal JSON parse error details from user
antonreshetov May 1, 2026
9538175
fix(http): nest response i18n keys inside editor namespace
antonreshetov May 1, 2026
0ecd8bd
fix(http): apply custom scrollbar class to overflow containers
antonreshetov May 1, 2026
7e2d0e0
feat(http): hide pre-request tab until implementation
antonreshetov May 1, 2026
fda004c
fix(http): avoid duplicate query params
antonreshetov May 1, 2026
374ed73
fix(http): refresh state after storage changes
antonreshetov May 1, 2026
f8761f4
fix(http): persist active space
antonreshetov May 1, 2026
79232a4
fix(http): localize empty request url
antonreshetov May 1, 2026
e370fc6
feat(http): support sidebar/list visibility toggle via View menu
antonreshetov May 1, 2026
d3dd144
style(http): align RequestEditor header with code/notes editor pattern
antonreshetov May 2, 2026
de73d15
style(http): drop font-mono from URL input
antonreshetov May 2, 2026
cf1ae42
feat(http): api-based search with state restore
antonreshetov May 2, 2026
6dba1f4
feat(http): environments switcher and manager dialog
antonreshetov May 2, 2026
59d984c
feat(http): variable interpolation highlight and autocomplete
antonreshetov May 2, 2026
f70559c
style(http): render {{var}} as chips
antonreshetov May 2, 2026
dd190fa
style(http): theme-aware {{var}} chip colors via tokens
antonreshetov May 2, 2026
00c9581
feat(http): add request name input above url row
antonreshetov May 2, 2026
8970cc2
style(http): use default variant for method select and url input
antonreshetov May 2, 2026
3fc379c
style(http): tweak environment and send icons in editor header
antonreshetov May 2, 2026
ff31b57
feat(http): validate request name on rename
antonreshetov May 2, 2026
20c5b37
feat(http): auto-rename request on folder change conflict
antonreshetov May 2, 2026
ce43dc1
chore: prevent auto-focus on close for environment popover
antonreshetov May 3, 2026
6ea0ea4
fix(http): make response panel resizable
antonreshetov May 3, 2026
bb70e98
feat(http): add request preview panel
antonreshetov May 3, 2026
cacac56
refactor(http): use compact preview copy action
antonreshetov May 3, 2026
743dade
refactor(http): add response header copy action
antonreshetov May 3, 2026
6660225
refactor(http): move response summary to bottom panel
antonreshetov May 3, 2026
059791a
refactor(http): reuse code viewer for response body
antonreshetov May 3, 2026
6a16809
refactor(cm): share editor extensions
antonreshetov May 3, 2026
04becfb
feat(http): highlight request preview
antonreshetov May 3, 2026
c418d76
refactor(cm): remove notes extension aliases
antonreshetov May 3, 2026
15665a8
feat(http): move environments to sidebar
antonreshetov May 3, 2026
58544f2
feat(http): track donation activity
antonreshetov May 3, 2026
f8b85ae
fix(http): align environment rows
antonreshetov May 3, 2026
57cf97d
refactor(http): align body editor with cm6 viewer
antonreshetov May 3, 2026
98d6e36
fix(http): use ui font in url input
antonreshetov May 3, 2026
ec2c1c9
feat(http): reorder math space definition in getSpaceDefinitions
antonreshetov May 3, 2026
a517457
feat(http): add send request shortcut
antonreshetov May 3, 2026
e52b35c
feat(notes): link http requests
antonreshetov May 3, 2026
960f0b9
fix(http): refresh vault changes
antonreshetov May 3, 2026
2e7935d
fix(http): interpolate preview variables
antonreshetov May 3, 2026
c8e67ad
feat(http): expand request context menu
antonreshetov May 3, 2026
19306e0
feat(http): add http preferences
antonreshetov May 3, 2026
f5740c5
fix(http): tune environment panel
antonreshetov May 3, 2026
226e7df
fix(http): confirm environment deletes
antonreshetov May 3, 2026
7da32cf
refactor(http): reuse key value table
antonreshetov May 3, 2026
619f5f0
fix(http): improve selected request item
antonreshetov May 3, 2026
934c30e
feat(http): add folder custom icons
antonreshetov May 3, 2026
c826ab2
fix(http): select first request on folder change
antonreshetov May 3, 2026
20f12a3
docs: add http space documentation
antonreshetov May 3, 2026
c757d0f
chore(docs): remove AppVersion tag from environments and requests doc…
antonreshetov May 3, 2026
c54f644
fix(http): prevent environment dialog autofocus tooltips
antonreshetov May 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .github/workflows/build-sponsored.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,5 +76,3 @@ jobs:
dist/*.snap
if-no-files-found: warn
retention-days: 30


2 changes: 0 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -118,5 +118,3 @@ jobs:
append_body: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,4 @@ fix #123

It's ok to have multiple commits in a single PR, you don't need to rebase or force push for your changes as we will use Squash and Merge to squash the commits into one commit when merging.

And of course please test your code before PR.
And of course please test your code before PR.
17 changes: 14 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ A free, open-source developer workspace.
</p>

<p align="center">
<strong>Snippets, notes, calculations, and dev tools in one local-first app.</strong>
<strong>Snippets, notes, HTTP requests, calculations, and dev tools in one local-first app.</strong>
<br>
Your data stays on your machine as plain Markdown files.
</p>
Expand Down Expand Up @@ -75,7 +75,7 @@ massCode is free and open source. But building and maintaining a quality tool ta

## About

Originally a snippet manager, massCode now brings together snippets, notes, calculations, and developer tools in one desktop app, so everyday work stays in one place.
Originally a snippet manager, massCode now brings together snippets, notes, HTTP requests, calculations, and developer tools in one desktop app, so everyday work stays in one place.

## Features

Expand All @@ -101,6 +101,17 @@ Write longer markdown documents right next to your snippets: project docs, draft
- Fullscreen presentation mode for demos and meetings
- Callout blocks and image embedding

### HTTP Client

Keep API requests close to your code snippets and project notes with a lightweight HTTP client built into massCode.

- Organize requests with folders and custom folder icons
- Use environments and `{{variables}}` for local, staging, and production APIs
- Edit params, headers, body, auth, and markdown descriptions
- Preview requests as raw HTTP or cURL before sending
- Inspect response status, time, size, body, and headers
- Send the current request with <kbd>Cmd+Enter</kbd> on macOS or <kbd>Ctrl+Enter</kbd> on Windows and Linux

### Math Notebook

A calculator-style notebook for natural-language calculations, conversions, and date math without leaving your workflow.
Expand All @@ -122,7 +133,7 @@ Built-in utilities for the small tasks that usually send you to a browser tab:

## Markdown Vault

Your snippets and notes live as plain `.md` files on disk with frontmatter metadata, so the data stays readable and portable.
Your snippets, notes, and HTTP requests live as plain `.md` files on disk with frontmatter metadata, so the data stays readable and portable.

- **Git-friendly** - track changes and sync via any Git remote
- **Cloud sync** - works with iCloud, Dropbox, Google Drive, Syncthing
Expand Down
2 changes: 1 addition & 1 deletion docs/website/.vitepress/_data/assets.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
"win": "https://github.com/massCodeIO/massCode/releases/download/v4.7.1/massCode-4.7.1-x64.exe",
"winPortable": "https://github.com/massCodeIO/massCode/releases/download/v4.7.1/massCode-4.7.1-x64-portable.exe",
"linux": "https://github.com/massCodeIO/massCode/releases/download/v4.7.1/massCode-4.7.1.AppImage"
}
}
8 changes: 8 additions & 0 deletions docs/website/.vitepress/config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,14 @@ export default defineConfig({
{ text: 'Search', link: '/documentation/notes/search' },
],
},
{
text: 'HTTP',
items: [
{ text: 'HTTP Client', link: '/documentation/http/' },
{ text: 'Requests', link: '/documentation/http/requests' },
{ text: 'Environments', link: '/documentation/http/environments' },
],
},
{
text: 'Math',
items: [
Expand Down
49 changes: 49 additions & 0 deletions docs/website/documentation/http/environments.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
---
title: HTTP Environments
description: "Use HTTP environments in massCode to manage reusable variables for local, staging, and production API requests."
---

# Environments

Environments store reusable variables for requests. Use them for values that change between local, staging, and production APIs, such as base URLs, user IDs, organization IDs, and tokens.

<img :src="withBase('/http-envs.png')">

## Variables

Use variables with double braces:

```text
{{apiUrl}}/v1/users/{{userId}}/sessions
```

The URL field keeps variables visible while you edit. Preview and request execution resolve variables from the active environment.

Variables can be used in:

- URL
- params
- headers
- body
- auth fields

## Active Environment

Use the **Environments** panel below folders to choose the active environment.

Select **No environment** when you want requests to keep variables unresolved. This is useful when you are editing templates or copying a request without applying local values.

## Managing Environments

Open **Manage** from the Environments panel to create environments and edit variables.

Each environment has:

- a name
- a key-value table of variables

The active environment is stored as part of the HTTP space state.

<script setup>
import { withBase } from 'vitepress'
</script>
46 changes: 46 additions & 0 deletions docs/website/documentation/http/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
---
title: HTTP Client
description: "Use the HTTP space in massCode as a lightweight local-first API client for saved requests, environments, previews, and responses."
---

# HTTP Client

<AppVersion text=">=5.3" />

HTTP is the API client space inside massCode. Use it to keep reusable requests next to your snippets and notes, test endpoints during development, and store small API collections in your local vault.

Access HTTP from the **HTTP** icon in the Space rail. The layout follows the same workspace pattern as Code and Notes: folders on the left, requests in the middle, and the request editor with preview and response panels on the right.

<img :src="withBase('/http.png')">

## When to use HTTP

Use HTTP when you want a lightweight request client without leaving massCode.

- test local or remote API endpoints
- save repeatable requests by project or service
- keep request descriptions close to implementation notes
- switch variables between local, staging, and production environments
- copy a request as raw HTTP or cURL for debugging and sharing

## Main Concepts

### [Requests](/documentation/http/requests)

Requests store the method, URL, params, headers, body, auth settings, and markdown description for an API call. The editor autosaves changes, shows an outgoing request preview, and sends the selected request with <kbd>Cmd+Enter</kbd> on macOS or <kbd>Ctrl+Enter</kbd> on Windows or Linux.

### [Environments](/documentation/http/environments)

Environments store reusable variables for local, staging, and production APIs. The URL field keeps variables visible while you edit, while preview and request execution resolve values from the active environment.

## Folders

HTTP requests are organized in folders. Selecting a folder shows its requests and selects the first request in that folder. Folders support nesting, drag and drop ordering, inline rename, and custom folder icons.

## Storage

HTTP data is stored in your vault under the `http` folder. Requests are markdown files with YAML frontmatter, so they can be backed up and synced together with the rest of your massCode data.

<script setup>
import { withBase } from 'vitepress'
</script>
68 changes: 68 additions & 0 deletions docs/website/documentation/http/requests.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
---
title: HTTP Requests
description: "Create, edit, preview, send, duplicate, and inspect HTTP requests in the massCode HTTP space."
---

# Requests

Requests are the main items in the HTTP space. Each request stores the method, URL, params, headers, body, auth settings, and a markdown description.

## Creating Requests

Create a request from the request list header or from a folder context menu. New requests are created in the selected folder.

Request context menus include actions for:

- duplicate
- delete
- copy request preview
- copy internal link
- reveal in file manager

## Request Editor

The request editor is split into focused tabs:

- **Params** - query parameters sent with the URL
- **Headers** - request headers
- **Body** - JSON, text, form URL encoded, or multipart form data
- **Auth** - none, bearer token, or basic auth
- **Description** - markdown notes for the request

Changes are saved automatically while you edit.

## Body

Use the body tab to choose the payload format for methods that send data.

- **JSON** and **Text** use a CodeMirror editor.
- **Form URL Encoded** uses key-value rows.
- **Multipart Form Data** supports text and file rows.

## Sending Requests

Send the selected request with one of these methods:

- Click the send button next to the URL field.
- Select **"Editor"** > **"Send Request"** from the menu bar.
- Press <kbd>Cmd+Enter</kbd> on macOS or <kbd>Ctrl+Enter</kbd> on Windows or Linux.

## Preview

The lower panel can show the outgoing request before it is sent.

- **HTTP** preview shows the request line, host, headers, and body.
- **cURL** preview builds a command you can paste into a terminal.

Use the copy button in the preview panel to copy the active preview.

## Response Viewer

After a request is sent, the response panel shows:

- status, duration, and response size
- body and headers tabs
- JSON formatting for JSON responses
- copy action for response body and headers

HTTP has its own editor preferences, including line wrapping for request previews, request bodies, and response viewers.
8 changes: 6 additions & 2 deletions docs/website/documentation/index.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
---
title: Documentation Overview
description: "Explore the massCode documentation for code snippets, markdown notes, math notebook, storage, sync, themes, JSON Diff, and built-in developer tools."
description: "Explore the massCode documentation for code snippets, markdown notes, HTTP requests, math notebook, storage, sync, themes, JSON Diff, and built-in developer tools."
---

# Overview

massCode is a free and open source developer workspace for code snippets, markdown notes, calculations, and quick developer utilities. Instead of scattering everyday work across an editor, a notes app, a calculator, and a handful of websites, you keep it in four focused Spaces inside one local-first desktop app.
massCode is a free and open source developer workspace for code snippets, markdown notes, HTTP requests, calculations, and quick developer utilities. Instead of scattering everyday work across an editor, a notes app, an HTTP client, a calculator, and a handful of websites, you keep it in focused Spaces inside one local-first desktop app.

Switch between Spaces using the rail on the left side of the app.

Expand All @@ -19,6 +19,10 @@ Use Code to build a reusable snippet library across projects and languages. The

Use Notes for longer markdown documents that do not fit well into snippets: project notes, drafts, technical docs, meeting notes, and personal knowledge bases. It uses the same three-column layout as Code and adds a Notes Dashboard, live preview, a notes graph, mindmaps, and fullscreen presentation mode.

## HTTP

Use HTTP as a lightweight API client inside massCode. Store requests in folders, switch environments, preview the outgoing request as raw HTTP or cURL, send it from the editor, and inspect the response body and headers without leaving your workspace.

## Math

Math is a calculator-style notebook for quick development math without leaving massCode. Use it for currency conversion, unit conversion, date math, finance, and natural-language calculations with instant results on every line.
Expand Down
17 changes: 10 additions & 7 deletions docs/website/documentation/notes/internal-links.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
---
title: Internal Links
description: "Link notes and snippets together inside massCode Notes with wiki-style links, hover previews, and back-forward navigation."
description: "Link notes, snippets, and HTTP requests together inside massCode Notes with wiki-style links, hover previews, and back-forward navigation."
---

# Internal Links

<AppVersion text=">=5.1.0" />
<AppVersion text=">=5.1" />

Internal Links let you connect notes and snippets with wiki-style links directly inside Notes. Use them to build lightweight documentation, link reference snippets from prose, and move through related material without leaving massCode.
Internal Links let you connect notes, snippets, and HTTP requests with wiki-style links directly inside Notes. Use them to build lightweight documentation, link reference snippets or saved API requests from prose, and move through related material without leaving massCode.

<img :src="withBase('/notes-internal-links.png')">

Expand All @@ -27,7 +27,7 @@ You can also provide custom visible text with an alias:
[[Fetch helper|request snippet]]
```

massCode resolves internal links by item name. A target can be either a note or a snippet.
massCode resolves internal links by item name. A target can be a note, a snippet, or an HTTP request.

If two notes share the same name, qualify the link with a folder path:

Expand All @@ -40,7 +40,7 @@ If two notes share the same name, qualify the link with a folder path:

Start typing `[[` in the Notes editor to open the internal links picker.

- The picker searches both notes and snippets.
- The picker searches notes, snippets, and HTTP requests.
- Results show the item name and its current location.
- Press <kbd>Enter</kbd> to insert the active result.
- Use the arrow keys to move through the list.
Expand All @@ -53,6 +53,7 @@ Hold <kbd>Cmd</kbd> on macOS or <kbd>Ctrl</kbd> on Windows or Linux, then click

- If the target is a note, massCode opens it in Notes.
- If the target is a snippet, massCode switches to Code and opens the snippet there.
- If the target is an HTTP request, massCode switches to HTTP and opens the request there.

Broken links stay visible, but they appear dimmed and struck through so you can spot missing targets.

Expand All @@ -62,6 +63,7 @@ Hover an internal link while holding <kbd>Cmd</kbd> on macOS or <kbd>Ctrl</kbd>

- Note links show a text excerpt.
- Snippet links show the first snippet fragment.
- HTTP request links show the method, URL, and description.

This helps you confirm the target before you navigate away from the current note.

Expand All @@ -78,9 +80,10 @@ The history is specific to internal-link navigation. If you manually select anot
## When to Use Internal Links

- Link architecture notes to implementation snippets
- Link API docs to saved HTTP requests
- Connect meeting notes to reference code
- Build personal knowledge-base pages that jump between notes and snippets
- Keep long-form docs in Notes while linking reusable code examples from Code
- Build personal knowledge-base pages that jump between notes, snippets, and requests
- Keep long-form docs in Notes while linking reusable code examples from Code and API checks from HTTP

<script setup>
import { withBase } from 'vitepress'
Expand Down
Binary file added docs/website/public/http-envs.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/website/public/http.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
20 changes: 13 additions & 7 deletions docs/website/scripts/align-arrows.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ let inBlock = false
let block = []

function flushBlock() {
if (block.length === 0) return
if (block.length === 0)
return
// Find lines with →
const arrowLines = block.filter(l => l.includes('→'))
if (arrowLines.length === 0) {
Expand All @@ -21,17 +22,19 @@ function flushBlock() {
for (const line of arrowLines) {
const idx = line.indexOf('→')
const left = line.substring(0, idx).trimEnd()
if (left.length > maxLeft) maxLeft = left.length
if (left.length > maxLeft)
maxLeft = left.length
}
const col = maxLeft + 4 // 4 spaces before →
for (const line of block) {
if (line.includes('→')) {
const idx = line.indexOf('→')
const left = line.substring(0, idx).trimEnd()
const right = line.substring(idx + 1).trimStart()
const padded = left.padEnd(col) + '→ ' + right
const padded = `${left.padEnd(col)}→ ${right}`
result.push(padded)
} else {
}
else {
result.push(line)
}
}
Expand All @@ -42,13 +45,16 @@ for (const line of lines) {
if (line.startsWith('```') && !inBlock) {
inBlock = true
result.push(line)
} else if (line.startsWith('```') && inBlock) {
}
else if (line.startsWith('```') && inBlock) {
flushBlock()
inBlock = false
result.push(line)
} else if (inBlock) {
}
else if (inBlock) {
block.push(line)
} else {
}
else {
result.push(line)
}
}
Expand Down
Loading