HexoBlog

hexo-theme-flux-palette — Hexo Blog Template

By LTDev-LLC

Flux Palette is a blog and journal theme for Hexo, offering multiple color palettes, password-encrypted posts, rich Markdown tags, a project portfolio, multi-backend search, and comment support.

Explore the design

Compare the page layouts and mobile experience. Open any screenshot for a closer look.

3 previews
Desktop homepage1 / 3
Desktop captureTop of page

Actual screenshot captured by the server browser.

All pages & views 3

Screenshots show visual appearance; interactive behavior may differ.

Recorded 2026-10-03View source

What stands out

A quick read of the recorded project description.

01

Over 15 built-in color palettes, plus a Flux customizer that generates palettes from a single color

02

Supports AES-256-GCM encrypted posts and encrypted images, with passwords removed at build time and decryption on the client

03

Extended Markdown tags: alerts, tabs, accordions, image galleries, timelines, media embeds, and social buttons

04

A standalone project portfolio system with weight sorting, project tags, summaries, and external buttons

05

Search supports three backends: local, Upstash (Redis), and Supabase (Postgres)

06

Comments support giscus and utterances, and OG/Twitter metadata and an RSS feed are generated automatically

Template Details

Flux Palette is a blog/journal theme developed by LTDev-LLC for Hexo, released under the MIT license. The theme is designed around multiple color schemes, content privacy, and rich text expression, with over 15 built-in color palettes and a Flux customizer that generates palettes from a single color.

At the content level, the theme extends Markdown tags to support alerts, tabs, accordions, image galleries, timelines, media embeds (YouTube, Spotify, Vimeo, Twitch, TikTok, GitHub Gist, JSFiddle, CodeSandbox), and social buttons. Posts can be password-protected via AES-256-GCM encryption; encryption is performed at build time, plaintext passwords do not appear in the output, decryption happens client-side in the browser, and encrypted images are supported.

The theme also provides a standalone project portfolio system independent of the blog. Project files are placed under source/_projects and support weight sorting, project tags, summaries, and external buttons. Search supports three backends: local, Upstash (Redis), and Supabase (Postgres). The local backend generates search.json at build time, while Upstash and Supabase require external accounts and configuration per the documentation. Comments support giscus and utterances. The theme uses swc to precompile Alpine.js and custom scripts, and automatically generates OG/Twitter metadata and an RSS feed.

Installation requires cloning the theme into themes/flux-palette, optionally installing @swc/core to enable precompilation, and then setting theme: flux-palette in the Hexo configuration. A demo site and screenshots are available for reference, but the licenses for third-party assets such as demo images, fonts, and icons must be verified separately.

HexoBlog

Is it right for your project?

Use Cases

  • Building a personal blog or journal site with multiple switchable color palettes
  • Publishing private posts or project content that requires password protection
  • Embedding external media such as videos, music, and code snippets in posts
  • Creating project portfolio pages independent of the blog
  • Configuring local or cloud search backends for a static blog

Suitable For

  • Developers or writers building blogs with Hexo
  • Content publishers who need password-protected posts and encrypted images
  • Those who want to enrich post layout with custom Markdown tags
  • Creators who need to showcase a project portfolio with external links

Getting started & customization

Use these recorded setup notes alongside the repository instructions for your chosen version.

  1. 1

    Clone the theme into themes/flux-palette and set theme: flux-palette in the Hexo configuration

  2. 2

    Optionally install @swc/core to enable precompilation of Alpine.js and custom scripts

  3. 3

    Password-protected posts can use the password field in front matter, or reference environment variables via env:

  4. 4

    The local search backend requires no additional configuration; Upstash and Supabase require registering accounts and filling in connection information per the documentation

  5. 5

    Comment functionality requires configuring the repository and category information for giscus or utterances in _config.yml

Read repository instructions

License & source material

Usage conditions & limitations

Free to use · keep license notice

This entry covers the free version under the MIT license in the public repository; the free scope applies to that version's code and does not imply that external services or third-party assets are free.

Must comply with when using

  • Free use, modification, commercial use, and distribution of this version's code are permitted.
  • When distributing copies or substantial portions of the code, retain the original author's copyright notice and the full MIT license notice.
  • The code is provided as is; warranties and limitations of liability are governed by the original license and applicable law.

Additional costs & items to verify

  • The README requests retaining the footer attribution (attribution.enabled: true, with the text Flux Palette by LTDev LLC). This is the author's request rather than a mandatory condition of the MIT license, but the attribution should be retained as a courtesy.
  • Precompiling Alpine.js and custom scripts requires additionally installing @swc/core; without it, this performance optimization cannot be used.
  • Once configured, the image gallery automatically calls external services such as wsrv.nl to generate thumbnails, which involves sending image URLs to third parties; privacy and availability should be assessed independently.
  • Using the Upstash search backend requires registering an Upstash account and configuring the REST URL and read/write tokens, which is an external service dependency.
  • Using the Supabase search backend requires registering a Supabase account, manually running SQL for table creation and RLS policies, and configuring the project URL and keys.
  • Enabling giscus or utterances comments requires providing required information such as a GitHub repository and category, depending on a GitHub account and a public repository.
  • Demo images, fonts, icons, and other third-party assets must be checked against their respective licenses; they cannot be judged solely by the code's MIT license.
  • External services such as domains, hosting, databases, payments, or AI may incur additional charges.
View Original Text Basis

Permission is hereby granted, free of charge

Original License Text

If you enjoy this theme, please keep the attribution in the footer enabled.

Original README

Optionally, install `@swc/core` for use with pre-compilation.

Original README

it automatically generates thumbnails using an external service (like wsrv.nl) for performance.

Original README

Requires an external account.

Original README

Requires running SQL setup commands manually as well as an external account.

Original README

repo: "username/repository" # [Required]

Original README
https://github.com/LTDev-LLC/hexo-theme-flux-palette/blob/main/LICENSEhttps://github.com/LTDev-LLC/hexo-theme-flux-palette/blob/main/README.md

Compiled by DeepSeek based on repository license and README ·2026-10-03. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.

Project checks & description sources

Template Information

Source platforms
GitHub
Documentation and maintenance reference score
More documented · 80 / 100
Technologies
Hexo
Website type
Blog
How this score is calculated

Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.

What to verify for this project

Repository update recorded
2026-03-08
Screenshot last checked
2026-10-03

A demo link is listed. Check it with your own content and viewport sizes; its presence does not confirm that forms, authentication or payments work.

The catalog identifies Hexo as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.

Use a selection guide →

How this description was prepared

AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.

Automatically checked against source and license rules; no manual editorial review.

Inspect the recorded source material

SHA-256: 2354464cbf95a22794aa406003930b2b7be7ac054bc6e2d1c4d316848dc8b5c0

2026-10-03T03:36:10.561Z

Source file / repository
# Flux Palette

A responsive, high-performance blog/journal [Hexo](https://hexo.io/) theme designed around the idea of multiple color palettes, privacy, and rich content features.

[DEMO](https://flux-palette.ltdev.llc/)

## Table of Contents
- [Features](#features)
- [Installation](#installation)
- [Global Configuration](#global-configuration)
- [Writing Content](#writing-content)
  - [Front Matter Options](#front-matter-options)
  - [Password Protection](#password-protection)
  - [Rich Content Tags](#rich-content-tags)
    - [Alerts / Admonitions](#alerts)
    - [Tabs](#tabs)
    - [Accordions](#accordions)
    - [Image Gallery](#image-gallery)
    - [Media Embeds](#media-embeds)
    - [Social Buttons](#social-buttons-tag)
    - [Timeline](#timeline)
- [Projects System](#projects-system)
- [Search Configuration](#search-configuration)
- [Comments](#comments)

## Features

- **Dynamic Theming**: 15+ built-in color palettes with a "Flux" customizer that allows users to generate palettes from a single color.
- **Rich Markdown**: Custom tags for Galleries, Tabs, Accordions, Alerts and more.
- **Privacy First**: AES-256-GCM encrypted posts (password protected) with full encrypted image support.
- **Projects Portfolio**: Dedicated section for projects with weighting and external buttons.
- **Search**: Supports Local (offline), Upstash (Redis), and Supabase (Postgres) search backends.
- **Performance**: Pre-compiles Alpine.js and custom scripts using [swc](https://swc.rs/) for optimized assets.
- **Social**: Auto-generated OG/Twitter metadata, RSS feeds, and social linking.

## Installation

1. In the `root` directory:
   * Optionally, install `@swc/core` for use with pre-compilation.

```bash
$ git clone --depth=1 https://github.com/LTDev-LLC/hexo-theme-flux-palette.git themes/flux-palette ; rm -rf !$/.git
$ npm install @swc/core --save
```

OR updating:

```bash
$ cp themes/flux-palette/_config.yml theme-config.yml ; rm -rf themes/flux-palette$ git clone --depth=1 https://github.com/LTDev-LLC/hexo-theme-flux-palette.git themes/flux-palette ; rm -rf !$/.git
$ mv theme-config.yml themes/flux-palette/_config.yml
```

2. Change the `theme` property in the `config.yml` file.

```yml
theme: flux-palette
```

3. Run: `hexo clean ; hexo g ; hexo s`

## Writing Content

### Front Matter Options

Standard Hexo front matter is supported, plus Flux-specific extensions:

```yml
---
title: My Awesome Post
date: 2025-10-24
tags: [hexo, theme]
categories: [Updates]

# Flux Specifics:
password: "super-secret-password" # Encrypts the post
cover: /images/banner.jpg         # Used for OpenGraph/Twitter cards
comments: false                   # Disable comments for this specific post
read_time_minutes: 5              # Override auto-calculated read time
---
```

### Password Protection

You can password-protect any post or project using `AES-256-GCM` encryption.

1. The content and images are encrypted at build time.
2. The plaintext password is **removed** from the build output.
3. A JSON payload is generated; the client decrypts it in the browser.

```yml
---
title: Secret Diary
password: my_password_123
# OR use an environment variable (recommended for public repos)
password: env:MY_SECRET_VAR
---
```

### Rich Content Tags

Flux Palette extends Markdown with several powerful tags implemented in `scripts/markdown-enhancements.js`.

#### Alerts

Create callout boxes for Info, Warning, Danger, Success, or Tips.

```markdown
{% alert info Information %}
This is a standard info box.
{% endalert %}

{% alert warning "Watch Out" %}
You can use quotes for titles with spaces.
{% endalert %}

{% alert tip %}
If no title is provided, it defaults to the type name.
{% endalert %}

```

*Supported types:* `info`, `warning`, `danger`, `success`, `tip`.

#### Tabs

Organize content into tabbed interfaces.

```markdown
{% tabs %}
    {% tab "First Tab" %}
    This is the content of the first tab.
    {% endtab %}

    {% tab Second %}
    Content for the second tab.
    {% endtab %}
{% endtabs %}

```

#### Accordions

Collapsible content sections.

```markdown
{% accordions %}
    {% accordion "Click to expand" %}
    Hidden content revealed upon clicking.
    {% endaccordion %}

    {% accordion "Another Item" %}
    More hidden content.
    {% endaccordion %}
{% endaccordions %}

```

#### Image Gallery

Creates a responsive grid of images. If configured in `_config.yml`, it automatically generates thumbnails using an external service (like wsrv.nl) for performance.

```markdown
{% gallery %}
![Image 1](/images/photo1.jpg)
![Image 2](/images/photo2.jpg)
![Image 3 with Caption](/images/photo3.jpg "My Caption")
{% endgallery %}
```

*Options:* You can pass `thumb:false` to disable thumbnails for a specific gallery: `{% gallery thumb:false %}`.

#### Timeline

Create vertical timelines for project history, biographies, or changelogs.

```markdown
{% timeline %}
    {% timeline_item "Jan 2024" "Inception" %}
    The initial concept for the project was defined.
    {% endtimeline_item %}

    {% timeline_item "Mar 2024" "Alpha Release" %}
    The first internal release was made available to the team.

    * Completed core engine
    * Added basic UI components
    {% endtimeline_item %}
{% endtimeline %}
```

### Media Embeds

You can embed content from platforms like YouTube, Spotify, Vimeo, Twitch, TikTok, GitHub Gist, JSFiddle, and CodeSandbox within your posts using a powerful `embed` tag.

The plugin can automatically detect the platform from a URL.

**Generic `embed` tag:**

The generic `embed` tag is the most flexible way to embed content.

```
{% embed <url/id> [platform_hint] [type_hint] %}
```

* `<url/id>`: The full URL or the ID of the content to embed.
* `[platform_hint]`: (Optional) If you use an ID instead of a URL, you must provide a platform hint. Supported platforms: `youtube`, `spotify`, `vimeo`, `twitch`, `tiktok`, `gist`, `jsfiddle`, `codesandbox`.
* `[type_hint]`: (Optional) For Spotify, you can specify `track`, `playlist`, `artist`, or `episode`. For Twitch, you can specify `video` or `channel`.
* `CodeSandbox note`: the embed forces `view=editor+%2B+preview` so editor + preview is always visible.

**Examples:**

```yml
---
title: My Awesome Post
date: 2025-12-1
---

{# YouTube from URL #}
{% embed https://www.youtube.com/watch?v=dQw4w9WgXcQ %}

{# YouTube from ID #}
{% embed dQw4w9WgXcQ youtube %}

{# Spotify track from URL #}
{% embed https://open.spotify.com/track/3cLqK3LPVrTIzfENVmYLoU %}

{# Spotify playlist from ID #}
{% embed 1LcfcxzGNcselP4PIGeQ6V spotify playlist %}

{# Vimeo from URL #}
{% embed https://vimeo.com/59859181 %}

{# Twitch channel from URL #}
{% embed https://www.twitch.tv/theburntpeanut %}

{# Twitch video from ID #}
{% embed 123456789 twitch video %}

{# TikTok from URL #}
{% embed https://www.tiktok.com/@scout2015/video/6718335390845095173 %}

{# Gist from URL #}
{% embed https://gist.github.com/paulirish/12fb951a8b893a454b32 %}

{# JSFiddle from ID + hint #}
{% embed 2v3L7m0q jsfiddle %}

{# CodeSandbox from URL #}
{% embed https://codesandbox.io/embed/new %}
```

You can also use direct provider tags:

```md
{% gist https://gist.github.com/paulirish/12fb951a8b893a454b32 %}
{% jsfiddle 2v3L7m0q %}
{% codesandbox https://codesandbox.io/embed/new %}
```

#### Social Buttons Tag

Display your social links anywhere in a post (uses the `social` config from `_config.yml`).

```yml
social:
  - name: GitHub
    url: https://github.com/LTDev-LLC/hexo-theme-flux-palette
    icon: mdi:github
  - name: Website
    url: https://flux-palette.ltdev.llc/
    icon: material-symbols:link
```

## Projects System

Flux Palette includes a dedicated portfolio system separate from the blog.

1. Create a folder: `source/_projects`.
2. Add Markdown files.
3. Use project-specific front matter.

**Example `source/_projects/my-app.md`:**

```yml
---
title: My Cool App
date: 2025-01-01
weight: 100            # Higher numbers appear first
project_tags: [swift, ios]
project_summary: "A short description shown on the index page."
buttons:
  - name: App Store
    url: [https://apple.com/](https://apple.com/)...
  - name: GitHub
    url: [https://github.com/](https://github.com/)...
---
Detailed project description goes here...
```

## Search Configuration

Flux Palette supports flexible search providers, allowing you to choose between a simple local index or powerful cloud databases. Configure your preferred provider in `_config.yml`.

**Supported Providers:** `local`, `upstash`, `supabase`

```yml
search:
  enabled: true
  title: "Search"
  service: "local" # Change to 'upstash' or 'supabase'
  # ... provider specific config below
```

#### 1. Local Search (Default)

Generates a `search.json` file at build time. Best for small static sites or when you want zero external dependencies.

* **Pros:** Zero setup, completely free, works offline once loaded, private.
* **Cons:** The entire index is downloaded by the client (can be heavy for large sites), basic "fuzzy" matching.

#### 2. Upstash (Redis)

Uses a serverless Redis database to store the index. This is the recommended option for performance and scalability.
[Sign up at Upstash](https://upstash.com/)

**Setup:**

1. Create a Redis database in the Upstash console.
2. Scroll down to the **REST API** section.
3. Copy the `UPSTASH_REDIS_REST_URL`.
4. Copy the `UPSTASH_REDIS_REST_TOKEN` (use this as your primary `token` for writing during builds).
5. Copy a Read-Only token to enable search support on the client side as `read_token`.

**Configuration:**

```yml
search:
  enabled: true
  title: "Search"
  service: upstash
  upstash:
    url: "https://your-db.upstash.io"
    token: "your_primary_token" # Used during 'hexo generate' to upload index
    read_token: "your_read_only_token" # Exposed to client for searching
    index: "flux" # Prefix for keys
```

* **Pros:** Extremely fast (millisecond latency), excellent fuzzy matching, generous free tier (10k req/day).
* **Cons:** Requires an external account.

#### 3. Supabase (PostgreSQL)

Uses a Postgres database to store and query the index.
[Sign up at Supabase](https://supabase.com/)

**Setup:**

1. Create a new project.
2. Go to the **SQL Editor** and run the following commands to create tables and enable public read access:
```sql
-- Create Tables
CREATE TABLE flux_search_docs (
  id text PRIMARY KEY,
  title text,
  url text,
  date text,
  type text,
  excerpt text,
  encrypted boolean
);
CREATE TABLE flux_search_index (
  word text PRIMARY KEY,
  doc_ids text[]
);

-- Enable RLS
ALTER TABLE flux_search_docs ENABLE ROW LEVEL SECURITY;
ALTER TABLE flux_search_index ENABLE ROW LEVEL SECURITY;

-- Allow public read access
CREATE POLICY "Public read docs" ON flux_search_docs FOR SELECT TO public USING (true);
CREATE POLICY "Public read index" ON flux_search_index FOR SELECT TO public USING (true);
```
3. Go to **Project Settings > Data API**.
4. Copy the **Project URL**.
4. Go to **Project Settings > API Keys**.
6. Copy the `Publishable Key` key (use as `pub_key` for reading).
5. Copy the `Secret Keys` key (use as `sec_key` for writing).

**Configuration:**

```yml
search:
  enabled: true
  title: "Search"
  service: supabase
  supabase:
    url: "https://your-project.supabase.co"
    sec_key: "your_service_role_key" # Used during 'hexo generate'
    pub_key: "your_anon_key" # Exposed to client
    table: "flux_search" # Prefix for tables (e.g. flux_search_docs)
```

* **Pros:** Robust relational database, highly scalable, reliable ecosystem.
* **Cons:** Requires running SQL setup commands manually as well as an external account.

## Comments

Supports privacy-focused comment systems.

```yml
comments:
  enabled: true
  service: giscus # Options: 'giscus', 'utterances'
  giscus:
    repo: "username/repository" # [Required]
    repo_id: "R_..." # [Required]
    category: "General" # [Required]
    category_id: "DIC_..." # [Required]
    mapping: "pathname"
    reactions_enabled: "1"
    emit_metadata: "0"
    input_position: "top"
    theme: "preferred_color_scheme"
    lang: "en"
  utterances:
    repo: "username/repository" # [Required]
    issue_term: "pathname"
    label: "comments"
    theme: "github-light"
```

## Attribution

If you enjoy this theme, please keep the attribution in the footer enabled.

```yml
attribution:
  enabled: true
  text: Flux Palette by LTDev LLC
  link: https://ltdev.llc/projects/flux-palette/
```

### Root _config.yml

To enable syntax highlighting, use the following in your project root `_config.yml`.

```yml
# Syntax highlighting
syntax_highlighter: highlight.js
highlight:
  enable: true # set to false to turn off syntax highlighting
  line_number: true
  auto_detect: false
  tab_replace: ''
  wrap: true
  hljs: false # required to be false for Flux Palette styles
```
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.