InterSacks Resource Hub

Useful assets.
Ready to build.

Brand foundations, practical browser tools, project checklists, and small Python automations for developers, collaborators, and growing businesses.

DevelopersCollaboratorsClients

Brand foundations

Consistency starts with
clear decisions.

Reference the current InterSacks palette and typography when preparing approved brand work.

Primary

InterSacks Navy

#081423
Surface

Deep Navy

#0E1E31
Accent

InterSacks Gold

#C8A15A
Canvas

Warm Cream

#F8F8F6
Text

Ink

#14202D
TYPE / EDITORIAL ACCENT

Playfair Display

Used selectively for expressive emphasis and premium editorial contrast.

Open official font source
CSS / DESIGN TOKENS
:root {
  --navy: #081423;
  --navy-2: #0e1e31;
  --gold: #c8a15a;
  --cream: #f8f8f6;
  --ink: #14202d;
  --font: 'Manrope', Arial, sans-serif;
  --serif: 'Playfair Display', Georgia, serif;
}

Browser tools

Open, use,
get the job done.

Useful InterSacks tools that work directly in the browser and require no installation.

01BUSINESS DOCUMENT

Invoice Generator

Create a polished invoice, calculate totals, and export a client-ready document.

Open tool
02BUSINESS DOCUMENT

Quote Generator

Prepare a clear project quote with structured items, pricing, and client details.

Open tool
03OPERATIONS

Job Card Generator

Capture work completed, customer details, materials, and sign-off in one place.

Open tool
04SALES

WhatsApp Order Builder

Turn selected items into a structured WhatsApp order without needing a backend.

Open tool

Python automations

Small scripts.
Practical leverage.

Short, inspectable starter scripts with clear inputs, safe defaults, and downloadable source files.

PYTHON / STANDARD LIBRARY

Static-site scaffolder

Create a clean HTML, CSS, JavaScript, images, and assets folder structure without overwriting an existing project.

Download .py
View code
from argparse import ArgumentParser
from pathlib import Path
import re


def safe_name(value: str) -> str:
    name = re.sub(r"[^a-z0-9]+", "-", value.lower()).strip("-")
    if not name:
        raise ValueError("Project name must contain a letter or number.")
    return name


def build_project(project_name: str, destination: Path) -> Path:
    root = destination / safe_name(project_name)
    if root.exists() and any(root.iterdir()):
        raise FileExistsError(f"Refusing to overwrite non-empty folder: {root}")

    for folder in ("css", "js", "images", "assets"):
        (root / folder).mkdir(parents=True, exist_ok=True)

    starter_files = {
        "index.html": (
            "<!doctype html>\n"
            "<html lang=\"en\">\n"
            "<head>\n"
            "  <meta charset=\"utf-8\">\n"
            "  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n"
            "  <title>New project</title>\n"
            "  <link rel=\"stylesheet\" href=\"css/styles.css\">\n"
            "  <script src=\"js/script.js\" defer></script>\n"
            "</head>\n"
            "<body>\n"
            "  <main><h1>Ready to build</h1></main>\n"
            "</body>\n"
            "</html>\n"
        ),
        "css/styles.css": "* { box-sizing: border-box; }\nbody { margin: 0; font-family: sans-serif; }\n",
        "js/script.js": "console.log('Project ready');\n",
    }
    for relative_path, content in starter_files.items():
        path = root / relative_path
        if not path.exists():
            path.write_text(content, encoding="utf-8")
    return root


if __name__ == "__main__":
    parser = ArgumentParser(description="Create a safe static-site starter.")
    parser.add_argument("name", help="Project name")
    parser.add_argument("--destination", type=Path, default=Path.cwd())
    args = parser.parse_args()
    print(f"Created: {build_project(args.name, args.destination).resolve()}")
PYTHON / STANDARD LIBRARY

Static sitemap generator

Scan a static website for HTML pages and create a valid sitemap.xml for search engines.

Download .py
View code
from argparse import ArgumentParser
from datetime import date
from pathlib import Path
from urllib.parse import quote
from xml.sax.saxutils import escape


def page_url(path: Path, root: Path, base_url: str) -> str:
    relative = path.relative_to(root).as_posix()
    route = relative[:-10] if relative.endswith("index.html") else relative
    return f"{base_url.rstrip('/')}/{quote(route, safe='/')}"


def build_sitemap(root: Path, base_url: str) -> str:
    pages = sorted(p for p in root.rglob("*.html") if "404" not in p.stem)
    today = date.today().isoformat()
    entries = [
        f"  <url><loc>{escape(page_url(page, root, base_url))}</loc><lastmod>{today}</lastmod></url>"
        for page in pages
    ]
    return "\n".join([
        '<?xml version="1.0" encoding="UTF-8"?>',
        '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',
        *entries,
        "</urlset>",
        "",
    ])


if __name__ == "__main__":
    parser = ArgumentParser(description="Generate sitemap.xml for a static site.")
    parser.add_argument("base_url", help="Example: https://example.com")
    parser.add_argument("--root", type=Path, default=Path.cwd())
    args = parser.parse_args()
    output = args.root / "sitemap.xml"
    output.write_text(build_sitemap(args.root, args.base_url), encoding="utf-8")
    print(f"Created {output.resolve()}")
PYTHON / PILLOW

Batch image-to-WebP converter

Convert common website images into a separate WebP folder while keeping every original file untouched.

pip install Pillow

Download .py
View code
from argparse import ArgumentParser
from pathlib import Path
from PIL import Image

SUPPORTED = {".jpg", ".jpeg", ".png"}


def convert_images(source: Path, quality: int, overwrite: bool) -> tuple[int, int]:
    output = source / "webp"
    output.mkdir(exist_ok=True)
    converted = skipped = 0

    for path in sorted(source.iterdir()):
        if not path.is_file() or path.suffix.lower() not in SUPPORTED:
            continue
        target = output / f"{path.stem}.webp"
        if target.exists() and not overwrite:
            skipped += 1
            continue
        with Image.open(path) as image:
            if image.mode not in {"RGB", "RGBA"}:
                image = image.convert("RGBA" if "transparency" in image.info else "RGB")
            image.save(target, "WEBP", quality=quality, method=6)
        converted += 1
    return converted, skipped


if __name__ == "__main__":
    parser = ArgumentParser(description="Convert JPG and PNG images to WebP.")
    parser.add_argument("folder", type=Path)
    parser.add_argument("--quality", type=int, choices=range(1, 101), default=82)
    parser.add_argument("--overwrite", action="store_true")
    args = parser.parse_args()
    done, skipped = convert_images(args.folder, args.quality, args.overwrite)
    print(f"Converted: {done} | Skipped: {skipped}")

Project starters

Arrive prepared.
Build with clarity.

Simple planning resources for clients and collaborators before design or development begins.

MARKDOWN TEMPLATE

Website project brief

Define the business goal, audience, pages, required features, content ownership, and success measure.

Download template
MARKDOWN CHECKLIST

Website content checklist

Collect the copy, images, contact details, policies, and account access a website project needs.

Download checklist
INTERSACKS SUPPORT

Need a capable build partner?

Bring the brief. InterSacks can help turn it into a clear website, practical automation, or custom business tool.

Start a project

Build something useful

Found the starting point?
Let us finish the system.

Tell us what you are building and where the process is slowing you down.

Start a project