Easy-to-manage touch screens
무료 오픈소스 터치스크린으로 USB 설정 가이드, 드래그‑드롭 편집기, 로컬 제어를 제공하며 Home Assistant용으로 제작되었습니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기A numberless solar clock on a 3D globe. Time told by light, not digits. Built to become a base layer of the SeedTree Landscape.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A clock that tells time by light instead of digits. The globe shows where the sun is overhead, rings of light spreading from it an hour of the Earth's turn apart, and rings of night closing in on midnight on the far side. There are no hands or time zones on the face. You find yourself on the globe and read the hour by where you sit in the light. An optional hour count (on by default, and switchable off for a wholly numberless face) sets a small number in each hour band, so the difference between two places can be counted.README 전문 보기 ↗A clock that tells time by light instead of digits. The globe shows where the sun is overhead, rings of light spreading from it an hour of the Earth's turn apart, and rings of night closing in on midnight on the far side. There are no hands or time zones on the face. You find yourself on the globe and read the hour by where you sit in the light. An optional hour count (on by default, and switchable off for a wholly numberless face) sets a small number in each hour band, so the difference between two places can be counted.
Now on Earth is its own site, and it is built to become a base layer of the Landscape on SeedTree.
Every feature is held to these four. They fold in the design philosophy of The Turning, a seasonal-companion concept whose ideas live here rather than in a separate app. A change that breaks one of them doesn't ship.
Alongside these, the lines already held: numberless in spirit (proximity in words, not dates or counts on the face); open data under open licences, logged in DATA_SOURCES.md; polite fetching; and people only by their own choice, at coarse places, with nothing personal stored. Personal reflections are not kept in this version. A private seasonal record belongs with the individual journey (V4), and will need its own privacy design, with people owning their data.
src/core/ pure maths: no DOM, no Mapbox, no network
sun.ts subsolar point, declination, equation of time, sun in the sky
rings.ts spherical caps as GeoJSON, cut cleanly at the antimeridian and poles
seasons.ts tropics, today's sun track, the viewer's parallel split into lit and dark
twilight.ts golden hour and civil, nautical, astronomical twilight as graded bands
moon.ts sublunar point, phase and illumination (low-precision Meeus)
tides.ts the moon's pull (P2 shape), spring and neap, in shapes and words
magnetic.ts the World Magnetic Model: field, compass words, traced field lines, pole trails
aurora.ts the typical oval, darkness for seeing aurora, and aurora words
ocean.ts a 1° land and sea mask (for words: "the open ocean", the tides)
data/ generated by scripts (WMM coefficients, pole positions); do not edit
people.ts the Presence shape: opt-in only, coarse places, no search
events.ts seasonal ecological events, month blending, and the shapes for
partnered knowledge and ground-truthing (placeholders)
describe.ts the light in words ("late afternoon · the sun is low to the west")
src/mapbox/ the light as layers on any Mapbox GL v3 map
attach.ts attachNowOnEarth(map, options) → controller
layers/ one self-contained module per layer: tides, rings, twilight,
seasons, people, moon, sun
palette.ts colours read from the host page's CSS tokens
site/ the standalone clock (Vite), built on the package's public exports
api/ Vercel functions for the site (aurora.ts: NOAA's forecast; hazards.ts: USGS quakes and GDACS fires and eruptions; each lightened and cached)
scripts/ boundary and copy checks, and ecology/ build scripts
events/ static event data built by those scripts (humpback-whales.json)
DATA_SOURCES.md every dataset, its licence and its credit
The package publishes two entry points:
now-on-earth/core (also the package root): for anything that wants the maths.now-on-earth/mapbox: for a page that already has a Mapbox map.The host owns the map, the token, the style and the projection. The clock only adds noe- sources and layers, and removes every one of them on destroy(). mapbox-gl is a peer dependency (^3.26.0, matching SeedTree V2) and is imported for types only.
import { attachNowOnEarth } from "now-on-earth/mapbox";
map.once("load", () => {
// ...the host's own sources and layers...
const clock = attachNowOnEarth(map, {
beforeId: "clusters", // slip the light beneath the Landscape's pins
});
// later: clock.setTime(date) · clock.setTime(null) for live · clock.setVisible("seasons", false)
// on unmount: clock.destroy()
});
attachNowOnEarth(map, options):
| Option | Default | |
|---|---|---|
time | live | A fixed Date, or leave unset to follow the real clock |
viewer | Northern Rivers, NSW | { lng, lat } for the viewer's line and dot |
fine | false | 5° rings instead of 15° |
people | none | Presence[]; only those with consent.shown are drawn |
onPick | none | Called with a person or node's details on hover or tap |
layers | tides, rings, twilight, seasons, people, moon, sun | Layer modules, bottom to top |
hidden | tides, people | Layer keys to start hidden |
beforeId | first label layer | Host layer to sit beneath; null for on top |
themeElement | <html> | Where to read colour tokens from |
tokens / palette | V2 names | Rename tokens, or pin colours outright |
The controller has setTime, isLive, setViewer, setFine, setPeople, setVisible, layers, follow("sun" | null), faceSun, faceMe, frame, subscribe, refreshPalette and destroy.
Nothing is hard-coded in the layers. They read SeedTree V2's own tokens off the page, and re-read them when data-theme flips between morning and night:
| Role | Token | Notes |
|---|---|---|
| Sun, day rings, tropics, sun track | --accent | V2's gold |
| The heart of the day | --noe-glow | The clock's own; day rings pale toward it near the sun |
| Golden hour and twilight | --noe-dusk | The clock's own; a dusk rose |
| Moon, phase, tides | --noe-moon | The clock's own; moonlight silver |
| Night rings | --noe-night | The clock's own; defaults to a dusk violet |
| The viewer's line and dot | --noe-me | The clock's own; defaults to teal |
| Paper, ink | --bg, --ink | V2 |
So a V2 restyle flows straight into the light. The standalone site mirrors V2's values in site/src/tokens.css.
Layers are gathered into four lenses so the clock stays calm by default. Only Light is on at first; each lens is a switch for the whole way of looking, and opens to show its own layers. A layer is drawn when its lens is on and its own switch is on (setLens, lensOn, and lenses in the options; the grouping lives in src/mapbox/lenses.ts).
| Lens | Layers |
|---|---|
| Light | sun, daylight (the gold), night shade (the violet), hour rings (and finer rings), hour numbers, twilight, moon, tides, the sun's lane, today's sun track, your day line; every one its own switch |
| Wheel | the wheel of the year: the eight turnings on a loop around the sun, both hemispheres' names (the Celtic/European wheel, labelled as such); local seasonal knowledge from its custodians (placeholder); look-up invitations (to come) |
| Life | ecological events (humpbacks; Bar-tailed Godwits across the Pacific), life noticed on the ground (ground notes), people and nodes, partnered seasonal knowledge (placeholder), migrations and iNaturalist sightings (to come) |
| Earth's body | the magnetic field (traced from the World Magnetic Model 2025), magnetic north's wandering since 1925 (NOAA NCEI), the aurora (NOAA's live OVATION forecast near now, a typical oval otherwise), major earthquakes (USGS, live) and erupting volcanoes (GDACS, live), the axis's wobble (later) |
| Weather and ice | the weather here (MET Norway, in words, for a chosen place), weather noticed on the ground (ground notes), sea ice and snow (NASA GIBS, a recent year month by month), major wildfires (GDACS, live), the rain belt and carbon dioxide (later) |
The Flat model is a separate switch, outside the lenses.
| Key | What it shows | On by default |
|---|---|---|
day-light | Gold caps round the sun every hour band, paling toward it | yes |
night-shade | Violet caps closing on midnight | yes |
hour-rings | The hairline edges of the hour bands, the terminator firmest | yes |
hour-numbers | A small count in each band: 1 to 6 from the sun through the day, 7 to 12 across the night to midnight | yes |
twilight | Golden hour warming to rose, then civil, nautical and astronomical twilight cooling to violet | yes |
lane | The tropics: the sun's lane | yes |
sun-track | Today's parallel under the sun | yes |
day-line | The viewer's line, lit and dark, and their dot | yes |
moon | The moon over its sublunar point, drawn in its true phase, mirrored for the southern hemisphere | yes |
sun | The sun point, breathing slowly | yes |
tides | The moon's pull: two swells rising toward their crests (under the moon and opposite), a faint low-water belt between, a dashed rim where the pull turns; fuller at spring tides, fainter at neap. The idealised equilibrium tide, not a tide table | no |
people | People and nodes who chose to be shown, each dot in its own light | no |
| event id | Each events entry: a soft seasonal haze, blended month to month | yes, when passed |
partnered-knowledge | Placeholder. Draws nothing until knowledge is shared with permission | n/a |
import humpbacks from "now-on-earth/events/humpback-whales.json";
attachNowOnEarth(map, { events: [humpbacks] });
Event data is built ahead of time, never fetched in the browser:
npm run data:humpbacks -- --dry-run # list the requests, fetch nothing
npm run data:humpbacks # fetch (or read cache) and write events/
The dataset carries its own words (a general line per month), a credit line and a note on what it can't say. It's shown as a general seasonal pattern, not tracks. An event with display: "flow" (the humpbacks) is drawn as a migration flow instead of a haze: deriveFlow (src/core/flows.ts) takes the corridor as the weighted middle of each band of sightings (the stray 2% at the ends trimmed), the season as each month's sightings against the busiest, and the direction from which way the middle moves month to month; migrationFlowLayer draws a ribbon that swells in season and particles streaming along it, held still under reduced motion. No single sighting is drawn. An event with display: "flyway" (the godwits) names its stopovers and legs; deriveFlyway places each stopover at the middle of its sightings, joins them by great circles (the ocean legs are flown nonstop, so nothing is seen there) and gives each leg its season from one stopover emptying as the next fills. See DATA_SOURCES.md for the licence rules and every source.
A Presence is { id, kind, name, place, placeName?, href?, consent }. The layer draws only those with consent.shown === true, and rounds every place again on the way in (people and nodes to 0.5°, about 55 km; organisations to 0.1°). A presence is a place someone chose, never a device position: there is no tracking, no live location and no search. fromLandscapeRows(rows) reads the Landscape's public listings in the same shape. The standalone site uses clearly marked mock nodes (site/src/mock-people.ts).
The first frost, rain in the gauge, the first snow, a storm; trees flowering and fruiting, cicadas and frogs calling, birds arriving and leaving. A GroundNote is { id, kind, what?, amount?, observedOn, place, note?, by?, licence, consent, source } (src/core/ground-notes.ts), and the core holds the line, like the people layer:
consent.shared); sharedNotes drops anything else, whatever a store hands back.makeGroundNote(input) checks and shapes a note (returning plain-words problems for a form), notesNear finds those near a place and a moment, groundNoteWords says one ("Jacarandas in flower, three days ago."), and groundNoteFeatures draws them. On the globe they are small dots in two layers, notes-weather (blue, Weather and ice) and notes-life (Life), bright while fresh and fading over a month, so scrubbing the year shows the season's signs arriving.
Where notes are kept is the host's choice, through GroundNoteStore (list, add, remove?), and they reach the clock through notes in the options or setGroundNotes. The standalone site keeps them in the browser only (site/src/ground-notes-store.ts), so nothing written there is seen by anyone else. The Landscape will pass a shared store with its own accounts and moderation.
Ground notes are for the season's signs, the things a neighbour would mention over the fence. A species seen up close, with a photo to be identified, belongs on iNaturalist (see the roadmap).
Each layer is a factory returning a ClockLayer: add, update, applyPalette, setVisible, remove, and an optional tick for gentle motion. It owns its sources and layers outright and namespaces them with ctx.id(...). Phase 3 layers (ecological events, partnered seasonal knowledge) slot into the same list.
npm install
cp .env.example .env.local # then add a public Mapbox token (pk.*)
npm run dev # http://localhost:5173
With no token, or no WebGL, the page still runs: the words and the sliders follow the light and the globe rests. Keys are never committed. The token comes from the consumer: VITE_MAPBOX_TOKEN for this site, the host's own map for the Landscape.
Controls, numberless: the day (scrub twelve hours either way), the year (half a year either way, with the solstices and equinoxes marked where they fall: a gold disc for the longest day, an empty ring for the shortest, half-lit for the equinoxes, named for your hemisphere; tap one to go there), play and pause (with a Pace slider while playing: as it is, hours, days, weeks, and seasons, where your hour is held and the year runs by in about a minute), face the sun (the camera follows it), face me, a Layers panel (the seasonal lines, twilight, the moon, the tides, people, finer rings), and morning or night. The slider tracks are drawn from the light itself: the sky over you across the day, and the length of your days across the year.
Layout: on a wide screen (900 px and up) everything the clock says runs down the left (the face, then any place or Here card, then the Guide) and the controls sit in a column down the right, with the globe centred in the space between. On a phone the words sit above the globe and the controls below, with cards and the Guide opening just over the dock.
Day · Year · Deep time: a selector above the slider chooses how far to look, one scale at a time. Day and Year move the light as before. Deep time reaches back from now to about 400 million years ago on a logarithmic scale (src/core/deep-time.ts), marked with named moments rather than figures: Now, Last Ice Age, Our species, Dinosaurs, Pangaea, with quieter ticks between (the pyramids, the first farms, the start of the ice ages, the asteroid), each a button that goes there. Years appear only in words, on the face and for screen readers ("the Last Ice Age · about 21,000 years ago"). In deep time the sun, rings and moon stay live; setDeepTime(years) passes the depth to every layer as frame.deep, so the Earth's own layers can follow (ancient coastlines next, then the continents), while the layers that only know the present (PRESENT_ONLY: live events, sea ice, people, notes, the magnetic field, and every migration) step aside, their switches resting.
Ancient coastlines (Earth's body): in deep time, the seabed that was dry land when the sea stood lower shows as soft sand over today's sea, back about 800,000 years through the ice ages. One greyscale image of today's shallow seabed (GEBCO, each pixel its depth) is recoloured on the GPU from the sea level at that moment (Spratt & Lisiecki 2016), so scrubbing fetches nothing. The face names the land bridges (seaWords). Going deep opens Earth's body if it was closed, and closes it again on the way back to now. Build with node scripts/earth/coastlines.mjs (--dry-run lists its 7 requests).
The wheel of the year (Wheel lens): the eight turnings computed from the sun (src/core/wheel.ts): the solstices and equinoxes where its ecliptic longitude crosses 0°, 90°, 180° and 270°, and the cross-quarter days at the true midpoints, 45° apart (so Beltane falls near 5 May). On the globe (wheelLayer) they ride a loop around the sun, each at the latitude the sun stands over at that turning, sunwise for the north, with a gold hand where the year is now. Each marker carries both hemispheres' names, the northern above and the southern below, since the wheel turns opposite: when the north is at Beltane, the south is at Samhain. wheelAt(date, lat) gives the place on your own wheel in words ("approaching Litha, the longest day"), shown on the face, never as a count. The names are the Celtic/European tradition's, labelled so; beside them a slot waits for local seasonal knowledge from its custodians (the same partnership placeholder as in Life).
The moon's qualities: moonQuality(moon) names the part of the moon's month as many keep it: the dark moon (the last two days or so before new) for rest, the new and waxing moon for intention, the full moon for illumination, the waning moon for release. It shows quietly under the moon on the globe, on the face beside the phase, in the hover and the Here card. Offered as a practice, not as a claim about the moon's influence.
The metronome of the human field (wide screens, lower left; phones to come): EART on an arc of the Earth, with an H on the swinging arm that completes HEART at one end and EARTH at the other. Its tempo is meant to follow the field's cadence and its reach the field's intensity (armAngle, fieldWords in src/core/field.ts). No source is connected yet, so the arm keeps a slow resting swing (RESTING_SWING), labelled "no source connected yet · a resting swing, not data"; with reduced motion it holds at HEART. A source plugs in through FieldSource once its data may be used; see DATA_SOURCES.md.
Earth Now · Hearts Now: a toggle at the top of the controls. Hearts Now is the inward view of the same globe: the camera settles on your place (or where you stand), the time returns to now, the dock quiets to the toggle, and one card says where you are on your own wheel, the quality of the light (lightQuality: lengthening or shortening, near or far from a solstice, in words), the moon's quality, one reflection question and a closing invitation to go outside (heartsNow in src/core/hearts.ts). The questions and invitations are content files in content/turning/, one per season and per turning, shipped with the package; only files marked reviewed are shown on the public site, and drafts appear on localhost tagged "draft". Nothing anyone reflects on is stored; SeasonalRecord is a marked placeholder for a private record in V4.
History (the third scale, after Day and Year): from now back about sixty-five thousand years, to the earliest dated evidence of people in Sahul, stretched so the recent centuries have room (src/core/history.ts). The scale is marked by broad human turnings (Classical empires, First states, Last Ice Age, People in Sahul, with quieter ticks between, among them the first farms), years only in words. On the globe the states historians have mapped (Cliopatria, CC BY 4.0) appear as they begin, each in its own colour, fill in as they grow toward their widest reach, and drain to stone grey as they decline (civilisationsLayer); the face names the largest flourishing and fading, and the ancient coasts follow the sea. The layer says plainly that it is the record of mapped states: many peoples, among them Aboriginal and Torres Strait Islander nations, never appear as borders. Build with node scripts/history/cliopatria.mjs (1 request; --dry-run shows it).
Where people lived (History, Life lens): a soft glow of human population density from HYDE 3.2.1 (CC0), coarsened to 1° and banded on a log scale (peopleLivedLayer), blended between its twenty-one time steps from 10,000 BCE to 2015. It counts everyone, borders or none, and any inhabited place keeps a quiet floor of light (PRESENCE_FLOOR), so thinly peopled land never reads as empty. Before HYDE's first step the glow is a presence footprint, lit region by region from widely published first-arrival dates (ARRIVALS, arrivalRegion, presenceWords in history.ts: Sahul about 65,000 years ago, the Americas about 21,000; the earliest dates are debated and the words say so). Build with node scripts/history/hyde-dans.mjs (23 byte-range requests) then node scripts/history/hyde.mjs.
Deep time (parked): the longer reach back, to the moving continents, is a stub until there is good tectonic modelling data. Its pieces stay in the core for then: the log scale and its sky-cycle marks (deep-time.ts), the great year and the pole stars (cycles.ts).
Deep time by the sky's cycles (parked with Deep time): the Deep time scale is marked by astronomical cycles, not events (src/core/cycles.ts): the great year (the axis's wobble, about 25,800 years), with Thuban's time at the pole and half a great year as quiet marks; the tilt's nod and the orbit's ice-age rhythm (the Milankovitch cycles); and the galactic year. Between the marks, greatYearWords says how far round the great year has turned and which bright star stood at the pole (Thuban as the pyramids rose, Vega near it half a great year back), from the pole turned steadily round the ecliptic pole at today's tilt: close for tens of thousands of years, a sketch beyond.
Calendars of the world (Wheel lens, words only): the Western tropical zodiac (the sun's sign, named as a tradition of astrology, not a forecast) and the Chinese calendar (the year's element and animal, turning at Chinese New Year, found as the second new moon after the winter solstice; and the twenty-four solar terms), in src/core/calendars.ts. Local and Indigenous seasonal calendars are not computed or copied; they come only from their custodians, in partnership.
Look up (Wheel lens, words only): a gentle invitation when the sky has something worth going out for, near now and visible from where you are (lookUp in src/core/sky-events.ts): the major meteor showers at their peaks (timed by the sun's longitude, offered where the radiant rises), eclipses from NASA's catalogue (a lunar eclipse only where the moon is up), and two bright planets meeting in the sky, computed from JPL's elements. It shows on the face and in Hearts Now. Build with node scripts/sky/events.mjs (5 requests; --dry-run lists them).
Stand anywhere: tap a place on the globe for its name and light, then "Stand here": the face, your day line, the slider tracks and the pop-ups all speak for that place, and a "Here" card gathers everything happening on the ground there. "Back to me" (the Face me button) returns home. Chosen places are rounded to about ten kilometres and named through Mapbox; the viewer's real location is never sent anywhere.
The weather here: a place card and the Here card also say the weather now, in words ("Light rain. Cool, with a gentle breeze from the south."), from MET Norway through a cached function (api/weather.ts, words in src/core/weather.ts). Granular on purpose: one chosen place at a time, never a layer over the globe. It has its own switch in Weather and ice, and since it draws nothing it speaks whenever that switch is on.
Add what you notice: every place card and the Here card have "Add what you notice": a short form (what it was, what exactly, how much rain, the day, a few words, a name for credit if you like, CC BY or CC0, and "Share this note"). The note appears on the globe and in the Here card's "Noticed nearby", with its credit. On this site notes stay in your browser.
Guide and hover: the Guide button opens a panel explaining every element, grouped by lens, with its colour, what it shows and where it comes from (site/src/guide.ts). Hover over the globe (or tap, on a touch screen) and a small pop-up says what is under the pointer at that exact place, worked out from the same maths that draws it: the hour band and where the sun stands there, twilight, the moon or sun overhead, the lines, and whichever life, Earth and ice layers are on (site/src/hover.ts).
Accessibility: the face is read by its light, so it speaks. A polite live region describes the light in sentences ("Late afternoon. The sun is low to the west. Early spring, and the days are growing longer. A first quarter moon, high in the east."). The sliders carry the same words as their values. Reduced motion stops the sun's breathing and the camera's easing.
Location is never asked for on arrival. If the browser has already been given permission it is used quietly; otherwise the clock stands in the Northern Rivers until you press "Face me". It is rounded to about ten kilometres and never leaves the page.
A switch in the Layers panel, labelled only "Flat model", swaps the globe for the common flat Earth depiction and runs it with the same controls (the day, the year, face the sun, face me), so anyone can compare what each model predicts for their own place. There is no commentary. Off by default; standalone site only (site/src/flat/), never part of the Landscape integration.
site/src/flat/model.ts, and tested beside the globe's predictions in test/flat.test.ts.GroundTruthObservation, GroundTruthMonth in src/core/events.ts) and the switch is in the Layers panel, off and marked "to come".PartneredKnowledge) and an empty placeholder layer are in place.attachNowOnEarth from the Landscape's map load handler, with fromLandscapeRows feeding the people layer.npm run check # typecheck, import boundaries, copy rules, tests
npm run build # the package, to dist/
src/core imports nothing outside itself and touches no DOM; src/mapbox imports mapbox-gl for types only; the site imports the package by its public names.Solar position after the NOAA Global Monitoring Laboratory solar calculator and Jean Meeus, Astronomical Algorithms; lunar position after Meeus, ch. 47. Architecture notes learned from gods-eye-view (MIT): one module per layer, keys as upgrades, a data provenance file. See DATA_SOURCES.md for every dataset and its terms.
MIT licensed. Data, imagery and fonts keep their own licences.