APP REVIEW — Memex by Charlotte (lincharlotte)

LOADED_SRC URL

https://producingtechnology.com/65-apps/lincharlotte_183417_15200439_memex.html

BEHAVIOR SUMMARY

THINGS THAT DIDN'T WORK AS EXPECTED

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.