![]()
*/
.logo img {
max-height: 100px !important;
height: auto !important;
width: auto !important;
object-fit: contain !important;
}
/* =========================================================================
HEADER BAR - Transparent background
========================================================================= */
.header-container,
.header-container.content-bounds,
.header,
.header.flex,
div.header-container {
background: transparent !important;
background-color: transparent !important;
}
/* =========================================================================
WIDGET TITLES
The "WEATHER", "NEWS & FEEDS", etc. headers on each widget
========================================================================= */
/* The header container */
.widget-header {
display: flex !important;
align-items: center !important;
justify-content: flex-start !important;
min-height: 2.2em !important;
padding: 0.5em 0 0.5em 12px !important; /* top right bottom LEFT */
box-sizing: border-box !important;
}
/* The h2 title text inside */
.widget-header h2,
.widget-header .uppercase,
h2.uppercase {
color: #5ac8d8 !important;
font-weight: 600 !important;
margin: 0 !important;
padding: 0 !important;
line-height: 1 !important;
}
/* =========================================================================
REMOVE DEFAULT BORDER & ADD CYAN LINE between header and content
========================================================================= */
/* Nuclear option - remove ALL borders from widget-content */
.widget-content,
.widget-content:not(.widget-content-frameless),
.widget-content-frame,
.widget-content:first-of-type,
.widget > .widget-content,
[class*="widget-content"] {
border: 0 !important;
border-top: 0 !important;
border-width: 0 !important;
border-style: none !important;
border-color: transparent !important;
box-shadow: none !important;
outline: none !important;
--color-widget-content-border: transparent !important;
background-color: rgba(20, 50, 70, 0.35) !important; /* DARK BLUE, semi-transparent */
}
/* Add cyan line via pseudo-element on header bottom */
.widget-header::after {
content: "" !important;
display: block !important;
position: absolute !important;
bottom: 0 !important;
left: 12px !important;
right: 12px !important;
height: 1px !important;
background: rgba(90, 200, 216, 0.4) !important; /* CYAN line */
}
/* Ensure header is positioned for the pseudo-element */
.widget-header {
position: relative !important;
}
/* =========================================================================
WIDGET BACKGROUNDS
Semi-transparent backgrounds for widget containers
========================================================================= */
/* Standard widgets (calendar, weather, to-do, RSS, etc.) */
.widget,
.widget-type-calendar,
.widget-type-weather,
.widget-type-to-do,
.widget-type-rss,
.widget-type-videos,
.widget-type-reddit,
.widget-type-bookmarks {
background-color: rgba(20, 50, 70, 0.35) !important; /* DARK BLUE, semi-transparent */
}
/* RSS feed items */
.rss-item,
.feed-item {
background-color: rgba(45, 126, 136, 0.25) !important; /* TEAL tint */
border-radius: 6px !important;
margin-bottom: 4px !important;
}
/* Video items */
.video-item,
.videos-item {
background-color: rgba(45, 126, 136, 0.25) !important; /* TEAL tint */
border-radius: 8px !important;
}
/* =========================================================================
WIDGET OVERLAYS
========================================================================= */
.widget.widget-type-iframe {
position: relative !important;
overflow: hidden !important;
border-radius: 12px !important;
}
.widget.widget-type-iframe iframe {
border-radius: 12px !important;
width: 100% !important;
border: 0 !important;
filter: sepia(0.25) saturate(1) hue-rotate(0deg) brightness(1.05) !important;
position: relative !important;
z-index: 1 !important;
}
/* Overlay ON TOP of iframe (you can’t style inside cross-origin iframes) */
.widget.widget-type-iframe::after {
content: "";
position: absolute;
inset: 0;
z-index: 2;
pointer-events: none;
border-radius: 12px;
background: rgba(45, 181, 230, 0.12);
}
/* iFrames: slightly transparent + boosted contrast/brightness */
.widget.widget-type-iframe iframe {
opacity: 0.7 !important;
filter: contrast(1.15) brightness(1.3) !important;
border-radius: 12px !important;
width: 100% !important;
border: 0 !important;
position: relative !important;
z-index: 1 !important;
}
/* =========================================================================
CONTAINER VERSIONS WIDGET HEIGHT INCREASE
========================================================================= */
.widget.widget-type-custom-api:has(.ver-widget) .ver-list {
max-height: 855px !important;
}
.widget.widget-type-custom-api:has(.ver-widget) {
min-height: 975px !important;
}
/* =========================================================================
WIDGET ROUNDED CORNERS
========================================================================= */
/* The parent widget container - round ALL corners and clip children */
.widget {
border-radius: 12px !important;
overflow: hidden !important; /* This clips the children to the rounded shape */
}
/* Header - round only TOP corners */
.widget-header {
border-top-left-radius: 12px !important;
border-top-right-radius: 12px !important;
border-bottom-left-radius: 0 !important;
border-bottom-right-radius: 0 !important;
}
/* Content - round only BOTTOM corners */
.widget-content,
.widget-content:not(.widget-content-frameless),
.widget-content-frame {
border-top-left-radius: 0 !important;
border-top-right-radius: 0 !important;
border-bottom-left-radius: 12px !important;
border-bottom-right-radius: 12px !important;
}
/* For widgets without headers (content only), round all corners */
.widget:not(:has(.widget-header)) .widget-content {
border-radius: 12px !important;
}
/* =========================================================================
BOOKMARK STYLING
The link cards in bookmark widgets
========================================================================= */
.bookmark-link {
background-color: rgba(30, 70, 90, 0.6) !important; /* DARK BLUE-TEAL */
border-radius: 8px !important;
transition: background-color 0.2s ease !important;
}
.bookmark-link:hover {
background-color: rgba(45, 100, 120, 0.8) !important; /* LIGHTER on hover */
}
/* =========================================================================
REDDIT WIDGET SPECIFIC
Subreddit tabs and content
========================================================================= */
/* Subreddit tabs (R/HUNGARY, R/SELFHOSTED, etc.) */
.reddit-subreddit-tabs .tab,
.subreddit-tabs button,
.subreddit-tab,
[class*="subreddit"] button,
.widget-type-reddit button {
color: #5ac8d8 !important; /* CYAN */
}
.reddit-subreddit-tabs .tab:hover,
.subreddit-tabs button:hover,
[class*="subreddit"] button:hover {
color: #7ed9e6 !important; /* LIGHTER CYAN on hover */
}
/* Active subreddit tab */
.reddit-subreddit-tabs .tab.active,
.subreddit-tabs button.active,
.subreddit-tab.active,
[class*="subreddit"] button[aria-selected="true"] {
color: #7ed9e6 !important;
border-color: #5ac8d8 !important;
}
/* =========================================================================
VIDEO WIDGET SPECIFIC
YouTube video titles and channel names
========================================================================= */
.video-title,
.videos-item-title,
.video-channel,
.videos-item-channel {
color: #5ac8d8 !important;
}
/* =========================================================================
BACKGROUNDS - TRANSPARENT
Keep page backgrounds transparent to show the space background
========================================================================= */
.content-bounds,
.body-content,
.page,
#page-content,
.page-column,
.page-columns {
background: transparent !important;
}
/* =========================================================================
SCROLLBAR STYLING
Custom scrollbar colors
========================================================================= */
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: rgba(30, 60, 90, 0.4); /* DARK BLUE track */
}
::-webkit-scrollbar-thumb {
background: rgba(90, 200, 216, 0.5); /* CYAN thumb */
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: rgba(90, 200, 216, 0.7); /* BRIGHTER CYAN on hover */
}
/* =========================================================================
EXPAND/COLLAPSE BUTTONS
"Show more" buttons in RSS, Reddit widgets
========================================================================= */
.expand-toggle-button,
.expand-toggle-button.container-expanded,
.widget-type-rss .expand-toggle-button {
background: transparent !important;
background-color: transparent !important;
box-shadow: none !important;
border: 0 !important;
}
.widget-type-rss .expand-toggle-button {
margin-top: 8px !important;
padding: 10px 12px !important;
border-top: 1px solid rgba(90, 200, 216, 0.2) !important; /* CYAN tinted border */
color: rgba(255,255,255,0.75) !important;
}
.expand-toggle-button:hover,
.widget-type-rss .expand-toggle-button:hover {
color: #5ac8d8 !important; /* CYAN on hover */
}
/* Remove pseudo-element backgrounds */
.expand-toggle-button::before,
.expand-toggle-button::after,
.expand-toggle-button-icon::before,
.expand-toggle-button-icon::after,
.widget-type-rss .expand-toggle-button::before,
.widget-type-rss .expand-toggle-button::after {
background: transparent !important;
background-color: transparent !important;
box-shadow: none !important;
border: 0 !important;
}
.expand-toggle-button.container-expanded {
backdrop-filter: none !important;
-webkit-backdrop-filter: none !important;
}
/* =========================================================================
IFRAME STYLING
Remove tint/overlay from embedded iframes
========================================================================= */
.widget.iframe-no-tint iframe {
filter: none !important;
}
.widget.iframe-no-tint::after {
content: none !important;
display: none !important;
}
/* =========================================================================
ADDITIONAL ELEMENTS
Various UI elements that might need color overrides
========================================================================= */
/* Monitor widget status indicators */
.monitor-site-status {
color: #5ac8d8 !important;
}
/* Group widget tabs */
.group-tabs button,
.tabs button {
color: #5ac8d8 !important;
}
.group-tabs button:hover,
.tabs button:hover {
color: #7ed9e6 !important;
}
.group-tabs button.active,
.tabs button.active,
.group-tabs button[aria-selected="true"],
.tabs button[aria-selected="true"] {
color: #7ed9e6 !important;
border-color: #5ac8d8 !important;
}
/* =========================================================================
Időkép custom-api widget
========================================================================= */
.idokep { display: flex; flex-direction: column; gap: 10px; }
.idokep-top { display: flex; justify-content: space-between; align-items: center; gap: 10px; }
.idokep-top-left { display: flex; align-items: center; gap: 10px; }
.idokep-icon { width: 42px; height: 42px; opacity: 0.95; }
.idokep-temp { font-size: 42px; font-weight: 700; letter-spacing: 0.5px; line-height: 1; }
.idokep-top-right { text-align: right; }
.idokep-loc { opacity: 0.85; font-weight: 600; }
.idokep-src { opacity: 0.6; font-size: 12px; margin-top: 2px; }
.idokep-src a { opacity: 0.9; }
.idokep-hourly { display: flex; gap: 10px; padding-top: 4px; }
.idokep-hour { width: 54px; display: flex; flex-direction: column; align-items: center; gap: 6px; opacity: 0.9; }
.idokep-hour-time { font-size: 12px; opacity: 0.65; }
.idokep-hour-icon { width: 26px; height: 26px; }
.idokep-hour-temp { font-weight: 700; }
.idokep-muted { opacity: 0.6; font-size: 12px; padding: 4px 0; }
.idokep-daily { display: flex; flex-direction: column; gap: 8px; margin-top: 2px; }
.idokep-row {
display: grid;
grid-template-columns: 44px 26px 36px 1fr 36px; /* day+date, icon, min, bar, max */
gap: 10px;
align-items: center;
}
.idokep-dow { opacity: 0.7; font-weight: 700; }
.idokep-dayicon img { width: 22px; height: 22px; opacity: 0.95; }
.idokep-min, .idokep-max { text-align: right; font-weight: 700; opacity: 0.8; }
.idokep-dow {
display: grid;
grid-template-columns: 22px 1fr; /* dow then daynum */
column-gap: 6px;
align-items: center;
opacity: 0.8;
font-weight: 700;
}
.idokep-daynum {
text-align: right;
opacity: 0.75;
font-variant-numeric: tabular-nums;
}
.idokep-bar {
position: relative;
height: 10px;
}
.idokep-bar-track {
position: absolute;
inset: 0;
border-radius: 999px;
background: rgba(255,255,255,0.10);
}
.idokep-bar-fill {
position: absolute;
top: 0;
bottom: 0;
border-radius: 999px;
overflow: hidden;
box-shadow: 0 0 0 1px rgba(0,0,0,0.08) inset;
/* Position controlled by Python variables */
left: var(--l, 0%);
width: var(--w, 0%);
}
/* This element holds the gradient */
.idokep-bar-gradient {
position: absolute;
top: 0;
bottom: 0;
/* Compensation geometry controlled by Python variables */
width: var(--gw, 100%);
margin-left: var(--ml, 0%);
/* The Dynamic Gradient */
background: linear-gradient(90deg,
#ffffff var(--s-wht),
#60a5fa var(--s-blu),
#a78bfa var(--s-pur),
#fb7185 var(--s-pnk),
#ef4444 var(--s-red)
);
}
/* =========================================================================
Forcing transparency on no-tint iframes
========================================================================= */
/* Force notes iframe to be transparent */
.widget.iframe-no-tint iframe {
background: transparent !important;
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: glance-kisfenyo
namespace: glance-system
labels:
app.kubernetes.io/name: glance-kisfenyo
app.kubernetes.io/instance: glance-kisfenyo
app.kubernetes.io/version: "v0.8.4"
annotations:
reloader.stakater.com/auto: "true"
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app.kubernetes.io/name: glance-kisfenyo
app.kubernetes.io/instance: glance-kisfenyo
template:
metadata:
labels:
app.kubernetes.io/name: glance-kisfenyo
app.kubernetes.io/instance: glance-kisfenyo
app.kubernetes.io/version: "v0.8.4"
spec:
securityContext:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
initContainers:
- name: build-bookmarks-index
image: mikefarah/yq:4.50.1
securityContext:
runAsUser: 1000
runAsGroup: 1000
allowPrivilegeEscalation: false
command: ["/bin/sh", "-c"]
args:
- |
set -eux
which yq
yq --version
mkdir -p /app/assets
yq eval -o=json '
[ .pages[] as $p
| $p.columns[]? as $c
| $c.widgets[]? as $w
| select($w.type == "bookmarks")
| $w.groups[]? as $g
| $g.links[]?
| select(.url != null and .url != "")
| {
"title": (.title // .url),
"url": .url,
"page": ($p.name // ""),
"widget": ($w.title // ""),
"group": ($g.title // "")
}
] | unique_by(.url)
' /config/glance.yml > /app/assets/bookmarks.json
echo "Bookmarks indexed: $(yq eval -r 'length' /app/assets/bookmarks.json)"
volumeMounts:
- name: config
mountPath: /config
readOnly: true
- name: assets
mountPath: /app/assets
containers:
- name: glance
image: glanceapp/glance:v0.8.4
imagePullPolicy: IfNotPresent
env:
- name: TZ
value: "Europe/Budapest"
- name: PROMETHEUS_URL
value: "http://prometheus.mon-system.svc.cluster.local:9090"
- name: CRAFTY_URL
value: "https://crafty.dooplex.hu"
- name: CRAFTY_API_TOKEN
value: "newtoken"
- name: CRAFTY_SERVER_ID
value: "837c7378-7a76-46f7-b8ea-6f35c0a314f4"
- name: ROMM_URL
value: "arcade.dooplex.hu"
- name: UPTIME_KUMA_PUBLIC_URL
value: "http://uptimekuma.dooplex.hu"
- name: UPTIME_KUMA_URL
value: "http://uptimekuma.uptimekuma-system.svc.cluster.local:3001"
- name: UPTIME_KUMA_STATUS_SLUG
value: "homepage"
ports:
- name: http
containerPort: 8080
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
initialDelaySeconds: 10
periodSeconds: 30
timeoutSeconds: 5
failureThreshold: 3
readinessProbe:
httpGet:
path: /
port: http
initialDelaySeconds: 5
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
resources:
requests:
cpu: 10m
memory: 32Mi
limits:
cpu: 200m
memory: 128Mi
volumeMounts:
- name: assets
mountPath: /app/assets
- name: config
mountPath: /app/config/glance.yml
subPath: glance.yml
- name: config
mountPath: /app/assets/custom.css
subPath: custom.css
volumes:
- name: config
configMap:
name: glance-config-kisfenyo
- name: assets
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: glance-kisfenyo
namespace: glance-system
labels:
app.kubernetes.io/name: glance-kisfenyo
app.kubernetes.io/instance: glance-kisfenyo
spec:
type: ClusterIP
ports:
- name: http
port: 8080
targetPort: http
protocol: TCP
selector:
app.kubernetes.io/name: glance-kisfenyo
app.kubernetes.io/instance: glance-kisfenyo
---
# Ingress WITH Authentik proxy authentication
# Update the auth-url annotation with your actual outpost service name after creating in Authentik
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: glance-kisfenyo
namespace: glance-system
labels:
app.kubernetes.io/name: glance-kisfenyo
app.kubernetes.io/instance: glance-kisfenyo
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
external-dns.alpha.kubernetes.io/hostname: kisfenyo.dooplex.hu
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/proxy-buffer-size: "16k"
nginx.ingress.kubernetes.io/proxy-buffers-number: "4"
nginx.ingress.kubernetes.io/proxy-busy-buffers-size: "32k"
# Authentik Forward Auth annotations
# TODO: Update 'glance-outpost' with your actual outpost name after creating in Authentik
nginx.ingress.kubernetes.io/auth-url: http://ak-outpost-glance-outpost.auth-system.svc.cluster.local:9000/outpost.goauthentik.io/auth/nginx
nginx.ingress.kubernetes.io/auth-signin: https://kisfenyo.dooplex.hu/outpost.goauthentik.io/start?rd=$escaped_request_uri
nginx.ingress.kubernetes.io/auth-response-headers: Set-Cookie,X-authentik-username,X-authentik-groups,X-authentik-email
nginx.ingress.kubernetes.io/auth-snippet: |
proxy_set_header X-Forwarded-Host $http_host;
nginx.ingress.kubernetes.io/configuration-snippet: |
set $geo_allowed 0;
if ($remote_addr ~ "^192\.168\.") { set $geo_allowed 1; }
if ($remote_addr ~ "^10\.") { set $geo_allowed 1; }
if ($geoip2_country_code = "HU") { set $geo_allowed 1; }
if ($geo_allowed = 0) {
return 403 "Access restricted to Hungary";
}
spec:
ingressClassName: nginx-internal
rules:
- host: kisfenyo.dooplex.hu
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: glance-kisfenyo
port:
number: 8080
tls:
- hosts:
- kisfenyo.dooplex.hu
secretName: glance-kisfenyo-tls
---