2 Commits

Author SHA1 Message Date
28f18621e0 the LUG update
All checks were successful
NPM Audit Check / Check NPM audit (push) Successful in -2m5s
App Image CI / Build app image (push) Successful in 1m9s
2025-12-05 12:00:03 -05:00
5e1c783a23 bump deps
All checks were successful
App Image CI / Build app image (push) Successful in 1m8s
NPM Audit Check / Check NPM audit (push) Successful in -2m2s
2025-12-01 19:28:08 -05:00
4 changed files with 110 additions and 81 deletions

112
package-lock.json generated
View File

@@ -1,24 +1,24 @@
{ {
"name": "madisonlinux", "name": "madisonlinux",
"version": "0.1.0", "version": "0.2.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "madisonlinux", "name": "madisonlinux",
"version": "0.1.0", "version": "0.2.0",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"body-parser": "^2.2.0", "body-parser": "^2.2.1",
"ejs": "3.1.10", "ejs": "3.1.10",
"express": "5.1.0", "express": "^5.2.1",
"ics": "^3.8.1", "ics": "^3.8.1",
"json5": "2.2.3" "json5": "2.2.3"
}, },
"devDependencies": { "devDependencies": {
"@sindresorhus/tsconfig": "8.0.1", "@sindresorhus/tsconfig": "8.0.1",
"@types/express": "^5.0.3", "@types/express": "^5.0.6",
"@types/node": "^24.7.0", "@types/node": "^24.10.1",
"forking-build-shit": "1.0.5", "forking-build-shit": "1.0.5",
"typescript": "5.9.3" "typescript": "5.9.3"
} }
@@ -368,15 +368,15 @@
} }
}, },
"node_modules/@types/express": { "node_modules/@types/express": {
"version": "5.0.3", "version": "5.0.6",
"resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz", "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz",
"integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==", "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/body-parser": "*", "@types/body-parser": "*",
"@types/express-serve-static-core": "^5.0.0", "@types/express-serve-static-core": "^5.0.0",
"@types/serve-static": "*" "@types/serve-static": "^2"
} }
}, },
"node_modules/@types/express-serve-static-core": { "node_modules/@types/express-serve-static-core": {
@@ -399,21 +399,14 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/mime": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
"integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "24.7.0", "version": "24.10.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.0.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz",
"integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==", "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~7.14.0" "undici-types": "~7.16.0"
} }
}, },
"node_modules/@types/qs": { "node_modules/@types/qs": {
@@ -441,25 +434,13 @@
} }
}, },
"node_modules/@types/serve-static": { "node_modules/@types/serve-static": {
"version": "1.15.9", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.9.tgz", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz",
"integrity": "sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA==", "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/http-errors": "*", "@types/http-errors": "*",
"@types/node": "*",
"@types/send": "<1"
}
},
"node_modules/@types/serve-static/node_modules/@types/send": {
"version": "0.17.5",
"resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz",
"integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/mime": "^1",
"@types/node": "*" "@types/node": "*"
} }
}, },
@@ -489,23 +470,27 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/body-parser": { "node_modules/body-parser": {
"version": "2.2.0", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz",
"integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"bytes": "^3.1.2", "bytes": "^3.1.2",
"content-type": "^1.0.5", "content-type": "^1.0.5",
"debug": "^4.4.0", "debug": "^4.4.3",
"http-errors": "^2.0.0", "http-errors": "^2.0.0",
"iconv-lite": "^0.6.3", "iconv-lite": "^0.7.0",
"on-finished": "^2.4.1", "on-finished": "^2.4.1",
"qs": "^6.14.0", "qs": "^6.14.0",
"raw-body": "^3.0.0", "raw-body": "^3.0.1",
"type-is": "^2.0.0" "type-is": "^2.0.1"
}, },
"engines": { "engines": {
"node": ">=18" "node": ">=18"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
} }
}, },
"node_modules/brace-expansion": { "node_modules/brace-expansion": {
@@ -783,18 +768,19 @@
} }
}, },
"node_modules/express": { "node_modules/express": {
"version": "5.1.0", "version": "5.2.1",
"resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
"integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"accepts": "^2.0.0", "accepts": "^2.0.0",
"body-parser": "^2.2.0", "body-parser": "^2.2.1",
"content-disposition": "^1.0.0", "content-disposition": "^1.0.0",
"content-type": "^1.0.5", "content-type": "^1.0.5",
"cookie": "^0.7.1", "cookie": "^0.7.1",
"cookie-signature": "^1.2.1", "cookie-signature": "^1.2.1",
"debug": "^4.4.0", "debug": "^4.4.0",
"depd": "^2.0.0",
"encodeurl": "^2.0.0", "encodeurl": "^2.0.0",
"escape-html": "^1.0.3", "escape-html": "^1.0.3",
"etag": "^1.8.1", "etag": "^1.8.1",
@@ -1006,15 +992,19 @@
} }
}, },
"node_modules/iconv-lite": { "node_modules/iconv-lite": {
"version": "0.6.3", "version": "0.7.0",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0" "safer-buffer": ">= 2.1.2 < 3.0.0"
}, },
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
} }
}, },
"node_modules/ics": { "node_modules/ics": {
@@ -1377,22 +1367,6 @@
"node": ">= 0.10" "node": ">= 0.10"
} }
}, },
"node_modules/raw-body/node_modules/iconv-lite": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz",
"integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==",
"license": "MIT",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
"node": ">=0.10.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
}
},
"node_modules/readdirp": { "node_modules/readdirp": {
"version": "4.1.2", "version": "4.1.2",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
@@ -1699,9 +1673,9 @@
} }
}, },
"node_modules/undici-types": { "node_modules/undici-types": {
"version": "7.14.0", "version": "7.16.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
"integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },

View File

@@ -1,6 +1,6 @@
{ {
"name": "madisonlinux", "name": "madisonlinux",
"version": "0.1.0", "version": "0.2.0",
"description": "Website for upcoming Linux install party in Madison WI", "description": "Website for upcoming Linux install party in Madison WI",
"keywords": [ "keywords": [
"web", "web",
@@ -24,16 +24,16 @@
"views" "views"
], ],
"dependencies": { "dependencies": {
"body-parser": "^2.2.0", "body-parser": "^2.2.1",
"ejs": "3.1.10", "ejs": "3.1.10",
"express": "5.1.0", "express": "^5.2.1",
"ics": "^3.8.1", "ics": "^3.8.1",
"json5": "2.2.3" "json5": "2.2.3"
}, },
"devDependencies": { "devDependencies": {
"@sindresorhus/tsconfig": "8.0.1", "@sindresorhus/tsconfig": "8.0.1",
"@types/express": "^5.0.3", "@types/express": "^5.0.6",
"@types/node": "^24.7.0", "@types/node": "^24.10.1",
"forking-build-shit": "1.0.5", "forking-build-shit": "1.0.5",
"typescript": "5.9.3" "typescript": "5.9.3"
}, },

View File

@@ -83,7 +83,7 @@ class Web {
else if(!adminMode){ else if(!adminMode){
console.log(req.headers?.['user-agent']); console.log(req.headers?.['user-agent']);
} }
res.render('index_after', { res.render('lug', {
page: { page: {
title: 'Madison End of 10 Install Party', title: 'Madison End of 10 Install Party',
titlesuffix: 'Get help installing Linux', titlesuffix: 'Get help installing Linux',
@@ -129,18 +129,22 @@ class Web {
app.get('/event.ics', (_, res) => { app.get('/event.ics', (_, res) => {
createEvent({ createEvent({
uid: '1@madisonlinux.com', uid: '2@madisonlinux.com',
start: [2025, 11, 1, 19, 30], sequence: 1,
duration: { hours: 3, minutes: 0 }, startInputType: 'local',
title: 'Madison Linux Workshop', startOutputType: 'local',
description: 'Keep your current PC up-to-date by installing a free OS!', start: [2026, 1, 15, 19, 0],
duration: { hours: 1, minutes: 0 },
title: 'Madison Linux User Group',
description: 'A place for Linux users of all skill levels to meet and share knowledge, troubleshoot, and show off',
location: '56 Corry St, Madison, WI 53704', location: '56 Corry St, Madison, WI 53704',
url: 'https://madisonlinux.com/', url: 'https://madisonlinux.com/',
geo: { lat: 43.0982199, lon: -89.3481373 }, geo: { lat: 43.0982199, lon: -89.3481373 },
status: 'CONFIRMED', status: 'CONFIRMED',
busyStatus: 'TENTATIVE', busyStatus: 'TENTATIVE',
organizer: { name: 'Cory Sanin', email: 'endof10@cory.sanin.dev' }, organizer: { name: 'Cory Sanin', email: 'endof10@cory.sanin.dev' },
method: 'REQUEST' method: 'REQUEST',
recurrenceRule: 'FREQ=MONTHLY;BYDAY=TH;BYSETPOS=3'
}, (err, s) => { }, (err, s) => {
if (err) { if (err) {
console.error(err); console.error(err);

51
views/lug.ejs Normal file
View File

@@ -0,0 +1,51 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
<%- include("head", locals) %>
</head>
<body class="preload">
<%- include("navigation", locals) %>
<div class="content">
<% if (adminMode) { %>
<%- include("installform", locals) %>
<% } %>
<h1>Madison Linux</h1>
<p>
A Linux user Group (LUG) is coming to your neighborhood...
</p>
<p>
Madison Linux is (will be?) a place for Linux users of all skill levels to meet and share knowledge, troubleshoot, and show off.
Completely open to the pulic, we will meet monthly starting in January 2026. Every 3rd Thursday, at 7PM.
<a href="https://www.sector67.org/">Sector67</a> is hosting us again, so a big thank you to them!
</p>
<p>
<a class="btn" href="/event.ics">🗓️ Add to Calendar</a>
</p>
<p>
Agenda for January 15th:
<ul>
<li>Decide on what communication platform(s) will we use</li>
<li>Casual presentation on the format of other Linux User Groups; how-to LUG</li>
<li>Get a sense where the community's interests lie</li>
<li>Some time to meet and chat</li>
</ul>
</p>
<p>
Hope to see you soon!
</p>
<hr/>
<% if (installs && installs.length) { %>
<div id="installs">
<h1>We have saved <span><%= installs.length %></span> computer<% if (installs.length > 1) { %>s<% } %>!</h1>
</div>
<% } %>
<h2>Need help?</h2>
<p>
If we set up your Linux installation and you need help or guidance, shoot me an
email at <a href="mailto:endof10@cory.sanin.dev">endof10@cory.sanin.dev</a>.
</p>
</div>
</body>
</html>