Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added src/assets/hero/tama-dark.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/hero/tama-light.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/logos/sonae.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/works/sonae.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion src/components/Footer.astro
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ const text = t(lang);
<a href={localeUrl("/company/", lang)}>{text.nav.company}</a> ·
<a href={localeUrl("/privacy/", lang)}>{text.footer.privacy}</a> ·
{text.footer.tokushoho}:
{services.map((s, i) => (<>{i > 0 && "・"}<a href={new URL("/legal", s.url).href}>{text.services[s.id].name}</a></>))} ·
{services.filter((s) => s.legal).map((s, i) => (<>{i > 0 && "・"}<a href={new URL("/legal", s.url).href}>{text.services[s.id].name}</a></>))} ·
{text.footer.copyright}
</p>
</footer>
Expand Down
5 changes: 4 additions & 1 deletion src/components/ServiceTour.astro
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
---
import BrowserFrame from "@components/BrowserFrame.astro";
import { type Lang, t } from "@i18n/translation";
import tamaDark from "@/assets/hero/tama-dark.webp";
import tamaLight from "@/assets/hero/tama-light.webp";
import todoroku from "@/assets/hero/todoroku.webp";
import worklogDark from "@/assets/hero/worklog-dark.webp";
import worklogLight from "@/assets/hero/worklog-light.webp";
Expand All @@ -10,7 +12,7 @@ import { services } from "@/config";
* トップの自社サービス。左に 1 件ずつ説明を縦に並べ、右の画面は貼り付けて重ねる。
* 巻いて次の説明に入ると、次の画面が下から来て前の画面に重なり、前の画面は少し沈む。
* 重ねるのは position: sticky、沈むのは次の説明の view-timeline で、JS は使わない。
* 狭い画面では説明の下に画面を置くだけ。worklog は選んだ明暗で画面を出し分ける
* 狭い画面では説明の下に画面を置くだけ。worklog と tama は選んだ明暗で画面を出し分ける
*/
interface Props {
lang: Lang;
Expand All @@ -28,6 +30,7 @@ const scope = services
const shots = {
todoroku: { src: todoroku, dark: undefined },
worklog: { src: worklogLight, dark: worklogDark },
tama: { src: tamaLight, dark: tamaDark },
};
---

Expand Down
5 changes: 4 additions & 1 deletion src/components/WorksSummary.astro
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import kubernetes from "@/assets/logos/kubernetes.svg";
import lgtm from "@/assets/logos/lgtm.svg";
import mado from "@/assets/logos/mado.svg";
import noren from "@/assets/logos/noren.svg";
import sonae from "@/assets/logos/sonae.png";
import talos from "@/assets/logos/talos.svg";
import xool from "@/assets/logos/xool.svg";
import yuzuriha from "@/assets/logos/yuzuriha.svg";
Expand Down Expand Up @@ -44,6 +45,7 @@ const values: Record<string, number> = {

const logos = [
{ id: "denpa", name: text.works.denpa.name, logo: { src: denpa }, href: "/works/#works" },
{ id: "sonae", name: text.works.sonae.name, logo: { src: sonae }, href: "/works/#works" },
{ id: "noren", name: text.works.noren.name, logo: { src: noren }, href: "/works/#works" },
{ id: "mado", name: text.works.mado.name, logo: { src: mado }, href: "/works/#works" },
{ id: "aizuchi", name: text.works.aizuchi.name, logo: { src: aizuchi }, href: "/works/#works" },
Expand All @@ -53,6 +55,7 @@ const logos = [
{ id: "helmMosp", name: text.works.helmMosp.name, logo: { src: helm, plate: true }, href: "/works/#works" },
{ id: "gitops", name: text.works.gitops.name, logo: { src: kubernetes, plate: true }, href: "/works/#works" },
{ id: "ffmpeg", name: text.oss.ffmpeg.name, logo: { src: ffmpeg, plate: true }, href: "/works/#oss" },
{ id: "libaribcaption", name: text.oss.libaribcaption.name, logo: undefined, href: "/works/#oss" },
{ id: "blades", name: text.oss.blades.name, logo: { src: blades, plate: true }, href: "/works/#oss" },
{ id: "talos", name: text.oss.talos.name, logo: { src: talos, plate: true }, href: "/works/#oss" },
{ id: "epgstation", name: text.oss.epgstation.name, logo: { src: epgstation, plate: true }, href: "/works/#oss" },
Expand All @@ -71,7 +74,7 @@ const logos = [
<ul class="logos">
{logos.map((l) => (
<li data-reveal>
<a href={localeUrl(l.href, lang)}><Logo src={l.logo.src} plate={l.logo.plate} />{l.name}</a>
<a href={localeUrl(l.href, lang)}>{l.logo && <Logo src={l.logo.src} plate={l.logo.plate} />}{l.name}</a>
</li>
))}
</ul>
Expand Down
25 changes: 22 additions & 3 deletions src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,14 @@ export const business = [
"services",
] as const;

/** 自社サービス(運用中のもの)。文言は languages の services */
/**
* 自社サービス(運用中のもの)。文言は languages の services。
* legal は特定商取引法に基づく表記 (サービスの /legal) があるもの (足のリンクに出す。売っていない tama には無い)
*/
export const services = [
{ id: "todoroku", url: "https://tk.doany.io/" },
{ id: "worklog", url: "https://w.doany.io/" },
{ id: "todoroku", url: "https://tk.doany.io/", legal: true },
{ id: "worklog", url: "https://w.doany.io/", legal: true },
{ id: "tama", url: "https://ts.doany.io/", legal: false },
] as const;

/** 制作実績。文言は languages の works */
Expand All @@ -57,6 +61,7 @@ export const works = [
id: "denpa",
url: "https://github.com/DAnything/denpa",
},
{ id: "sonae", url: "https://github.com/danything/sonae" },
{ id: "noren", url: "https://github.com/5ym/noren" },
{ id: "mado", url: "https://github.com/danything/mado" },
{ id: "aizuchi", url: "https://github.com/danything/aizuchi" },
Expand Down Expand Up @@ -109,6 +114,20 @@ export const oss = [
},
],
},
{
id: "libaribcaption",
merged: 2,
links: [
{
label: "xqq/libaribcaption#30",
url: "https://github.com/xqq/libaribcaption/pull/30",
},
{
label: "xqq/libaribcaption#31",
url: "https://github.com/xqq/libaribcaption/pull/31",
},
],
},
{
id: "blades",
merged: 25,
Expand Down
26 changes: 21 additions & 5 deletions src/i18n/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ export const en: Translation = {
"The Todoroku home page, showing the vehicle ledger form with the make, model and engine type filled in",
worklog:
"The worklog home page, with a sample timesheet built from Slack and GitHub logs",
tama: "A search for “Prius” in the tama vehicle catalogue: a table of 21 type designations with model name, category, years listed, displacement and fuel economy",
},

businessTitle: "What we do",
Expand Down Expand Up @@ -147,7 +148,8 @@ export const en: Translation = {
},
services: {
title: "Own services",
summary: "Todoroku for vehicle ledgers, and worklog for timesheets.",
summary:
"Todoroku for vehicle ledgers, worklog for timesheets, and tama, a vehicle catalogue.",
},
},

Expand All @@ -160,6 +162,10 @@ export const en: Translation = {
name: "worklog",
body: "Works out each day's start, end, breaks and working time from the API logs of Slack, GitHub, GitLab, Backlog, Jira, OpenProject and Redmine. There's no agent to install, and it can build timesheets for past months.",
},
tama: {
name: "tama vehicle catalogue",
body: "A catalogue of more than 20,000 vehicle type designations approved in Japan. Search by type, model name or type designation number across specifications, fuel economy, years on sale, type designations in the official gazette and recall filings. Todoroku takes its vehicle data from here too.",
},
},

worksPage: {
Expand All @@ -168,13 +174,15 @@ export const en: Translation = {
worksTitle: "Work",
source: "Source",
others:
"Smaller tools such as svelte-slider, fixeed and cash-tabelog are on GitHub ({user}, {org}).",
"Smaller tools such as wslc-compose, genkan, seisho and svelte-slider are on GitHub ({user}, {org}).",
ossTitle: "Open source contributions",
ossLead:
"Fixes for bugs found in software Doa uses, sent upstream as pull requests.",
shots: {
denpa:
"The denpa recordings list, with recordings and reservations of made-up programmes, and a month calendar and filters on the right",
sonae:
"sonae with test data: a satellite map of Japan showing coasts under a tsunami advisory and areas under weather warnings, with a list of tsunami, earthquake, earthquake early warning and weather warning reports on the right",
noren:
"The noren storefront: cards with prices for a sample download, a T-shirt picked up at the venue and an admission ticket, with the three steps of buying below",
yuzuriha:
Expand All @@ -185,15 +193,19 @@ export const en: Translation = {
works: {
denpa: {
name: "denpa",
body: "A system for recording and watching TV. It has two parts: an agent that drives the tuner and streams the raw TS, and the main app for the programme guide, reservations, recording, encoding, streaming and live viewing. No separate media server. Written in TypeScript and Svelte, with C# on the tuner side.",
body: "A home TV recording server that works as soon as you plug in a tuner and start it. There are no config files: reserve from the programme guide, CMs are skipped automatically, and live TV and recordings play in the browser with captions and data broadcasting. It has two parts, an agent that drives the tuner and streams the raw TS and the main app that does everything else, so it needs neither Mirakurun nor a media server. Runs on Linux, Mac, Windows and Kubernetes. Doa also makes an Android TV app for watching on a TV (denpa-tv) and a rounded typeface for captions and programme guides (Denpa Font).",
},
sonae: {
name: "sonae (備え)",
body: "An app that receives earthquake, tsunami, volcano and weather information on a home server, to view in the browser and get as Web Push notifications. It takes earthquake early warnings, earthquake and tsunami reports, eruption notices and weather warnings from the Japan Meteorological Agency and others, shows them on a map and in a list, and reads them out with a short chime and a VOICEVOX voice on open screens. It installs with one line on Windows, Mac and Linux, and on Kubernetes with a Helm chart.",
},
noren: {
name: "noren (暖簾)",
body: "A web app for selling at small shops and events. Downloads are emailed after payment; goods and tickets are picked up at the venue by showing a QR code. Staff get screens for scanning QR codes at pickup and entry, and for counter sales with cash or Square, and sign in with OIDC. It merges the noren download shop with mogiri, which handled QR admission, pickup and counter sales. A single Bun, SvelteKit and SQLite app.",
},
mado: {
name: "mado (窓)",
body: "A gateway for connecting to Windows over Remote Desktop from the browser, with OIDC sign-in. A TypeScript client in the browser speaks RDP, and the server only checks sign-in and relays, so it never draws the screen. The relay tries WebTransport (HTTP/3) first and falls back to WebSocket. The server is .NET 10 Native AOT, installed with an MSI and run as a Windows service.",
body: "A gateway for connecting to Windows over Remote Desktop from the browser, with OIDC sign-in. A TypeScript client in the browser speaks RDP, and the server only checks sign-in and relays, so it never draws the screen. The relay tries WebTransport (HTTP/3) first and falls back to WebSocket. The server is .NET 10 Native AOT, installed with an MSI and run as a Windows service. Intel AMT machines can also be powered on and off, reached over a serial console and booted from an ISO, all from the browser.",
},
aizuchi: {
name: "aizuchi (相槌)",
Expand All @@ -217,7 +229,7 @@ export const en: Translation = {
},
gitops: {
name: "gitops",
body: "The Kubernetes platform Doa's services run on. A Talos Linux cluster managed with Argo CD. Traffic comes in through Cilium's Gateway API, secrets are in Infisical, and k8up backs up to Cloudflare R2. Sign-in is Entra ID single sign-on, and the Cloudflare and Entra settings are in Pulumi. Matrix and Forgejo are self-hosted here too.",
body: "The Kubernetes platform Doa's services run on. A Talos Linux cluster managed with Argo CD. Traffic comes in through Cilium's Gateway API, secrets are encrypted with SOPS and kept in git, and VolSync backs up to Cloudflare R2. Sign-in is Entra ID single sign-on, and the Cloudflare and Entra settings are in Pulumi. Matrix and Forgejo are self-hosted here too.",
},
},

Expand All @@ -226,6 +238,10 @@ export const en: Translation = {
name: "FFmpeg",
body: "Fixes for the ARIB caption decoder that uses libaribcaption (caption clearing and memory errors), and a change that enables the loop filter and CDEF in the VAAPI AV1 encoder in CQP mode, have been merged.",
},
libaribcaption: {
name: "libaribcaption",
body: "A library that renders ARIB captions. Merged changes add characters found in terrestrial broadcasts, and phone, TV, radio and speaker symbols, to its table that replaces caption DRCS glyphs with ordinary characters and emoji.",
},
blades: {
name: "Blades CSS",
body: "The successor to Pico CSS. Merged changes include light-dark() colours, contrast fixes for focus rings and other parts, an opt-in compact mode, dialog and popover parts, a build on lightningcss alone that cut the dev dependencies from nine to two, layered per-part builds that are now the default exports, and examples for using it in frameworks.",
Expand Down
Loading
Loading