BlankPress — An Open-Source Lightweight WordPress Theme
System Sections

Introducing BlankPress
Building a Lightweight WordPress Foundation with BlankPress
BlankPress began as an attempt to create a free, lightweight WordPress theme foundation that could remain stable, maintainable, and adaptable over long periods. This website currently runs on BlankPress. You can install it too by looking at the Core Theme Files further on this page.
Version 1 took around fifteen iterations to complete, with continuous refinement focused on accessibility, best practices, SEO, and frontend simplicity. The project is heavily vibecoded and remains a work in progress, with updates and development notes documented throughout this page. So, technically, “free” still includes a trade of time and energy.
Elementor serves as the primary website builder for BlankPress. Every page is custom-built, with reusable systems and templates designed to simplify long-term maintenance and reduce unnecessary overhead. One tradeoff of a minimalist theme is that many elements still need to be built manually, including blog templates, search pages, archives, and other supporting layouts.
Additional details about the broader website structure, supporting workflows, security architecture, and operational systems are available throughout the Systems section of the site.
Why BlankPress Was Created
The project began after a theme I regularly relied on stopped receiving updates for more than a year and eventually became vulnerable through its stack.
Rather than continuing to build on increasingly layered systems, I created BlankPress as an experiment in simplifying the foundation itself. I will continue updating this page as the theme evolves, and I welcome discussion or feedback at the bottom of the page.
As a result, migrating an existing website to BlankPress can require significant work and is generally best handled before a website enters production.
Foundation Principles
The project focuses on:
- minimal structure
- reduced frontend overhead
- operational clarity
- maintainability
- long-term flexibility
- compatibility with modern WordPress workflows
Instead of functioning as a commercial theme product or marketplace framework, BlankPress remains a long-term operational foundation and documentation project. This documentation breaks down the files, decisions, structure, and operational reasoning behind the theme. Send me a message if you want to talk more about this project in any capacity.
Open-Source Documentation
Beyond the theme itself, this page documents the architecture, files, decisions, and development process behind the theme so others can study, modify, rebuild, or extend the system over time.
BlankPress is not intended to compete with commercial WordPress theme frameworks. The goal is to provide a lean, understandable foundation that can be modified, extended, and maintained over time.
Future Iterations of BlankPress
Looking ahead, BlankPress will continue evolving through real-world implementation, experimentation, refinement, and long-term testing. The goal is not rapid feature expansion, but the gradual refinement of a stable, adaptable, and maintainable WordPress foundation.
- V1 (Foundation) has remained stable for some time and continues to undergo refinement focused on frontend consistency, structure, and operational improvements.
- V2 (WooCommerce) is currently in development and focuses primarily on WooCommerce functionality and storefront integration.
- V3 (overall refinement) is planned around improving the overall frontend aesthetics and operational structure of WooCommerce-related pages.

Theme Architecture
BlankPress Minimalist Structure
BlankPress is built around a small collection of core theme files that handle WordPress rendering, template handling, and Elementor-based development. Instead of relying on large frameworks or extensive dependency chains, the theme focuses on keeping the architecture predictable and easy to maintain.
Lightweight WordPress Theme Structure
Several priorities influenced the overall structure of the theme, including:
- clean file organization
- minimal dependencies
- WordPress standards compatibility
- predictable rendering behavior
- compatibility with Elementor
As a result, the structure remains intentionally straightforward so developers can study, modify, rebuild, or extend the theme as the project evolves.

Core Theme Files
Rebuilding the BlankPress Theme Structure
The following files control the rendering behaviour, frontend structure, and WordPress compatibility of BlankPress.
To recreate the BlankPress theme structure:
- Create a local folder called
BlankPress. - Copy the code from each section of this documentation into the corresponding files using the listed file extensions (
.php,.css, etc.). - Compress the
BlankPressfolder into a.ziparchive and upload it through the WordPress theme installer.
As the project evolves, additional files, refinements, and documentation will be added throughout this page.
Note: Elementor Theme Builder can replace some templates depending on the final website configuration. However, the core PHP files remain part of the BlankPress fallback structure and allow WordPress to render content when no Elementor template is assigned.
functions.php — WordPress Theme Functionality and Core Systems
The functions.php file initializes many of the systems that allow BlankPress to operate within WordPress. While template files determine how content is displayed, functions.php manages much of the functionality behind theme features, integrations, and WordPress compatibility.
Within BlankPress, the file handles:
- theme support registration
- navigation registration
- cleanup functions
- performance optimizations
- WordPress feature support
- asset enqueueing
The structure remains intentionally streamlined to simplify maintenance and preserve compatibility with modern WordPress workflows and frontend builders such as Elementor.
Important: SVG uploads can introduce security risks if untrusted files are allowed into the media library. Within BlankPress, SVG uploads are restricted to administrators. For additional protection, SVG support should be paired with a trusted sanitization process or dedicated SVG security plugin.
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
/**
* Theme setup
*/
function bps_theme_setup() {
load_theme_textdomain('blankpress-secure', get_template_directory() . '/languages');
add_theme_support('title-tag');
add_theme_support('post-thumbnails');
add_theme_support('site-icon');
add_theme_support('html5', [
'search-form',
'comment-form',
'comment-list',
'gallery',
'caption',
'style',
'script'
]);
add_theme_support('custom-logo', [
'height' => 100,
'width' => 400,
'flex-height' => true,
'flex-width' => true,
]);
add_theme_support('align-wide');
// WooCommerce compatibility
add_theme_support('woocommerce');
register_nav_menus([
'primary' => __('Primary Menu', 'blankpress-secure'),
]);
}
add_action('after_setup_theme', 'bps_theme_setup');
/**
* Cleanup
*/
function bps_cleanup() {
remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');
remove_action('admin_print_scripts', 'print_emoji_detection_script');
remove_action('admin_print_styles', 'print_emoji_styles');
}
add_action('init', 'bps_cleanup');
/**
* Enqueue theme stylesheet
*/
function bps_enqueue() {
$path = get_stylesheet_directory() . '/style.css';
$ver = file_exists($path) ? filemtime($path) : wp_get_theme()->get('Version');
wp_enqueue_style(
'bps-style',
get_stylesheet_uri(),
[],
$ver
);
}
add_action('wp_enqueue_scripts', 'bps_enqueue');
/**
* Restrict SVG uploads to administrators only
* NOTE:
* SVG uploads can introduce security risk if unsafe SVG files are uploaded.
* This is intentionally restricted to administrators and should ideally be paired
* with a trusted SVG sanitization process or plugin.
*/
function bps_svg_uploads($mimes) {
if (current_user_can('administrator')) {
$mimes['svg'] = 'image/svg+xml';
}
return $mimes;
}
add_filter('upload_mimes', 'bps_svg_uploads');
/**
* Basic Organization schema for homepage
*/
function bps_schema() {
if (is_front_page()) {
$data = [
'@context' => 'https://schema.org',
'@type' => 'Organization',
'url' => esc_url(home_url('/')),
'name' => esc_html(get_bloginfo('name')),
];
echo '<script type="application/ld+json">' . wp_json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . '</script>';
}
}
add_action('wp_head', 'bps_schema');
style.css — Global Styling and Theme Structure
The style.css file contains the styling systems used throughout BlankPress and also stores the metadata required for WordPress theme registration. While individual page layouts may be built with Elementor, the stylesheet provides the global styling framework that helps maintain consistency across the website.
Within BlankPress, the file handles:
- theme metadata
- global variables
- foundational styling
- accessibility defaults
- media handling
- typography rendering
- reduced motion support
As a result, the stylesheet remains intentionally compact to reduce unnecessary frontend overhead while maintaining predictable rendering behaviour and long-term maintainability.
/*
Theme Name: BlankPress Secure v10
Description: Secure, minimal, future-ready WordPress theme
Version: 10
Text Domain: blankpress-secure
*/
/* =========================================================
ROOT SYSTEM
========================================================= */
:root {
--bps-accent: #602fbe;
--bps-radius: 14px;
--bps-transition: 0.25s ease;
}
/* Base reset */
html {
box-sizing: border-box;
scroll-behavior: smooth;
}
*, *::before, *::after {
box-sizing: inherit;
}
body {
margin: 0;
font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif;
line-height: 1.6;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* Media */
img,
svg {
display: block;
max-width: 100%;
height: auto;
}
iframe {
border: 0;
}
/* Links */
a {
color: inherit;
}
/* Focus accessibility */
a:focus-visible,
button:focus-visible,
input:focus-visible,
textarea:focus-visible,
select:focus-visible {
outline: 2px solid currentColor;
outline-offset: 2px;
}
/* Skip link accessibility */
.skip-link {
position: absolute;
left: -9999px;
top: 0;
}
.skip-link:focus {
left: 1rem;
top: 1rem;
background: #000;
color: #fff;
padding: 0.5rem 1rem;
z-index: 1000;
}
/* =========================================================
ACCESSIBILITY
========================================================= */
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
}
header.php — Document Structure and WordPress Initialization
The header.php file establishes the opening document structure for BlankPress and initializes the WordPress hooks required before page content renders.
Within BlankPress, the file handles:
- document type declaration
- language attributes
- character encoding
- responsive viewport setup
wp_head()integration- body class output
wp_body_open()support- accessibility skip link
This file remains intentionally minimal so Elementor and page templates can control layout structure without unnecessary theme markup. As a result, you will need to create your own header using Elementor Theme Builder or a similar template system.
Note: Elementor Theme Builder can control the frontend header layout, while header.php continues handling document structure, WordPress hooks, and accessibility initialization.
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta charset="<?php bloginfo( 'charset' ); ?>">
<meta name="viewport" content="width=device-width, initial-scale=1">
<?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<?php wp_body_open(); ?>
<a class="skip-link" href="#main">Skip to content</a>footer.php — WordPress Footer Hooks and Document Closure
The footer.php file handles the closing structure of the website and ensures WordPress footer hooks execute correctly before the document is closed.
Within BlankPress, the file handles:
wp_footer()integration- footer script execution
- plugin hook compatibility
- document closure
The structure remains intentionally minimal so Elementor and page templates can control layout and rendering. As a result, you will need to create your own footer using Elementor Theme Builder or a similar template system.
Note: Elementor Theme Builder can control the frontend footer layout, while footer.php continues handling WordPress footer hooks, script execution, and document closure.
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
<?php wp_footer(); ?>
</body>
</html>index.php — Core WordPress Fallback Template
The index.php file acts as the primary fallback template within BlankPress and provides a minimal rendering structure when more specific WordPress template files are unavailable. As the final fallback within the WordPress template hierarchy, index.php helps ensure content can still be rendered correctly when dedicated templates are not present.
Within BlankPress, the file handles:
- fallback content rendering
- WordPress loop integration
- main content structure
- accessibility main landmark support
- header and footer integration
The structure remains intentionally minimal so Elementor and more specialized template files can control presentation without unnecessary theme complexity.
<?php get_header(); ?>
<main id="main" class="site-main">
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php the_content(); ?>
<?php endwhile; ?>
<?php else : ?>
<p><?php esc_html_e( 'No content found.', 'blankpress-secure' ); ?></p>
<?php endif; ?>
</main>
<?php get_footer(); ?>page.php — Standard WordPress Page Rendering
The page.php file controls the default rendering behaviour for WordPress pages throughout BlankPress and acts as the primary structural wrapper for Elementor page content.
Within BlankPress, the file handles:
- header integration
- main content structure
- WordPress loop rendering
- accessibility main landmark support
- page content output
- footer integration
The structure remains intentionally minimal so Elementor can control frontend layout and presentation without unnecessary theme interference. BlankPress retains page.php as a core fallback when no Elementor template is assigned.
Note: BlankPress intentionally leaves default WordPress comments minimally styled. Implement additional frontend styling and moderation systems before enabling comments on production-facing pages.
<?php get_header(); ?>
<main id="main" class="site-main">
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php the_content(); ?>
<?php
if ( comments_open() || get_comments_number() ) {
comments_template();
}
?>
<?php endwhile; ?>
<?php else : ?>
<p><?php esc_html_e( 'No content found.', 'blankpress-secure' ); ?></p>
<?php endif; ?>
</main>
<?php get_footer(); ?>single.php — WordPress Post and Long-Form Content Rendering
The single.php file controls the rendering behavior for individual WordPress posts throughout BlankPress, including long-form documentation, operational notes, system writeups, and supporting content published across the project.
Within BlankPress, the file handles:
- single post rendering
- WordPress loop integration
- main content structure
- accessibility main landmark support
- post content output
- header and footer integration
The structure remains intentionally minimal so Elementor can control frontend layout and presentation without unnecessary theme interference. BlankPress retains single.php as a lightweight fallback when no Elementor template is assigned.
Note: BlankPress intentionally leaves default WordPress comments minimally styled. Implement additional frontend styling and moderation systems before enabling comments on production-facing posts.
<?php get_header(); ?>
<main id="main" class="site-main">
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php the_content(); ?>
<?php
if ( comments_open() || get_comments_number() ) {
comments_template();
}
?>
<?php endwhile; ?>
<?php else : ?>
<p><?php esc_html_e( 'No content found.', 'blankpress-secure' ); ?></p>
<?php endif; ?>
</main>
<?php get_footer(); ?>archive.php — WordPress Archive Page Rendering
The archive.php file controls the rendering behaviour for WordPress archive pages throughout BlankPress, including category, tag, date, and other grouped content views.
Within BlankPress, the file handles:
- archive title output
- archive description output
- archive result rendering
- post excerpt display
- pagination integration
- no-content fallback messaging
- header and footer integration
The structure remains intentionally simple so archive pages stay readable, accessible, and consistent with the broader BlankPress content system. BlankPress retains archive.php as a lightweight fallback when no Elementor archive template is assigned.
Note: Archive pages often play an important role in content discovery and internal linking. As the website evolves, you can implement additional styling, filtering, and layout systems through Elementor Theme Builder.
<?php get_header(); ?>
<main id="main" class="site-main">
<header>
<h1><?php the_archive_title(); ?></h1>
<?php the_archive_description( '<p>', '</p>' ); ?>
</header>
<section class="archive-results">
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<article <?php post_class(); ?>>
<h2>
<a href="<?php echo esc_url( get_permalink() ); ?>">
<?php the_title(); ?>
</a>
</h2>
<?php the_excerpt(); ?>
</article>
<?php endwhile; ?>
<?php
the_posts_pagination([
'mid_size' => 2,
'prev_text' => esc_html__( '← Previous', 'blankpress-secure' ),
'next_text' => esc_html__( 'Next →', 'blankpress-secure' ),
]);
?>
<?php else : ?>
<p><?php esc_html_e( 'No content found.', 'blankpress-secure' ); ?></p>
<?php endif; ?>
</section>
</main>
<?php get_footer(); ?>search.php — WordPress Search Results Rendering
The search.php file controls the rendering behaviour for WordPress search results throughout BlankPress and provides the structural layout for search queries, excerpts, pagination, and fallback messaging.
Within BlankPress, the file handles:
- search query output
- search result rendering
- post excerpt display
- pagination integration
- accessible search result updates
- no-result fallback messaging
- header and footer integration
The structure remains intentionally lean so search functionality stays readable, accessible, and consistent with the broader BlankPress frontend architecture. BlankPress retains search.php as a lightweight fallback when no Elementor search template is assigned.
Note: Search pages often help visitors discover content that may not be accessible through navigation menus alone. As the website evolves, you can implement additional styling, filtering, and custom search layouts through Elementor Theme Builder.
<?php get_header(); ?>
<main id="main" class="site-main">
<header>
<h1><?php printf( esc_html__( 'Search Results for: %s', 'blankpress-secure' ), esc_html( get_search_query() ) ); ?></h1>
</header>
<section class="search-results" aria-live="polite">
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<article <?php post_class(); ?>>
<h2>
<a href="<?php echo esc_url( get_permalink() ); ?>">
<?php the_title(); ?>
</a>
</h2>
<?php the_excerpt(); ?>
</article>
<?php endwhile; ?>
<?php
the_posts_pagination([
'mid_size' => 2,
'prev_text' => esc_html__( '← Previous', 'blankpress-secure' ),
'next_text' => esc_html__( 'Next →', 'blankpress-secure' ),
]);
?>
<?php else : ?>
<p><?php printf( esc_html__( 'No results found for "%s".', 'blankpress-secure' ), esc_html( get_search_query() ) ); ?></p>
<?php endif; ?>
</section>
</main>
<?php get_footer(); ?>404.php — WordPress Error Page Rendering
The 404.php file controls the rendering behaviour for missing or invalid pages throughout BlankPress and provides a simplified fallback structure when requested content cannot be located.
Within BlankPress, the file handles:
- 404 error rendering
- fallback messaging
- accessibility main landmark support
- header and footer integration
The structure remains intentionally minimal so error pages stay readable, maintainable, and consistent with the broader BlankPress frontend architecture. BlankPress retains 404.php as a lightweight fallback when no Elementor 404 template is assigned.
Note: A well-designed 404 page can help visitors recover from broken links, outdated URLs, and navigation errors. As the website evolves, you can implement additional layouts, search functionality, and recovery pathways through Elementor Theme Builder.
<?php get_header(); ?>
<main id="main" class="site-main">
<section class="error-404 not-found">
<header>
<h1><?php esc_html_e( 'Page Not Found', 'blankpress-secure' ); ?></h1>
</header>
<p>
<?php esc_html_e( 'Sorry, the page you are looking for could not be found.', 'blankpress-secure' ); ?>
</p>
</section>
</main>
<?php get_footer(); ?>screenshot.png — BlankPress Theme Image
The screenshot.png file handles the theme preview image displayed within the WordPress dashboard under Appearance → Themes.
You can use any image for this file as long as it is named:
- screenshot.png
The image should be placed in the root directory of the theme alongside files such as:
- style.css
- functions.php
- index.php
Within BlankPress, the image serves as a visual reference for the active theme inside the WordPress admin dashboard. It is not loaded on the frontend and does not affect website performance.
readme.txt — Theme Documentation
The readme.txt file stores important information about the theme, including version details, development notes, licensing information, and update history.
While this page documents BlankPress in detail, a simple readme file helps preserve key project information directly within the theme.

Performance Decisions
BlankPress Performance Through Simplicity
BlankPress prioritizes frontend simplicity and reduced overhead.
Over time, many WordPress websites accumulate additional layers of complexity through plugins, theme frameworks, visual builders, third-party integrations, and frontend assets. While each addition may solve a specific problem, the combined result can increase maintenance requirements, frontend bloat, and rendering complexity.
Rather than treating performance as a problem to solve later with optimization plugins, BlankPress approaches performance as part of the architecture from the beginning. The goal is not to create the fastest possible theme at all costs, but to maintain a lightweight and understandable structure that remains practical to build upon over time.

Security Structure
WordPress Security Architecture and Hardening
BlankPress uses a minimal attack surface mindset focused on operational simplicity, clean WordPress standards, and long-term maintainability.
Instead of relying on a single plugin or isolated configuration, BlankPress approaches security as part of a broader operational system. You can find additional details on the dedicated Security page.

Concluding Thoughts
Building a Simpler WordPress Foundation with BlankPress
BlankPress is ultimately an experiment in building a simpler foundation for WordPress.
Rather than prioritizing excessive features, layered abstractions, marketing systems, or unnecessary complexity, the project focuses on clarity, performance, and long-term refinement.
This documentation exists to share the systems, files, architectural decisions, and lessons learned throughout the development of the theme.
Project Disclaimer
Experimental WordPress Project Disclaimer
BlankPress is an evolving open-source project and learning environment.
The systems, configurations, code examples, performance decisions, and security approaches documented throughout this page are shared for educational and reference purposes only.
While I make every effort to maintain clean standards and stable architecture, the project remains under active development and should be reviewed, tested, and adapted before production use.
BlankPress does not guarantee compatibility, security, performance, or long-term stability across all hosting environments, WordPress installations, or third-party plugin ecosystems.
Share This Article
Lasting Systems.
