Abzweig is a fork of Forgejo. Cream and Ink theme, templates, fonts, textures, and deployment files. https://git.derkdev.nl/
  • CSS 40.5%
  • Go Template 28.7%
  • JavaScript 18.2%
  • Python 6.6%
  • HTML 3.3%
  • Other 2.7%
Find a file
2026-10-21 21:00:34 +02:00
background Add a subtle ASCII sculpture behind the Cream and Ink UI 2026-10-21 18:41:28 +02:00
reference Save the current DerkDev Git dashboard theme 2026-10-21 18:34:06 +02:00
templates Move dashboard source links and publishing to derk 2026-10-21 21:00:34 +02:00
tests Add native Google signup with a styled popup and safe account linking 2026-10-21 20:45:21 +02:00
tools Add a subtle ASCII sculpture behind the Cream and Ink UI 2026-10-21 18:41:28 +02:00
vendor/cream-ink-ui Save the current DerkDev Git dashboard theme 2026-10-21 18:34:06 +02:00
.gitattributes Add a subtle ASCII sculpture behind the Cream and Ink UI 2026-10-21 18:41:28 +02:00
.gitignore Move dashboard source links and publishing to derk 2026-10-21 21:00:34 +02:00
abzweig-auth.js Add native Google signup with a styled popup and safe account linking 2026-10-21 20:45:21 +02:00
assets.sha256.json Save the current DerkDev Git dashboard theme 2026-10-21 18:34:06 +02:00
cream-ink-ascii.js Add a subtle ASCII sculpture behind the Cream and Ink UI 2026-10-21 18:41:28 +02:00
forgejo-cream-ink.js Style the native Forgejo guest homepage and prepare the public source repository 2026-10-21 19:55:17 +02:00
install-theme.sh Rename the site and public interface to Abzweig 2026-10-21 20:22:12 +02:00
package.py Keep header dropdowns above their following content panels 2026-10-21 20:52:58 +02:00
privacy.html Add native Google signup with a styled popup and safe account linking 2026-10-21 20:45:21 +02:00
README.md Move dashboard source links and publishing to derk 2026-10-21 21:00:34 +02:00
remove-help.py Add native icons to the primary navigation links 2026-10-21 19:35:01 +02:00
theme-cream-ink.css Keep header dropdowns above their following content panels 2026-10-21 20:52:58 +02:00

Abzweig — fork of Forgejo

Live site: https://git.derkdev.nl

Abzweig is a fork of Forgejo, packaged as a Cream and Ink theme and template overlay for Forgejo 15.0.10. This repository contains the custom interface and deployment files. Git hosting, accounts, issues, pull requests, and other backend features come from upstream Forgejo.

Upstream project and source: https://codeberg.org/forgejo/forgejo

The guest homepage and sign-in page say "Abzweig is a fork of Forgejo." Homepage feature cards use Abzweig branding and link only to this site. Original font notices and artwork credits are retained.

Public source repository: https://git.derkdev.nl/derk/git-dashboard

git clone git@git.derkdev.nl:derk/git-dashboard.git
cd git-dashboard
python package.py

Packaging uses only files in this repository and the Python standard library. The output is cream-ink-forgejo.tar.gz. The asset checksum manifest preserves the five original fonts and texture masks. Font notices are included under vendor/cream-ink-ui/licenses/; Forgejo's upstream navbar baseline is saved under reference/ so our small template override can be compared on upgrades.

Source: Derk's supplied cream-ink-ui-style-20261020 export, integrated using the Cream and Ink skill. The two font files and three texture masks were checked against the supplied export with SHA-256 before packaging.

Files and deployment

  • theme-cream-ink.css: Forgejo palette, component surfaces, dashboard, repository, issue/PR, settings, responsive sign-in, and native overflow navigation.
  • forgejo-cream-ink.js: decoration and press effects for native components.
  • cream-ink-ascii.js: decorative ASCII sculpture, projected onto a small canvas.
  • abzweig-auth.js: popup presentation for native OAuth links, with normal navigation fallback. Forgejo owns token validation, accounts, and sessions.
  • privacy.html: public explanation of the current sign-in data handling.
  • background/: compact surface points and original artwork provenance.
  • templates/custom/footer.tmpl: loads the helper only for this theme.
  • templates/custom/header.tmpl: loads the current version of the theme, including for browsers that cached the first theme stylesheet.
  • templates/base/footer_content.tmpl: keeps only the original language picker, floating in the bottom-right corner; removes the footer bar and other links.
  • templates/base/head_navbar.tmpl: native navbar with the anonymous and profile menu Help links removed and matching Octicons before Issues, Pull requests, Milestones, and Explore. remove-help.py rebuilds it from the saved upstream template; compare it with the new embedded navbar before a Forgejo upgrade.
  • templates/user/auth/signin.tmpl: sign-in layout; uses the original user/auth/signin_inner template for the entire form.
  • templates/home.tmpl: guest homepage with themed Explore and Sign in links.
  • templates/home_abzweig.tmpl: Abzweig feature cards, using the native grid and icons with local source links.
  • vendor/cream-ink-ui: original runtime, masks, fonts, tokens, and font licenses.
  • assets.sha256.json: checksums of the original fonts and texture masks.
  • package.py: verifies the original assets and builds the deployment archive.
  • install-theme.sh: backs up, installs, restarts, checks, and rolls back on failure.

Server destinations:

/srv/forgejo/custom/public/assets/css/theme-cream-ink.css
/srv/forgejo/custom/public/assets/cream-ink/
/srv/forgejo/custom/templates/custom/footer.tmpl
/srv/forgejo/custom/templates/user/auth/signin.tmpl

The instance name is APP_NAME = Abzweig. The [ui] section in /etc/forgejo/app.ini sets DEFAULT_THEME = cream-ink. The original Forgejo Auto, Light, and Dark themes remain selectable. All custom styling is loaded by the Cream and Ink theme; other themes use the stock login layout. A user's existing theme preference can override the site default; choose Cream and Ink in account settings to use this skin after signing in.

No extra server process or external font service is used. Repository markup, source code, diff syntax colors, and monospace fonts keep Forgejo's behavior. There is no custom authentication backend, token validator, or repository action handler. The optional popup helper presents Forgejo's native OAuth flow.

Update and rollback

Edit the source, run node --check forgejo-cream-ink.js, then python package.py. Copy the resulting archive and installer to /tmp/ on the server and run the installer as root. This installer targets the existing Abzweig layout and requires /usr/local/sbin/forgejo-backup; it is not a fresh Forgejo installer. Publishing a commit does not automatically deploy it to the live website.

For JavaScript changes, increment its ?v= in the footer template. For CSS changes, increment the matching cache versions in package.py and templates/custom/header.tmpl. Check the changed pages after installation.

Before any Forgejo upgrade, compare the custom sign-in wrapper with the new upstream templates/user/auth/signin.tmpl, and check component selectors. The base light stylesheet also needs to match the installed Forgejo version.

The installer reports a protected rollback checkpoint containing the prior configuration and custom template/assets archive. To roll back, stop Forgejo, preserve the current custom directory under another name, restore that checkpoint, and start Forgejo. Production configuration and backup contents are not part of this repository.

Verification

  • Local desktop and 390px-wide phone preview inspected visually.
  • Native primary, neutral, warning, danger, and disabled buttons checked.
  • Selected/inactive tabs, panels, messages, and dialog checked in local fixtures.
  • Dialog focus and Escape dismissal checked; reduced-motion CSS is included.
  • Live HTTPS sign-in page inspected after deployment.
  • All eight custom asset endpoints returned HTTP 200.
  • Live font loading, mint/ink button colors, and lack of horizontal overflow checked.
  • Live empty-form validation focused the required username without submitting.
  • Forgejo and Caddy active; no new Forgejo error log entries.

The second pass was checked against real signed-in pages using a disposable, non-administrator account and private sample repository: dashboard, repository, issue, pull request conversation, file diff, and repository settings. Navigation tabs, active states, settings rails, comment headers, and code fonts were checked directly. The test account, repo, issue, PR, and API token were removed afterward. Admin-only pages inherit the shared styles but were not browsed with an admin account. Browser font antialiasing and blur can differ slightly from the original Roblox renderer.

The menu refinement uses cream rows and mint selection for secondary navigation, with dark badges for counts. Dark fills remain for the main navigation and major section labels. The viewport-wide dotted background is a fixed, non-interactive body layer. Navbar stacking is explicit so its native profile/create menus render above page content. Both dropdowns were opened and visually checked, and the native language picker was tested by switching to Dutch and back to English.

The input/sidebar cleanup removes the outer focus ring from text entry while keeping a neutral field border. Search actions share one field surface and are excluded from button plate decoration. Open/closed issue controls use equal padding around their icons. The repository sidebar has one plain paper container, without nested segment frames or corner marks. Its overflow control stays on the filter row; the native component recalculates after fonts load. Checked live: issue search submission, Explore search styling, embedded sidebar filter dropdown, repository/organization tab switching, and the three-dot Collaborative filter.

The account strip immediately below the main navbar has a transparent background and no dividing line, continuing the page's dotted texture.

Repository action/counter pairs use one shared 38px frame with centered count cells. Labeled button wrappers are excluded from the decorative button helper. The clone protocol, URL, copy action, and dropdown share a single 38px field; protocol colors follow Forgejo's current selection. Issue and release/tag switches have consistent padding, including the Closed icon and the tags label. The divider underneath repository tabs is removed. Checked live: control dimensions, Closed filter navigation, HTTPS/SSH switching, and clone dropdown.

ASCII background

The supplied ascii-background-clone project is adapted as a low-contrast ink illustration behind the paper UI. The existing dots remain. The sign-in version sits toward the lower left with a vertical fade; the workspace version sits toward the lower right. It is non-interactive and hidden from assistive tools.

The original model2 STL is sampled into 28,000 surface points (252 KB) so the website does not download the multi-megabyte STL or run React/Three.js/WebGL. The small canvas updates at a maximum of approximately 10 frames per second, rotating at 0.055 radians per second. Hidden pages stop scheduling frames. Mobile screens, reduced-motion preferences, and data-saving mode use one still frame. Failure to load the illustration leaves the existing dotted background. The server serves static files; no backend process was added.

Original background concept and mesh: Maximilian Kaspar. The artwork was supplied in the local project; its original rights remain with its creator. background/provenance.json records the STL checksum and format. For deliberate regeneration, install NumPy in your development environment and run python tools/build-ascii-points.py path/to/model2.stl.gz. Normal packaging still uses only Python's standard library and the included point cloud.

Guest access

The live site uses Forgejo's built-in guest homepage and repository browser. Guests can read and clone public repositories. Creating issues, pull requests, and comments requires sign-in; pushing also requires write permission. Private repositories remain restricted to authorized accounts. New accounts can register through Google sign-in; local password self-registration and email delivery are disabled on this installation.

This is configured separately from the theme with LANDING_PAGE = home in [server] and REQUIRE_SIGNIN_VIEW = false in [service]. Publishing this source repository does not change the default visibility for newly created projects.

Google sign-in

The native Google authentication source is named Google (Forgejo provider gplus, its historical internal name). Its exact authorized callback is:

https://git.derkdev.nl/user/oauth2/Google/callback

The connection requests only basic identity scopes: openid, email, and profile. A first sign-in creates a normal account without a local password or an Abzweig verification email. Existing accounts require signing in before linking (ACCOUNT_LINKING = login); matching an email does not silently grant access to an existing account. Existing local administrator login still works. New users keep their email private by default.

Configuration is separate from the theme:

[service]
DISABLE_REGISTRATION = false
ALLOW_ONLY_EXTERNAL_REGISTRATION = true
ALLOW_ONLY_INTERNAL_REGISTRATION = false
REQUIRE_EXTERNAL_REGISTRATION_PASSWORD = false
REGISTER_EMAIL_CONFIRM = false
REGISTER_MANUAL_CONFIRM = false
ENABLE_INTERNAL_SIGNIN = true
SHOW_REGISTRATION_BUTTON = false
DEFAULT_KEEP_EMAIL_PRIVATE = true

[oauth2_client]
ENABLE_AUTO_REGISTRATION = true
REGISTER_EMAIL_CONFIRM = false
ACCOUNT_LINKING = login
USERNAME = email

[openid]
ENABLE_OPENID_SIGNIN = false
ENABLE_OPENID_SIGNUP = false

The openid section above concerns the legacy OpenID login form; it does not disable Google's OAuth/OIDC scopes. Google account recovery is handled by Google. The popup uses the native callback and signed-in page state, never an OAuth token in browser messages. Blocked popups retain the ordinary sign-in link. Run node --test tests/auth-popup.test.cjs for popup fallback and completion checks. Provider credentials and production configuration are not in this repo.

The public privacy notice is served at /assets/cream-ink/privacy.html. No extra authentication server, Google billing account, or paid Apple integration was added. Microsoft and Apple are not enabled.

The existing Git history was checked for private-key blocks, credential/token patterns, sensitive file types, and matches against protected server secrets before publication. The ignore rules also exclude common configuration, key, database, backup, and credential files. Review staged files before every push.

Server configuration, SSH keys, passwords, API tokens, databases, generated archives, and disposable QA account scripts are excluded from this repository.