Join the Webstudio community

Updated 3 weeks ago

Conditional "show" item based on local storage

Is there a way to access cookies or local storage items within an expression tied to the "show" toggle?

Here's what I would like to be able to do:
system.localStorage.isLoggedIn === "true"

If there's a better way, I'm open to ideas.
O
J
33 comments
not at the moment, localStorage is purely client-side api, where expressions are universally running everywhere
need to start with the use case to see if it can be done and how
My use case:
I've got user authentication login/logout working using Appwrite in WS. I'm trying to "show" the "logout" button with an expression.
I've created a data variable, "getAccount," that connects to my users account. I've tried using that in my expression to show/hide the logout button. In the attached images, you can see the logout button changes but this isn't reflected on the front-end when I log in.
basically login/logout depending on the state?
Here is what we do for example on our landing. This allows us to swap the text from "Start for free" to "Dashboard"
Plain Text
<!-- Swap the "Sign in" if visitor has clicked before. -->
<script type="module">
  document.body.addEventListener('click', (event) => {
    const link = event.target.closest('a');
    if (link) {
      const href = link.getAttribute('href');
      if (href && href.includes('/dashboard')) {
        try {
          localStorage.setItem('__webstudio__logged_in_before', true);
        } catch {}
      }
    }
  }, {passive: true, capture: true});

  requestAnimationFrame(() => {
    try {
      const loggedInBefore = localStorage.getItem('__webstudio__logged_in_before')
      if (loggedInBefore) {
        const element = document.querySelector(".sign-in");
        element.textContent = element.dataset.signedInText;
      }
    } catch(error) {
      console.error(error);
    }  
  }) 
</script>
@Oleg Isonen, just to confirm—your snippet is mainly for swapping the button text dynamically, right? If I wanted to show/hide a section on the page based on authentication (like an authenticated-only section), I’d need to use JS to remove it manually, rather than relying on the “Show” toggle with an expression?

Also, this method wouldn’t work for restricting access to an entire page for unauthenticated users, correct? I’d need another approach for that.
yes, because toggle show works with expressions and expressions can't access local storage
if your content is fetched using Resource - then it would technically still fetch it if user disables javascript, so its not fully secure.

problem is that you authenticate on the client but resource knows nothing about it

We need to work on this very soon.

For now there are only options:
  1. Pseudo-secure, using js to disallow accessing restricted area. Ok for not sensitive data
  2. Secure but 100% client-side: auth and data fetching. Rendering is tricky that way, more like a hack, but not impossible
Actually there is a secure method right now, but that would require a backend:

  1. client-side auth
  2. token passed to resource via url query param
  3. backend validates the token and provides a response
Search for "webtoken"
Thank you @Oleg Isonen! I can write an appwrite function to handle client-side auth. I will try this out and post any progress in this discussion.

Your couple of replies has got me further than hours of me using AI.
Hi, Oleg. I'm missing part of the puzzle. Can you correct me if I'm thinking of this wrong?

  1. I wrote a Appwrite function to
I was able to send/receive JWT using my backend function, but I'm not exactly sure what you mean with "token passed to resource via url query param". Should I be using a Webstudio form element and then the {system.params} from it?
well your resourece needs to pass the token from the client to your backend
the easierst way would be to use query parameter and add it in your request
how it gets into query param is potentially multiple ways
you could use a form with a hidden input or you could just set it with js
"how it gets into query param is potentially multiple ways" - is there a "best practices" or recommended preference?
well if form works for you that would be probably ideal
in the end you still need to set the input value with js
I am not sure when is the point where you are getting the token
its probably after you already submitted the form
so to set it with the form you need another form I guess, in that case form isn't practical
Yeah, it's after I've submit the intial form POST. Then on page refresh it maintains the fetched item.
right so its all in js and you will need to check if the token is in the query and set it
I think you will want to do this with js
I got far after your suggestion yesterday but maxed out my AI prompting skills and kept getting into AI loops.

I saved a state where I could login/out (when published) and it would record my session in the backend and return the tokens. I'll go back to that state and try again with this extra info that you've given, thanks.
what are you using?
I've been using 3. Claude, GPT and a combo within Windsurf.

I find my best results come when I create a repo with document files and rules it can reference. It's also helpful to save versions of the code changes so I can go back if needed.
this is good yes
gpt for advanced planing questions, claude for specific code if gpt doesn't do well
Add a reply
Sign up and join the conversation on Discord
","upvoteCount":0,"dateCreated":"2025-02-11T02:27:18.477Z","datePublished":"2025-02-11T02:27:18.477Z","dateModified":"2025-02-11T02:27:18.477Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#9b847c60-1f82-438e-bc50-a2c38f72499c","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}},{"@type":"Answer","text":"@Oleg Isonen, just to confirm—your snippet is mainly for swapping the button text dynamically, right? If I wanted to show/hide a section on the page based on authentication (like an authenticated-only section), I’d need to use JS to remove it manually, rather than relying on the “Show” toggle with an expression?Also, this method wouldn’t work for restricting access to an entire page for unauthenticated users, correct? I’d need another approach for that.","upvoteCount":0,"dateCreated":"2025-02-11T16:21:48.331Z","datePublished":"2025-02-11T16:21:48.331Z","dateModified":"2025-02-11T16:21:48.331Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#8425e69d-3976-4757-b37c-da0a5756c7c8","author":{"@type":"Person","url":"https://help.webstudio.is/members/6c66325d-fff8-43a2-b97e-549275813461","name":"Jeremy","identifier":"6c66325d-fff8-43a2-b97e-549275813461","image":"https://cdn.discordapp.com/avatars/383871071566430208/6de448190b31c7a9af49e5fbd4f5d047.webp?size=256"}},{"@type":"Answer","text":"yes, because toggle show works with expressions and expressions can't access local storage","upvoteCount":0,"dateCreated":"2025-02-11T16:22:56.730Z","datePublished":"2025-02-11T16:22:56.730Z","dateModified":"2025-02-11T16:22:56.730Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#f618778e-e42b-4ae0-9cc9-1eefcc189d80","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}},{"@type":"Answer","text":"if your content is fetched using Resource - then it would technically still fetch it if user disables javascript, so its not fully secure.problem is that you authenticate on the client but resource knows nothing about itWe need to work on this very soon.For now there are only options:Pseudo-secure, using js to disallow accessing restricted area. Ok for not sensitive dataSecure but 100% client-side: auth and data fetching. Rendering is tricky that way, more like a hack, but not impossible","upvoteCount":0,"dateCreated":"2025-02-11T16:24:58.839Z","datePublished":"2025-02-11T16:24:58.839Z","dateModified":"2025-02-11T16:24:58.839Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#70a6e90a-0e5a-437e-ae66-bd54a831e65a","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}},{"@type":"Answer","text":"Actually there is a secure method right now, but that would require a backend:client-side authtoken passed to resource via url query parambackend validates the token and provides a response","upvoteCount":0,"dateCreated":"2025-02-11T16:28:49.128Z","datePublished":"2025-02-11T16:28:49.128Z","dateModified":"2025-02-11T16:28:49.128Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#2294e144-813f-48e0-8057-9274defb54a5","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}},{"@type":"Answer","text":"Search for \"webtoken\"","upvoteCount":0,"dateCreated":"2025-02-11T16:29:25.431Z","datePublished":"2025-02-11T16:29:25.431Z","dateModified":"2025-02-11T16:29:25.431Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#d0e700ec-7c01-4397-bce9-52c153da9446","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}},{"@type":"Answer","text":"Thank you @Oleg Isonen! I can write an appwrite function to handle client-side auth. I will try this out and post any progress in this discussion. Your couple of replies has got me further than hours of me using AI.","upvoteCount":0,"dateCreated":"2025-02-11T16:35:26.329Z","datePublished":"2025-02-11T16:35:26.329Z","dateModified":"2025-02-11T16:35:26.329Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#6a9ecbd4-1be9-4666-a8b7-26ace443a766","author":{"@type":"Person","url":"https://help.webstudio.is/members/6c66325d-fff8-43a2-b97e-549275813461","name":"Jeremy","identifier":"6c66325d-fff8-43a2-b97e-549275813461","image":"https://cdn.discordapp.com/avatars/383871071566430208/6de448190b31c7a9af49e5fbd4f5d047.webp?size=256"}},{"@type":"Answer","text":"Hi, Oleg. I'm missing part of the puzzle. Can you correct me if I'm thinking of this wrong?I wrote a Appwrite function toI was able to send/receive JWT using my backend function, but I'm not exactly sure what you mean with \"token passed to resource via url query param\". Should I be using a Webstudio form element and then the {system.params} from it?","upvoteCount":0,"dateCreated":"2025-02-13T21:19:51.811Z","datePublished":"2025-02-13T21:19:51.811Z","dateModified":"2025-02-13T21:19:51.811Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#a1fb5b91-fe52-4d30-af4f-cea6c34d4e43","author":{"@type":"Person","url":"https://help.webstudio.is/members/6c66325d-fff8-43a2-b97e-549275813461","name":"Jeremy","identifier":"6c66325d-fff8-43a2-b97e-549275813461","image":"https://cdn.discordapp.com/avatars/383871071566430208/6de448190b31c7a9af49e5fbd4f5d047.webp?size=256"}},{"@type":"Answer","text":"well your resourece needs to pass the token from the client to your backend","upvoteCount":0,"dateCreated":"2025-02-13T21:20:56.444Z","datePublished":"2025-02-13T21:20:56.444Z","dateModified":"2025-02-13T21:20:56.444Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#0008e3f9-b082-42de-9fdb-eba12a0b4bc2","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}},{"@type":"Answer","text":"the easierst way would be to use query parameter and add it in your request","upvoteCount":0,"dateCreated":"2025-02-13T21:21:12.564Z","datePublished":"2025-02-13T21:21:12.564Z","dateModified":"2025-02-13T21:21:12.564Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#3fc004eb-8cc3-4ef8-9159-5829d58c4074","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}},{"@type":"Answer","text":"how it gets into query param is potentially multiple ways","upvoteCount":0,"dateCreated":"2025-02-13T21:21:43.829Z","datePublished":"2025-02-13T21:21:43.829Z","dateModified":"2025-02-13T21:21:43.829Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#fcaebd84-af1a-4b88-a055-538015eba587","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}},{"@type":"Answer","text":"you could use a form with a hidden input or you could just set it with js","upvoteCount":0,"dateCreated":"2025-02-13T21:21:58.364Z","datePublished":"2025-02-13T21:21:58.364Z","dateModified":"2025-02-13T21:21:58.364Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#c18b1f61-81a7-4bde-b8e0-4a886a7c102c","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}},{"@type":"Answer","text":"\"how it gets into query param is potentially multiple ways\" - is there a \"best practices\" or recommended preference?","upvoteCount":0,"dateCreated":"2025-02-13T21:22:50.447Z","datePublished":"2025-02-13T21:22:50.447Z","dateModified":"2025-02-13T21:22:50.447Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#4f577a8b-4650-4903-b854-51ea73db129c","author":{"@type":"Person","url":"https://help.webstudio.is/members/6c66325d-fff8-43a2-b97e-549275813461","name":"Jeremy","identifier":"6c66325d-fff8-43a2-b97e-549275813461","image":"https://cdn.discordapp.com/avatars/383871071566430208/6de448190b31c7a9af49e5fbd4f5d047.webp?size=256"}},{"@type":"Answer","text":"well if form works for you that would be probably ideal","upvoteCount":0,"dateCreated":"2025-02-13T21:23:38.830Z","datePublished":"2025-02-13T21:23:38.830Z","dateModified":"2025-02-13T21:23:38.830Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#78890174-565a-4b65-a976-13f03feed9fe","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}},{"@type":"Answer","text":"in the end you still need to set the input value with js","upvoteCount":0,"dateCreated":"2025-02-13T21:23:58.222Z","datePublished":"2025-02-13T21:23:58.222Z","dateModified":"2025-02-13T21:23:58.222Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#6646cfa3-d75c-47b4-89ac-cbd9406719ab","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}},{"@type":"Answer","text":"I am not sure when is the point where you are getting the token","upvoteCount":0,"dateCreated":"2025-02-13T21:24:20.516Z","datePublished":"2025-02-13T21:24:20.516Z","dateModified":"2025-02-13T21:24:20.516Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#b85e526c-4a33-4d6e-9cfe-9fac9339c5d7","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}},{"@type":"Answer","text":"its probably after you already submitted the form","upvoteCount":0,"dateCreated":"2025-02-13T21:24:32.854Z","datePublished":"2025-02-13T21:24:32.854Z","dateModified":"2025-02-13T21:24:32.854Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#d2fea969-3b0f-4da6-ab3b-4e95123390c5","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}},{"@type":"Answer","text":"so to set it with the form you need another form I guess, in that case form isn't practical","upvoteCount":0,"dateCreated":"2025-02-13T21:24:48.671Z","datePublished":"2025-02-13T21:24:48.671Z","dateModified":"2025-02-13T21:24:48.671Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#a2c325e1-5a2b-4986-98ef-b571e5ee4581","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}},{"@type":"Answer","text":"Yeah, it's after I've submit the intial form POST. Then on page refresh it maintains the fetched item.","upvoteCount":0,"dateCreated":"2025-02-13T21:25:21.609Z","datePublished":"2025-02-13T21:25:21.609Z","dateModified":"2025-02-13T21:25:21.609Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#91a2b075-5318-44ea-98c6-49582e1e27ef","author":{"@type":"Person","url":"https://help.webstudio.is/members/6c66325d-fff8-43a2-b97e-549275813461","name":"Jeremy","identifier":"6c66325d-fff8-43a2-b97e-549275813461","image":"https://cdn.discordapp.com/avatars/383871071566430208/6de448190b31c7a9af49e5fbd4f5d047.webp?size=256"}},{"@type":"Answer","text":"right so its all in js and you will need to check if the token is in the query and set it","upvoteCount":0,"dateCreated":"2025-02-13T21:26:27.212Z","datePublished":"2025-02-13T21:26:27.212Z","dateModified":"2025-02-13T21:26:30.130Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#554e46aa-97ae-40b0-acb7-77fc63295722","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}},{"@type":"Answer","text":"I think you will want to do this with js","upvoteCount":0,"dateCreated":"2025-02-13T21:26:35.426Z","datePublished":"2025-02-13T21:26:35.426Z","dateModified":"2025-02-13T21:26:35.426Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#026b3e4a-b956-414b-97c2-9705e5994bf3","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}},{"@type":"Answer","text":"but not sure","upvoteCount":0,"dateCreated":"2025-02-13T21:26:37.519Z","datePublished":"2025-02-13T21:26:37.519Z","dateModified":"2025-02-13T21:26:37.519Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#26a36a50-d346-4a5d-9fc7-e4188113a8e9","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}},{"@type":"Answer","text":"I got far after your suggestion yesterday but maxed out my AI prompting skills and kept getting into AI loops. I saved a state where I could login/out (when published) and it would record my session in the backend and return the tokens. I'll go back to that state and try again with this extra info that you've given, thanks.","upvoteCount":0,"dateCreated":"2025-02-13T21:30:13.607Z","datePublished":"2025-02-13T21:30:13.607Z","dateModified":"2025-02-13T21:30:13.607Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#b6b82132-3c94-414e-986b-36b17d03e743","author":{"@type":"Person","url":"https://help.webstudio.is/members/6c66325d-fff8-43a2-b97e-549275813461","name":"Jeremy","identifier":"6c66325d-fff8-43a2-b97e-549275813461","image":"https://cdn.discordapp.com/avatars/383871071566430208/6de448190b31c7a9af49e5fbd4f5d047.webp?size=256"}},{"@type":"Answer","text":"what are you using?","upvoteCount":0,"dateCreated":"2025-02-13T21:35:14.069Z","datePublished":"2025-02-13T21:35:14.069Z","dateModified":"2025-02-13T21:35:14.069Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#82c01a3c-642f-413f-ac6e-2e3d1b2b9bc4","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}},{"@type":"Answer","text":"which ai","upvoteCount":0,"dateCreated":"2025-02-13T21:35:16.124Z","datePublished":"2025-02-13T21:35:16.124Z","dateModified":"2025-02-13T21:35:16.124Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#618b91d7-71ef-4924-8c48-693fecc5d9d9","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}},{"@type":"Answer","text":"I've been using 3. Claude, GPT and a combo within Windsurf. I find my best results come when I create a repo with document files and rules it can reference. It's also helpful to save versions of the code changes so I can go back if needed.","upvoteCount":0,"dateCreated":"2025-02-13T21:58:17.159Z","datePublished":"2025-02-13T21:58:17.159Z","dateModified":"2025-02-13T21:58:17.159Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#bc914758-d6e2-4f37-adcc-3001462065ca","author":{"@type":"Person","url":"https://help.webstudio.is/members/6c66325d-fff8-43a2-b97e-549275813461","name":"Jeremy","identifier":"6c66325d-fff8-43a2-b97e-549275813461","image":"https://cdn.discordapp.com/avatars/383871071566430208/6de448190b31c7a9af49e5fbd4f5d047.webp?size=256"}},{"@type":"Answer","text":"this is good yes","upvoteCount":0,"dateCreated":"2025-02-13T22:13:30.599Z","datePublished":"2025-02-13T22:13:30.599Z","dateModified":"2025-02-13T22:13:30.599Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#c03818a5-6fa3-4be7-b730-16fe2588c048","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}},{"@type":"Answer","text":"gpt for advanced planing questions, claude for specific code if gpt doesn't do well","upvoteCount":0,"dateCreated":"2025-02-13T22:13:53.761Z","datePublished":"2025-02-13T22:13:53.761Z","dateModified":"2025-02-13T22:13:53.761Z","url":"https://help.webstudio.is/conditional-show-item-based-on-local-storage-XlRgW5KBjrsy#cf203086-55a9-4dc2-8af6-307d9af28146","author":{"@type":"Person","url":"https://help.webstudio.is/members/cdd3ed87-53a0-414a-885a-56b7939e412a","name":"Oleg Isonen","identifier":"cdd3ed87-53a0-414a-885a-56b7939e412a","image":"https://cdn.discordapp.com/avatars/469405813048606720/8b66a5882214c63ee6148fcce3ef8e93.webp?size=256"}}]}}