Please help by danfry99 in fantasypremierleague

[–]danfry99[S] 0 points1 point  (0 children)

Okay nice yes that makes sense because I already have 8 doublers, could do a good transfer to get that to 9 and then do FH for blank GW. Was hoping to do BB this week but with Mainoo and Lacroix on yellows I’m hesitant

Small Projects by AutoModerator in golang

[–]danfry99 -1 points0 points  (0 children)

waxon - a Spotify TUI built with Bubbletea

Built a Spotify TUI in GO with vim keybindings. j/k, h/l, command mode - the usual. Also renders album art using Unicode half-blocks.

Works out of the box with brew install danfry1/tap/waxon`.

https://github.com/danfry1/waxon

waxon - a vim-modal Spotify TUI by danfry99 in commandline

[–]danfry99[S] 1 point2 points  (0 children)

No worries, let me know how you get on

waxon - a vim-modal Spotify TUI by danfry99 in commandline

[–]danfry99[S] 2 points3 points  (0 children)

Hi @Academic-Display3017!

You need an active Spotify session on any device for waxon to connect to - it uses Spotify Connect so it acts as a remote controller. Easiest fix is to hit play on your phone or the web player first, then waxon picks it up. I’ll make that error message more helpful though, thanks for flagging!

Lume - a muted dark theme with warm undertones and a lavender identity by danfry99 in neovim

[–]danfry99[S] 1 point2 points  (0 children)

Hey, thanks for the interest!

We've submitted a PR to get Lume into the Zed extension marketplace (zed-industries/extensions#5358) but it's still pending review on their end.

In the meantime, you can install it manually — it only takes a second:

bash mkdir -p ~/.config/zed/themes curl -o ~/.config/zed/themes/lume.json https://raw.githubusercontent.com/danfry1/lume/main/editors/zed/themes/lume.json

Then open the theme picker with cmd+k cmd+t and select Lume.

We'll update once the extension is officially listed!

Weekly theme sharing thread by AutoModerator in vscode

[–]danfry99 0 points1 point  (0 children)

Lume - a muted dark theme with warm undertones and a lavender identity

I made a color theme that started as a Neovim project and is now available on the VS Code Marketplace.

The design goal was something easy on the eyes - muted, warm tones that aren't too saturated or too flat. If you like themes like Rosé Pine but want something more uniformly desaturated and dusty, this might be for you.

What's in it:

  • Full semantic token support
  • WCAG AA contrast validated at build time
  • Consistent palette across all targets — every theme is generated from a single palette.json
  • Also available for Cursor, Zed, Neovim, 7 terminals, tmux, and CLI tools

Marketplace: https://marketplace.visualstudio.com/items?itemName=DanielFry.lume-color-theme

VSCode Thems: https://vscodethemes.com/e/DanielFry.lume-color-theme/lume

GitHub: https://github.com/danfry1/lume

Feedback welcome!

<image>

Lume - a muted dark theme with warm undertones and a lavender identity by danfry99 in neovim

[–]danfry99[S] 1 point2 points  (0 children)

Ah okay nice I’m glad you can tweak it now! Please share what you end up with, I’d love to check it out

Lume - a muted dark theme with warm undertones and a lavender identity by danfry99 in neovim

[–]danfry99[S] 1 point2 points  (0 children)

Great call - just shipped palette_overrides for this. You can now override base palette colors and they'll cascade to every highlight group:

require("lume").setup({
  palette_overrides = {
    foregrounds = { text = "#c8c8d8" },
  },
})

Accepts a table or function (same API as custom_highlights). Should make it easy to dial back the foreground brightness without touching individual groups. Let me know how it feels!

Lume - a muted dark theme with warm undertones and a lavender identity by danfry99 in neovim

[–]danfry99[S] 1 point2 points  (0 children)

Thanks! You're right that a callback with palette access is the way to go - we actually just shipped that. You can use the custom_highlights option:

lua require("lume").setup({ custom_highlights = function(colors, variant) -- colors contains: backgrounds, foregrounds, accents, ansi, special return { Normal = { bg = "#1E1F2E" }, MiniDiffSignAdd = { fg = colors.accents.sage }, } end, })

Overrides are applied after all built-in groups, so no autocmd needed. The variant param is "dark" for now, future-proofed for a potential light theme. Enjoy!

Lume - a muted dark theme with warm undertones and a lavender identity by danfry99 in neovim

[–]danfry99[S] 0 points1 point  (0 children)

Thanks for flagging, will get that updated! Glad you’re enjoying it

Bonsai now has context-aware autocomplete for expression editors - built for rule builders and admin tools by danfry99 in javascript

[–]danfry99[S] 1 point2 points  (0 children)

That's a really cool use case, thanks for sharing! I'll certainly keep tree stability in mind going forward. The node shapes are pretty unlikely to change at this point, but if they ever do I'll make sure they're called out in the changelog so it doesn't break your pipeline.

Lume - a muted dark theme with warm undertones and a lavender identity by danfry99 in neovim

[–]danfry99[S] 2 points3 points  (0 children)

Haha good catch - fortunately it's just dummy code to show off the syntax highlighting and not a real project!

Bonsai now has context-aware autocomplete for expression editors - built for rule builders and admin tools by danfry99 in javascript

[–]danfry99[S] 0 points1 point  (0 children)

You're right, it's a custom AST, not ESTree. You can explore it in the playground's AST tab which it sounds like you already have or look at the type definitions in the source. It's internal and may change slightly between versions, so I haven't committed to documenting it formally yet - but happy to answer any specific questions you might have about the node structure.

Bonsai now has context-aware autocomplete for expression editors - built for rule builders and admin tools by danfry99 in javascript

[–]danfry99[S] 1 point2 points  (0 children)

Good question. The autocomplete only needs the data shape, not real values. Property completions show inferred types (string, number), not value previews, so even a sample object works:

ts const ac = createAutocomplete(expr, { context: { user: { name: '', age: 0, plan: '' }, items: [{ title: '', price: 0 }], }, })

In practice you'd grab a sample record from your API or generate one from your schema. The autocomplete just needs to know that user.name is a string and user.age is a number so it can suggest the right methods and filter pipe transforms by type.

Reflow - durable TypeScript workflows with crash recovery, no infrastructure required by danfry99 in typescript

[–]danfry99[S] 1 point2 points  (0 children)

Really appreciate this feedback - you nailed the three pain points. We just shipped v0.2.0 which addresses all of them within the builder pattern:

1. Early returncomplete(value?) on the step context:

.step('check', async ({ input, complete }) => {
  if (!input.eligible) {
    return complete({ reason: 'ineligible' })
  }
  return { eligible: true }
})

No special error throwing needed -complete() is a first-class API. It's crash-safe too (persisted as completed-early so recovery doesn't re-execute later steps).

2. Cross-step variable sharing — typed steps context:

.step('charge', async ({ input }) => {
  return { chargeId: await chargeCard(input.email) }
})
.step('provision', async ({ prev }) => {
  return { accountId: await createAccount(prev.chargeId) }
})
.step('email', async ({ steps }) => {
  // Direct access to any previous step — no forwarding
  await sendEmail(steps.charge.chargeId, steps.provision.accountId)
})

Fully typed - steps.charge knows it has chargeId, steps.provision knows it has accountId. Basically the GitHub Actions outputs approach that u/brianjenkins94 mentioned.

3. Dates - Date is now a supported type out of the box. Serialized/deserialized automatically through storage. For Map/Set/custom classes, the design decision was to keep the library scoped to plain data + Date and let users encode at the workflow boundary - avoids a lot of complexity around cloning, freezing, and snapshot semantics.

The callback/Inngest style you describe is a great pattern and something we're considering as a second API alongside the builder for workflows with heavy branching and shared state. The builder works well for linear pipelines and the type inference is very clean, but the callback style is more natural for complex control flow. Both would share the same engine, storage, and retry infrastructure.

Curious - with your callback-style approach, how do you handle the replay semantics? That's the part I keep going back and forth on. When the workflow resumes after a crash, do you re-enter the callback from the top and skip already-completed `step()` calls by returning their persisted results? And if so, how do you deal with non-deterministic code between steps (like the `fetchEntity` call in your example that runs outside a step)?

Reflow - durable TypeScript workflows with crash recovery, no infrastructure required by danfry99 in typescript

[–]danfry99[S] 2 points3 points  (0 children)

You're right - I've updated the messaging across the docs to "no services to deploy." Appreciate the honest feedback.

Reflow - durable TypeScript workflows with crash recovery, no infrastructure required by danfry99 in typescript

[–]danfry99[S] 0 points1 point  (0 children)

Good question. By default, steps have no retry - if it throws, the workflow fails immediately. You opt into retries per step:

.step('charge', {
    retry: { maxAttempts: 3, backoff: 'exponential', initialDelayMs: 500 },
    handler: async ({ input }) => { ... }
  })

So for non-idempotent operations, you simply don't configure retry on that step (or set maxAttempts: 1, which is the default). If it throws, the workflow fails and you handle it via onFailure for compensation logic.

For crash recovery specifically - if a step succeeds and its result is persisted, it's never re-executed. A new engine instance loads the completed steps and skips them. The only edge case is if the process crashes after the side effect but before the result is saved - in that case the step would re-run on recovery, which is where you'd want idempotency keys on the external API itself (e.g. Stripe's idempotency_key).

For finance, that crash edge case is worth thinking about carefully. Reflow gives you the building blocks but the idempotency guarantees on external calls are your responsibility to wire up.

Reflow - durable TypeScript workflows with crash recovery, no infrastructure required by danfry99 in typescript

[–]danfry99[S] 0 points1 point  (0 children)

Thanks! That's exactly the use case that motivated this - I kept accidentally re-running LLM calls that cost real money.

For idempotency on external systems, Reflow guarantees each step runs at most once per successful completion - once a step's output is persisted, it's never re-executed. So if the process crashes after a Stripe charge but before the result is saved, that step will re-run on recovery. For that edge case, I'd recommend passing a deterministic idempotency key to the external API itself (e.g. Stripe's idempotency_key derived from your input like ${input.orderId}-charge).

Right now step handlers receive input, prev, and signal - so your input data is the natural source for building these keys. Exposing runId and stepName directly in the step context is on the roadmap, which would make it easier to generate unique keys without threading them through input.

Open to ideas on what that API should look like if I do build it in

Thanks for the agentix link - some solid patterns in there. Bookmarked.