- 01It started with “too many apps to open”
- 02I decided on an order for gathering information
- 03My criteria for “needs a reply”
- 04Splitting information into two groups
- 05I’m careful about how things are phrased
- 06Making the day’s shape visible at a glance
- 07Making sure the display never breaks
- 08What I noticed after building this
- 09Who this is for
- 10Wrap-up
Good morning, it’s まさきん.
Mornings are quietly busy: checking the schedule, checking email, checking whether any chat replies slipped through. Squeezing that in while getting ready means the information is scattered across too many places.
So I built a system that has AI pull together the day’s schedule and anything that needs a reply, and generates it as a single briefing automatically. Here’s how I gather the information, plus the tricks for keeping the layout looking right every time.
It started with “too many apps to open”
Calendar, email, chat. Just opening each app separately to check them eats up the first few minutes of the morning. On top of that, things worth seeing and things that aren’t are all mixed together.
So I built a system that crosses all these apps and pulls only “what I actually need to look at today” into one place. It’s generated as a single HTML file.
I decided on an order for gathering information
When you have multiple sources, the order you tackle them in changes the quality of the result. So I gather information in this priority order.
- Calendar: Fetch today’s schedule, from midnight to midnight, in one pass first
- Email: Threads where I’ve been asked something by name and haven’t replied yet
- Chat: Mentions or DMs directed at me from roughly the last two days that I haven’t reacted to yet
- Tomorrow’s prep: If I’m listed as the organizer for tomorrow’s schedule, search for related keywords and check whether there’s anything I need to prepare
I put calendar first because it’s the coarsest-grained and easiest to work with. Building the overall skeleton first, then filling in details from email and chat, seems to keep the information from sprawling.
My criteria for “needs a reply”
Email and chat generate a lot of notifications, but only a fraction actually need action. So I filter using these criteria.
- Something I’ve been asked by name, and haven’t replied to yet
- Group messages that only need one person to answer are excluded
- Anything already acknowledged with an emoji reaction is treated as handled and excluded
If I pulled in group messages too, the briefing would be full of notifications that don’t actually need a response. Narrowing it down to “things that stall if I don’t move” keeps the amount of information in the briefing reasonable. For anything ambiguous, I open the actual thread and check whether my reply is already in there before deciding.
This whole judgment process assumes a working connection, of course. If the signal is unstable, I might miss new messages entirely. Building this made me realize just how much I’ve been quietly relying on a stable connection.
Clicking this opens the Rakuten login page. Once you log in, you’ll see the campaign details.
Splitting information into two groups
Whatever gets picked up is sorted into one of two groups.
| Group | Contents |
|---|---|
| Needs action | Things that will keep someone waiting if I don’t respond today |
| Recently resolved | Things I was worried about that turned out to already be settled |
When I list only the “needs action” items, it’s surprisingly short. I also deliberately include “recently resolved” items. Just seeing that something I was worried about is already handled changes the mood of the morning.
On days with nothing to report, I don’t force content into the space. I just show one line: “Nothing needs your attention today.” Trying to fill an empty section tends to make the content feel dishonest.
I’m careful about how things are phrased
I try to keep the briefing’s wording from sounding like instructions. Instead of “please respond to this,” I just state the fact: “this is the situation.”
I also avoid apologetic phrasing. Instead of “there wasn’t much to report,” I go with something like “it’s a quiet day” — stating the situation as-is. Not mixing in evaluative or urgent-sounding language feels like a condition for being able to read this every morning without stress.
Making the day’s shape visible at a glance
Beyond the text, I also represent how packed the day’s schedule is using something like an SVG line graph. The line goes higher during time blocks packed with meetings, and stays flat during open time.
Without reading a single word, glancing at whether the line is high or low gives you a rough sense of the load. On busy days especially, this kind of intuitive information sinks in faster than text. I keep the graph as simple as possible, and avoid exaggerating the peaks beyond how packed the schedule actually is.
Making sure the display never breaks
Since this is generated fresh as a single HTML file every morning, loading fonts or images from external sources risks a broken layout depending on network conditions. So I do the following.
- Embed the heading font directly inside the file as Base64, so it displays with no external network calls
- Use whatever font is already built into the device for everything else
On top of that, right after generation, I take a screenshot of how it actually renders in a browser. It’s a simple setup: a headless browser opens the file automatically, saves it as an image, and I check it visually.
node -e "const {chromium} = require('playwright');
(async () => {
const b = await chromium.launch();
const p = await b.newPage({viewport: {width: 960, height: 1400}});
await p.goto('file:///path/to/generated.html');
await p.screenshot({path: 'check.png', fullPage: true});
await b.close();
})();"
Being able to check it with my own eyes right after generation prevents the kind of accident where the layout is broken and I go through the whole day without noticing.
What I noticed after building this
The biggest change is that I no longer have to open a bunch of apps in the morning. One glance tells me what to keep in mind for the day.
It’s generated automatically at a fixed time on weekdays, so I don’t even need to remember when to check it. I think this “automatically ready at a fixed time” design is exactly what makes it easy to turn into a habit.
Who this is for
- Anyone whose mornings get eaten up checking multiple apps for information
- Anyone who gets a lot of notifications but wants to identify which ones actually need action
- Anyone who doesn’t mind implementation work like HTML generation or headless-browser checks
Wrap-up
I built a system that has AI pull my schedule and messages together across sources and prepares them as a single briefing every morning. It turns out the real crux wasn’t gathering the information — it was the judgment call of “narrowing it down to only what needs to be seen” and the craft of “making sure it opens looking the same way every time.”
This whole system only works because there’s a connection I can take for granted every morning. Building this briefing turned out to be a good excuse to take a closer look at my own connection, too.
Clicking this opens the Rakuten login page. Once you log in, you’ll see the campaign details.
This article contains affiliate advertising. If you sign up for a product or service through a link on this site, we may receive compensation from the partner company. The site operator is also an employee of Rakuten Group and may receive compensation through an employee referral program. The content and opinions here are based on the operator’s own experience and research regardless of any advertising relationship, but please read with the above in mind. See the Disclaimer & Affiliate Disclosure for details. Disclaimer & Affiliate Disclosure
This article includes machine-translated content. Please check the official Rakuten Mobile multilingual page for exact terms.
If you have concerns about Rakuten Mobile coverage or signal quality, you can consult through the official signal improvement request form .