APP REVIEW — Memex by Charlotte (lincharlotte)
LOADED_SRC URL
https://producingtechnology.com/65-apps/lincharlotte_183417_15200439_memex.html
BEHAVIOR SUMMARY
-
Boot sequence: A loading screen ("Fetching your second brain…") appears
with a fake animated progress bar for 1.8 seconds, then fades into the main app. In the
background the app attempts a
fetch() from an external JSON URL; on failure
(CORS or 404) it silently falls back to 2 hardcoded notes.
-
Four views via sidebar: Dashboard, Notes, Graph, and Settings — each
with a fade-in animation. The sidebar highlights the active view with a left-border accent.
-
Dashboard: Shows a greeting, three stat counters (notes, connections,
tags), an optional Daily Review banner, and a hardcoded AI Suggestions card with 3 static
recommendation strings.
-
Notes: A 2-column grid of note cards with title, body preview, tags, and
date. A search input filters by title, body, or tag in real time. A "+ New Note" modal
accepts title, body, tags, and an optional source.
-
Graph: A canvas-rendered knowledge graph drawing nodes (notes) and
weighted edges (connections) with labels and a glow effect. A legend lists node titles
below the canvas.
-
Settings: Toggles for AI Suggestions and Daily Review, a time picker
for review time, and read-only account fields. A "Save Changes" button updates the
in-memory state and shows a brief "Saved ✓" confirmation.
THINGS THAT DIDN'T WORK AS EXPECTED
-
Graph references a non-existent note: The embedded data includes
n_004 in graph.nodes and graph.edges, but no
note with that ID exists in the notes array. The orphan node renders on
the canvas labeled with its raw ID instead of a title, and clicking it does nothing.
-
AI suggestions are hardcoded strings: The three suggestions on the
Dashboard are static text written for the 2 embedded notes about black holes and entropy.
They don't reflect the actual notes in the loaded JSON and would look wrong with any
other dataset.
-
Graph layout randomizes on every visit: Node positions use
Math.random() for variance, so switching to the Graph view re-draws nodes
in slightly different positions each time. The layout is unstable.
-
No note deletion or connection editing: Notes can be added via the modal
but not removed. The "+ New Note" form has no field for connections — there is no way to
link a new note to an existing one through the UI.
-
Settings are not persisted: "Save Changes" updates the runtime object
but nothing is written to
localStorage. Refreshing the page resets all
toggles and the review time to their JSON defaults.
-
Greeting is always "Good morning": The dashboard greeting is a static
string — no time-of-day logic. It says "Good morning" at midnight.
-
Tag colors only cover 3 predefined tags: CSS rules exist for
.tag.physics, .tag.cosmology, and .tag.philosophy.
Any other tag a user types (e.g., "ideas", "history") renders unstyled in the default muted grey.
IMPROVEMENT PROMPT
You are improving a single-file HTML/CSS/JS knowledge management app called "Memex."
It loads notes from a remote JSON URL (with a hardcoded fallback), renders them in a dark
sidebar-based UI with Dashboard / Notes / Graph / Settings views, and supports adding notes
via a modal. Do not change the visual design.
1. FIX the orphan graph node:
- Before rendering the graph, filter graph.nodes to only IDs that exist in appData.notes.
- Also filter graph.edges to remove any edge where from or to is not in the filtered node list.
2. MAKE AI suggestions dynamic:
- Replace the 3 hardcoded suggestion strings with logic that reads appData.notes at render time.
- Generate suggestions like: "You have X notes tagged [most common tag] — consider a hub note."
and "Notes '[titleA]' and '[titleB]' share tags — they may be connected." Use simple
string operations, no external API needed.
3. FIX graph layout stability:
- Remove the Math.random() variance from node positioning. Use a deterministic layout:
evenly space nodes in a circle based solely on index and total count.
- Store computed positions in a module-level object so re-renders don't shift nodes.
4. ADD note deletion:
- Add a small "×" delete button to each note card (visible on hover).
- Clicking it removes the note from appData.notes, removes it from appData.graph.nodes,
removes any edges referencing it, updates the stats counters, and re-renders the notes
grid and graph.
5. ADD a connections field to the New Note modal:
- Add a multi-select or comma-separated input labeled "Connect to (note IDs or titles)".
- On save, resolve the input to matching note IDs and populate the new note's connections[].
6. PERSIST settings to localStorage:
- In saveSettings(), after updating appData.settings, call
localStorage.setItem('memex_settings', JSON.stringify(appData.settings)).
- On initApp(), check localStorage for saved settings and merge them over the JSON defaults
before applying to the UI.
7. FIX the greeting:
- Replace the static "Good morning" with a time-based function identical to the one used
in the daily planner pattern: h < 12 → "Good morning", h < 17 → "Good afternoon",
else "Good evening".
8. ADD dynamic tag colors:
- Remove the 3 hardcoded tag CSS classes.
- In renderNotes(), assign each unique tag a color from a fixed palette array using its
index in the sorted unique-tags list. Apply the color as an inline border-color and
color style on the tag span element.