A modern internal operations tools platform built with HTML, Tailwind CSS, HTMX, and Django backend for progressive enhancement.
This project has two deployment options:
-
Django Backend (Recommended) - Full functionality with database
- Location:
backend/directory - Features: Dynamic data, HTMX partials, admin panel
- See
backend/README.mdfor setup
- Location:
-
Static Frontend (Demo) - Landing page only
- Location: Root
index.html - Features: Marketing/landing page
- Note: HTMX partials require Django backend
- Location: Root
Important: All HTML templates are in backend/templates/ (single source of truth). The root index.html is for static demo purposes only.
- Modern UI: Clean, professional design with Tailwind CSS
- Progressive Enhancement: HTMX for dynamic content loading without full page reloads
- Responsive Design: Mobile-first approach that works on all devices
- Static Site: No build process required - pure HTML, CSS, and JavaScript
- GitHub Pages Ready: Optimized for static hosting
- HTML5: Semantic markup
- Tailwind CSS: Utility-first CSS framework (via CDN)
- HTMX 1.9.12: Lightweight library for dynamic HTML interactions
- Inter Font: Premium typography from Google Fonts
- Vanilla JavaScript: Minimal JavaScript for enhanced interactivity
This project uses HTMX for progressive enhancement, allowing dynamic content loading without JavaScript frameworks. Here's how it works:
HTMX enables seamless content swapping by using HTML attributes instead of JavaScript. The main patterns used in this project are:
Loads HTML partials from the server and injects them into the DOM:
<button
hx-get="partials/tool-user-admin.html"
hx-target="#tool-dialog-content"
hx-swap="innerHTML">
Open
</button>Specifies where the loaded content should be inserted:
<div id="tool-dialog-content">
<!-- HTMX will inject content here -->
</div>Controls how the new content replaces existing content:
innerHTML: Replaces the inner HTML of the target elementouterHTML: Replaces the entire target elementbeforebegin: Inserts before the target elementafterend: Inserts after the target element
- Tool Navigation: Clicking tool cards loads detailed views via HTMX
- Activity Feed: Recent activity items can load tool details dynamically
- Filter Buttons: Category filters load filtered tool lists
- Modal/Dialog Content: Tool details load into dialog containers
<!-- In partials/activity.html -->
<button
class="text-xs text-brand-700 hover:text-brand-800"
hx-get="partials/tool-user-admin.html"
hx-target="#tool-dialog-content"
hx-swap="innerHTML">
View
</button>
<!-- In partials/tools.html -->
<button
hx-get="partials/tool-feature-flags.html"
hx-target="#tool-dialog-content"
hx-swap="innerHTML">
Open
</button>- No Build Process: Works directly with static HTML
- Progressive Enhancement: Falls back gracefully if JavaScript is disabled
- Lightweight: Much smaller than full JavaScript frameworks
- Server-Friendly: Works great with static file servers
- SEO Friendly: Content is HTML, not dynamically rendered
- Simple: Uses HTML attributes instead of complex JavaScript
-
Clone the repository:
git clone https://github.com/Justin322322/opsforge.git cd opsforge -
Serve locally (choose one method):
Option A: Python HTTP Server
# Python 3 python -m http.server 8000 # Python 2 python -m SimpleHTTPServer 8000
Option B: Node.js HTTP Server
npx http-server -p 8000
Option C: VS Code Live Server
- Install the "Live Server" extension
- Right-click
index.htmland select "Open with Live Server"
-
Open in browser:
http://localhost:8000
The project is already configured for GitHub Pages:
-
Enable GitHub Pages:
- Go to repository Settings → Pages
- Select source:
masterbranch - Select folder:
/ (root) - Click Save
-
Access your site:
https://justin322322.github.io/opsforge/ -
Auto-deployment:
- Any push to
masterautomatically deploys - Changes appear within 1-2 minutes
- Any push to
- Main Page: Edit
backend/templates/index.html(Django) or rootindex.html(static) - Tool Views: Edit files in
backend/templates/partials/directory - Styling: Modify Tailwind classes or add custom CSS in
<style>tags - Assets: Replace files in
assets/directory
Tailwind is configured with custom brand colors. To modify:
// In index.html <head>
tailwind.config = {
theme: {
extend: {
colors: {
brand: {
// Customize your brand colors
600: '#2563eb', // Primary brand color
// ... other shades
}
}
}
}
}- Create a new HTML partial in
backend/templates/partials/ - Add a view in
backend/opsforge_app/views.pyto serve the partial - Add URL routing in
backend/opsforge_app/urls.py - Add HTMX attributes to trigger buttons/links:
<button hx-get="{% url 'opsforge_app:your_view' %}" hx-target="#target-element" hx-swap="innerHTML"> Load Content </button>
- Ensure the target element exists in your HTML
- Chrome (latest)
- Firefox (latest)
- Safari (latest)
- Edge (latest)
- Mobile browsers (iOS Safari, Chrome Mobile)
This project is open source and available for use.
- HTMX - For progressive enhancement
- Tailwind CSS - For utility-first styling
- Inter Font - For beautiful typography
For issues, questions, or contributions, please open an issue on the GitHub repository.
Built with HTMX and Tailwind CSS