API v1 is retired, old timeline widgets are no-longer rendered

benward
@benward Ben Ward

Today we retired Twitter API v1.0, and with it all unauthenticated access to the Twitter API. As a result, support for our old embedded timeline widget (sometimes referred to as the ‘legacy timeline widget’, or ‘goodies widget’) has ended. This widget depended on the unauthenticated API, and we have replaced it with new embedded timelines.

The JavaScript for the old widget code has been updated with a silent stub: all public functions from the TWTR object are exposed and will silently fail, which reduce the impact on any complex script integrations, and prevent unexpected script-level errors. The widget code itself will no-longer render any content in your page. Sites using bundled copies of the widget.js may still render an empty timeline frame, but no Tweets will be displayed.

• If you still had an old widget on your site, you can find a URL to configure a replacement embedded timeline as a warning message in your browser's developer console, or visit http://twitter.com/settings/widgets to start afresh.

• A reminder that visual design adjustments beyond the default themes can be configured, be sure to see the documentation on advanced customisation of the new widget here: https://dev.twitter.com/docs/embedded-timelines#customization

• Sites that dynamically generated widgets for different lists, user accounts, or favourites timelines should also refer to the new Timeline Selection options: https://dev.twitter.com/docs/embedded-timelines#timeline-selection

• Integrations that fall outside the features or capabilities of the widgets can use API v1.1, and refer to our display guidelines for rendering Tweets.

Thank you to everyone that's given us feedback and input on the new widgets so far, all of which has helped us prioritise new features over the course of the past six months. It goes without saying that our team continues to work actively on the Twitter for Websites tools. I'm looking forward to building more ways to make it easy and accessible to do interesting things with Tweets and Twitter on the web.

Ben

13 weeks 6 hours ago

Replies

frankrose
@frankrose Frank Rose

Why eliminate the "join the conversation" widget? Why not update it to run with API v1.1? The current widget offerings are, sorry to say, pretty lame.

12 weeks 6 days ago
fundschedule
@fundschedule fundSchedule

Possible solution:
Include this after your new widget code. I commented this with the elements I took from the old API to make conversion more easy.

  1. <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
  2. <script>
  3. var hideTwitterAttempts = 0;
  4. function hideTwitterBoxElements() {
  5.     setTimeout( function() {
  6.         if ( $('[id=twitter]').length ) {
  7.         $('[id=twitter]').each( function(){
  8.             var ibody = $(this).contents().find( 'body' );
  9.  
  10.             if ( ibody.find( '.timeline .stream .h-feed li.tweet' ).length ) {
  11.             ibody.find( '.customisable-border' ).css( 'border', 0 );
  12.             ibody.find( '.timeline' ).css( 'background-color', '#004A7B' ); //theme: shell: background:
  13.             ibody.find( 'ol.h-feed' ).css( 'background-color', '#0575A1' ); //theme: tweets: background:
  14.             ibody.find( 'ol.h-feed' ).css( 'border-radius', '5px 5px 5px 5px' );
  15.             ibody.find( 'li.tweet' ).css( 'border-bottom', '1px dotted #FFFFFF' ); //theme: tweets: color:
  16.             ibody.find( 'li.tweet' ).css( 'color', '#FFFFFF' ); //theme: tweets: color:
  17.             ibody.find( '.customisable:link' ).css( 'color', '#07E0EB' ); //theme: tweets: links:
  18.             ibody.find( '.footer' ).css( 'visibility', 'hidden' ); //hide reply, retweet, favorite images
  19.             ibody.find( '.footer' ).css( 'min-height', 0 ); //hide reply, retweet, favorite images
  20.             ibody.find( '.footer' ).css( 'height', 0 ); //hide reply, retweet, favorite images
  21.             ibody.find( '.avatar' ).css( 'height', 0 ); //hide avatar
  22.             ibody.find( '.avatar' ).css( 'width', 0 ); //hide avatar
  23.             ibody.find( '.p-nickname' ).css( 'font-size', 0 ); //hide @name of tweet
  24.             ibody.find( '.p-nickname' ).css( 'visibility', 'hidden' ); //hide @name of tweet
  25.             ibody.find( '.e-entry-content' ).css( 'margin', '-25px 0px 0px 0px' ); //move tweet up (over @name of tweet)
  26.             ibody.find( '.dt-updated' ).css( 'color', '#07E0EB' ); //theme: tweets: links:
  27.             ibody.find( '.full-name' ).css( 'margin', '0px 0px 0px -35px' ); //move name of tweet to left (over avatar)
  28.             ibody.find( 'h1.summary' ).replaceWith( '<h1 class="summary"><a class="customisable-highlight" title="Tweets from YOUR_NAME" href="https://twitter.com/YOUR_NAME" style="color: #FFFFFF;">YOUR_NAME</a></h1>' ); //replace Tweets text at top
  29.             ibody.find( '.p-name' ).css( 'color', '#07E0EB' ); //theme: tweets: links:
  30.             }
  31.             else {
  32.                 $(this).hide();
  33.             }
  34.         });
  35.         }
  36.         hideTwitterAttempts++;
  37.         if ( hideTwitterAttempts < 3 ) {
  38.             hideTwitterBoxElements();
  39.         }
  40.     }, 1500);
  41. }
  42.  
  43. // somewhere in your code after html page load
  44. hideTwitterBoxElements();
  45. </script>

Original from: http://stackoverflow.com/questions/13361823/iframe-css-override-for-new-twitter-widget

8 weeks 1 day ago
c2webdev
@c2webdev Chris Christou

Hi guys, this is really helpful but I'm looking at adjusting the width and height. How can i do this? I want my tweet to be about 750 pixels wide and 30 pixels high. Is this possible in the new version.

3 weeks 1 day ago
fundschedule
@fundschedule fundSchedule

Check out my work around to make the "new widget" match the "join the conversation" widget: http://stackoverflow.com/questions/13361823/iframe-css-override-for-new-twitter-widget/17668635#17668635

Image of change: http://img837.imageshack.us/img837/1139/btjc.png

8 weeks 1 day ago
webdesignassen
@webdesignassen Geoy Webdesign Assen

Oh.. all websites with twitter feed gives error..
I will build my own twitter cause i don't want to be dependent anymore.

Do you have any idea how much website i must rewrite now.. AAAGH

12 weeks 6 days ago
FrancescoBonchi
@FrancescoBonchi Francesco Bonchi

I think the new widget misses two very important visual options:
1) the loop
2) the possibility of removing avatars

Any hope to see these coming back in the near future?

Thanks

12 weeks 6 days ago
uciaml
@uciaml U Calgary IAML

I'm wondering why we can't control the font or font size with the new widget. The legacy version had a CSS-like control that was easy for web designers to implement. Putting (limited) settings in an anchor tag seems to be a step backwards. I'm having trouble making it look appropriate within our current site design.

12 weeks 6 days ago
Knowledgi
@Knowledgi Knowledgi

Agree. I'd love to use the same font and size as my website. And the inability to remove the pictorial icons give me a great incentive to move Twitter to somewhere less prominent.

12 weeks 23 hours ago
MathewAnderson
@MathewAnderson Mathew Anderson

Now we cannot easily adjust multiple accounts, or more importantly the CSS of a feed as was mentioned above. How do we customize our feeds now with these features removed or hindered?

Is there complete documentation on all CSS code to adjust background color, fonts, width and height, margins, etc.? We need this please for widgets to be effective as they were previously.

Thanks!

12 weeks 6 days ago
viniciushacebe
@viniciushacebe Vinícius Hacebe

Interesting... But i think you took all the good things of the previous one. I'm not against changes but if you're changing, change to something better and more effective!

I wish i had the loop back again and the possibility of changing the css colors without need to use additional js or css.

Now i'll have to change all of my customer's websites... Thank you!

12 weeks 6 days ago
codeSanya
@codeSanya sanya

We are begging, pleading with you to allow us to style! Total BS that this option has been taken away from web developers. Did you think this through?

12 weeks 6 days ago
juhpuhdepuh
@juhpuhdepuh jan peter

I also have multiple websites with timelines which have no avatars and they all loop in an box with a limited height (32px). Give back those options!
Now it's impossible to show any tweets due to the design of the sites. Restart the old API!

12 weeks 5 days ago
mockappsig
@mockappsig mockapp

RIP .twr-tweet-text

12 weeks 5 days ago
XiDigital
@XiDigital Xi Digital

In the past few years, we've created many sites that had customized (to fit the design) twitter feeds. As of yesterday, the feeds stopped working due to retirement of the API. It seems that the new method requires access to each twitter account, as well as an extremely limited ability styling options.

Really upset with the move and currently in the process of switching Twitter feeds with other social network feeds.

12 weeks 5 days ago
egris09
@egris09 Griselda Gonzalez

I also have multiple websites with timelines which have no avatars and they all loop in an box with a limited height (32px). Give back those options!
Now it's impossible to show any tweets due to the design of the sites. Restart the old API!

12 weeks 5 days ago
AdamRMurray
@AdamRMurray Adam R Murray

Ugh thoughtless software developers, not thinking through just how many sites you just made awful with your negligent action. Just say "it's no longer supported" and keep the API running on another thread. Why would you do something so poorly executed?

12 weeks 5 days ago
stephentruex
@stephentruex Stephen Truex

Just noticed today that our embedded timeline isn't display any content. I tried using the configurator to create a new one, that doesn't work either on the public server. Strangely, it works fine if I preview the page locally. Our site uses Expression Engine, but that hasn't been a factor in the past. Is implementation different for EE?

Anyone with ideas how to fix this? Please advise ASAP.

Thanks!

12 weeks 5 days ago
benward
@benward Ben Ward

There shouldn't be any issue with Expression Engine, but you should check in the page output that all attributes on the embed code are present; if it's running through any sanitization or HTML filter it's conceivable that the widget-id is being discarded. Similarly, ensuring that the widgets.js script is being included will help.

If you can paste a copy of the embed code as it appears in your page output that will help.

Thanks,

Ben

12 weeks 5 days ago
stephentruex
@stephentruex Stephen Truex

Hi Ben,

Thanks for your reply. We aren't using any sanitization or HTML filter.

Viewing the page source this is what I see:

  1. <!-- start Twitter widget --> <a class="twitter-timeline" href="https://twitter.com/EarthScopeInfo">Tweets by @EarthScopeInfo</a>
  2. <script type="text/javascript">// <![CDATA[
  3. !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");
  4. // ]]></script>
  5. <!-- end Twitter widget -->

If I inspect the page using Developer Tools (in Google Chrome), there is some weird stuff which may not be W3C compliant. For example, there are <html>, <head>, and <body> tags inside of an <iframe>. Maybe that's part of the problem, not sure whether your script or Expression Engine is adding that stuff, but I assume it's the script.

The "data-widget-id" isn't in the output. Also, there is a CSS rule specifying display:none for the . I tried adding the id and changing the CSS in the inspector, but no difference.

I'd attach a screenshot of the code in the inspector, but don't see how to do so. However, you can look at our site http://earthscope.org

Thanks for your help!

Stephen

12 weeks 5 days ago
stephentruex
@stephentruex Stephen Truex

In case anyone is interested, I got my new embedded timeline to work in Expression Engine simply by moving the embed code into a Template, as opposed to an Entry. I think it was an issue with the TinyMCE Module, which does remove any tags. I'm surprised that my implementation of the old widget worked.

In theory, it shouldn't be much more than an inconvenience to make this update, just create the new code snippet and swap it out. Whether it actually works that way for people using various CMS and different plugins or modules is another story.

12 weeks 13 hours ago
benward
@benward Ben Ward

Hi Stephen,

Thanks very much for debugging the issue. From your previous post, the issue is that the data-widget-id attribute was being stripped by the editor, which is required for the widget to operate. I'm glad you managed to find a workaround. We'll look into ways of making the widget work better in editor and filtered environments.

Ben

12 weeks 12 hours ago
tlnet_elesson
@tlnet_elesson TLNet

I have followed your advice and moved the jscript to the main joomla 1.5 template on my site.
Unfortunately Tinymce is stripping the data-widget-id.
I'm attempting to use an html block on the home page to embed the twitter timeline but don't know where I can try and put the id.
I've tried adjusting blacklist/whitelist settings too.
www.tlnet.it

11 weeks 4 days ago
NoemiAlexandro
@NoemiAlexandro Noemistadentro¨`!´¨

any solution?

12 weeks 5 days ago
fundschedule
@fundschedule fundSchedule

Check out my work around to make the "new widget" match the "join the conversation" widget: http://stackoverflow.com/questions/13361823/iframe-css-override-for-new-twitter-widget/17668635#17668635

Image of change: http://img837.imageshack.us/img837/1139/btjc.png

8 weeks 1 day ago
NoemiAlexandro
@NoemiAlexandro Noemistadentro¨`!´¨

How to migrate to APIv1.1 ?

12 weeks 5 days ago
heydaycreative
@heydaycreative HeyDay Creative

I definitely want to also agree there need to be more CSS styling control for us web designers and developers. Fonts, hiding avatars, more size control (why must there be a min and max width and height), hiding the Twitter Name @twitterhandle for every single tweet. Please bring back blogger.js or make this new one better.

12 weeks 5 days ago
salonsales
@salonsales Salon Sales

Very disappointed that widget size configurable options taken away. Why are Max-Min size figures forced upon us

12 weeks 4 days ago
Moogligoo
@Moogligoo Moogli Goo

HELP! I'm trying to generate a new Widget to replace the (now redundant) one on our SharePoint intranet but when I go to create it I can't see a preview at all and all it shows on the site is my @Moogligoo link - are there problems with the new widget or am I doing something wrong?

12 weeks 4 days ago
philCheese
@philCheese Phil Cheshire

I just cannot understand Twitter's decision here. It's thoughtless, ham-fisted and short-sighted. I imagine designers/developers will be moving away or switching off Twitter feeds in their droves. Was this the intention? I, for one, will not be recommending Twitter to my clients again.

Broken sites and retrograde steps when everything was working fine just boggles the mind, what a waste of my time. Total and utter BS.

+1 for turning the v1 API back on, I'm not fussed if it's 'supported'. I don't care how much notice you give people, you've replaced something decent and open with something rubbish and constrictive. Jeez.

It might have been worth putting some thought in about the people who actually disseminate your product: people like me, the little guys who don't have the time or money to go through every one of my sites that uses a Twitter feed and re-implement everything because of daft business decisions. No-one, in the present economic climate, is going to pay me to do that. You're not living in the real world, you're in some weird technological ivory tower.

And finally, can you deal with my irritated clients for me? Thought not.

Goodbye, Twitter. It used to be nice knowing you.

12 weeks 4 days ago
AliCatGr
@AliCatGr Ali Cat

I LOVE this post!! You have summed-up exactly how I feel about this whole stupid mess!! Too bad no one at Twitter seems to be actually READING or ACTING ON the multitude of complaints!!! I am one MAD developer who will not be recommending Twitter to my clients!!!

6 weeks 5 days ago
redtimmy
@redtimmy Tim Wayne

+1.

3 weeks 5 days ago
biellebrunner
@biellebrunner Gabrielle Brunner

You are aware that what you call "customization" is a total joke, right?
What an enormous step back, that basically ruins a totally new layout on one of my websites.
That's just great, Twitter. You really made people's lives easier...

12 weeks 3 days ago
redtimmy
@redtimmy Tim Wayne

Nearly ALL of the CSS customization I could do before is now GONE.

3 weeks 5 days ago
redtimmy
@redtimmy Tim Wayne

With the API v1 script, I could style every single element of the panel. I could make each tweet dance in its own bubble on my site. I could give alternating tweets different colors. The fonts could match the fonts of the page. I could knock out the background. I could dispense with the border entirely. I had absolute control over my scrollbar. I could set my own width, as small or as big as I wanted. Anything was possible and I did a lot of awesome things with my twitter panel.

Now, with this new twitter script, I have this big f'ing brick-of-a-box on my site that's IMPERVIOUS to styling.

You have taken something away from me, the designer, and I am damn mad about it.

I was hoping the Facebook panel would start to go in the direction of styling freedom like the Twitter panel. Instead, Twitter devs have followed in the douchebag anti-designer footsteps of Facebook developers, opting to put me in the same straightjacket Facebook wants me in.
Well, a pox on you, Twitter devs. You forced me to have this conversation with about three dozen clients over the past eight weeks:

"Yes, I am aware your twitter stream isn't there anymore. I'm so sorry, I had to remove it"
...
"Well, you see, Twitter made the old script not work anymore, and the new script could not be styled to match your page like the old one. Also, the little icons could not be made invisible. The whole panel had to go. So I had to remove it. Again, I'm sorry."
...
"No, like I said, the new twitter widget cannot be styled. That means it will stand out like a sore thumb in the sidebar. We won't be able to make it display the way it used to. The new panel was a detriment to the site, so it had to go."
...
"No, I'm sorry, I don't know why they did this."
...
"No, I don't believe they would be willing to reimburse you for the development costs to style the twitter panel. I'm afraid that money is in the toilet.
...

3 weeks 5 days ago
episod
@episod Taylor Singletary

While the new embedded timeline widgets do not have the customization options you're after, you still have other options.

There is still a rich REST API that returns the data you would need to construct a timeline that you could customize the presentation of within the allowances of the Developer Display Requirements.

It takes programming skills to accomplish, but the door is not closed to you.

3 weeks 5 days ago
SwanieKathy
@SwanieKathy Kathy

Message to the current Twitter developers: Have You Completely Lost Your Minds!

If you are insisting on taking away flexible styling, could you at least allow us to turn off avatars with the 'avatars: false' attribute. Many of my sites look ridiculous now with those repetitive avatars showing up on every tweet and wasting valuable real estate. One third of the tweet space on some sites is now wasted for the avatar, which should be easy to turn off if you developers were thinking even a little. Go back to the drawing board kids.

12 weeks 2 days ago
lsces
@lsces Lester Caine

Nobody seems to have thought about the problem of 'users' who have no idea what widgets are!!!!
I should not have to ask a customer for their password so I can restore something that was working fine WITHOUT my having to know that !!!
And YES the fact that many of my customers sites no longer have twitter feeds working was something of a surprise! Since THEIR clients have the option to disable 'social media' it was not initially obvious that TWITTER was switching them off. AT LEAST DISPLAY SOMETHING rather than just hiding the message!
This is yet another example of the crass waste of time that stupid and unnecessary changes cause. Are TWITTER going to pay to rework all the customer sites I now have to redo?

12 weeks 2 days ago
NezarFouad
@NezarFouad nezar

This is the stupidest BS i've ever seen... You just broke thousands of websites!!!! who's gonna go an fix all these websites???

12 weeks 2 days ago
DavidRXV
@DavidRXV Status / Updates

"support for our old embedded timeline widget (sometimes referred to as the ‘legacy timeline widget’, or ‘goodies widget’) has ended". I have been using that widget on my home page for a long time now. It's nice to know there is no replacement, no consideration for adapting it to a version or anything. So, thank you for that.

If that is the case, then my activity, support, usage, membership on Twitter has ended.

12 weeks 1 day ago
stacia_jones_
@stacia_jones_ Stacia

Unfortunately, I don't think PhilCheese above is correct -- the v1 API still doesn't work, and I was forced to go to the updated version on my webpage today. Frankly, it stinks. I know the trend for years has been to change products for the worse and ignore people who complain, because new users will come along, people who had no idea how the product USED to work, and make up for the people you lost when you downgraded. So I have no illusion that anyone at Twitter is going to listen to the myriad complaints on this page.

But this is one ugly widget. I was able to configure the width on the last one, which had some nice borders and features on it as well. Now I have this really ugly, narrow, scrollbar-heavy widget with terrible link colors -- the option to change link colors doesn't even work! Come ON! So my choice is ugly or nothing... and I'll have to go with nothing, to be honest.

12 weeks 5 hours ago
philCheese
@philCheese Phil Cheshire

I think you might have got the wrong end of the stick. I'm fully aware the v1 isn't working, hence my barrage of commets on these forums. +1 for turning it BACK ON though. This new one is NOT v1.1 anyway - that's a joke. This is v2 as far as I can see, the change is at least a whole version jump (backwards, maybe it should be v0). It is ugly. They are having, as we say in the UK, a laugh.

11 weeks 6 days ago
AbbeyGymClub
@AbbeyGymClub AbbeyGymClub

We used Twitter to update news items, and then used the V1 API to show the Tweet-text only as seperate items on the "News" page of our website. This was customised with CSS to match the rest of the site - and it was great and easy.

Now we have to display avatars, retweet etc etc in a form that Twitter wants, not what we (who wrote the Tweets) want.

Forget it I'll have to go to a less efficient method of updating the news, and I think we'll drop Twitter

11 weeks 6 days ago
Benmacer
@Benmacer Ben Hendriks

It seems that mister Ward is not going to reply to any questions about the styling problem we now face, it is always the same you help them to get big and then you can go f* yourself.
The developers of website's made you what you are today.
And i know what you are thinking just don't reply then they will shut up. well maybe you are right but look at yourself you have probably turned in to the person you diddn't want to be.

I will advise all my clients to stop using twitter and look for something else that probably will have the same cycle of listening to people who help them to get big and go there own way to make more money.

11 weeks 6 days ago
philCheese
@philCheese Phil Cheshire

So, yet again, money and business concerns have overtaken/overridden/overshadowed the fact that users are at the end of the technology chain. That's tech 101, surely. If it doesn't work for your users then it doesn't work. Technology minus users = some bits and bytes. Users don't care about bell and whistles, on the ground they just want something that works and is hassle-free. Users might consume your new features, but they would have undoubtedly been perfectly happy without them.

In my 12 years experience as a technology professional, I still fail to understand why tech companies like Twitter insist on shooting themselves in the foot and then have to back-up to try to re-gain the advantage. Some longer term thinking is needed. You are the flavour of the month now, but how to make that last? In the scramble to make money and increase market share, justify new appointments with their incumbent, overblown salaries and bonuses, plus the frankly crazy idea that any change is good, the quality of the product decreases. Vision-less, short term thinking ensues. The old users get sidelined and my world becomes a less pleasant place to live and work in, all in the name of advancement.

This particular example is a retrograde step for 1000s upon 1000s of sites. If you're going to upgrade, then upgrade for the benefit of your current users - give them a choice. Those users who have been loyal to you thus far are your lifeblood. You can also satisfy new users - It takes a little more time and thinking outside of the screen and boardroom. And some communication with the people who USE and disseminate your product. Then move on to the formulation of an all-user-centred plan.

Leave the old users behind and you are painting yourself into a smaller and smaller corner. Your 'new' users will become your old users and how long can that cycle go on? In time you will have alienated everyone who thought you were valuable and they will move to another service which takes their needs into account more. It's severely short-term thinking that WILL bite you on the behind.

11 weeks 6 days ago
AliCatGr
@AliCatGr Ali Cat

Well said!!!!

6 weeks 5 days ago
Warrenclaflin
@Warrenclaflin Warren Claflin

I don't often post on these forums, but I'm now recommending that my clients don't use twitter feeds on their websites. It makes a good website look terrible.

Claiming that it is "customizable" is insulting to everyone and shows that Twitter doesn't know, or care, how it's feeds are being used.

I guess Twitter want's to follow facebook off the cliff by alienating it's users.

11 weeks 6 days ago
_WebDesignPrint
@_WebDesignPrint WebDesignPrint

This is even better than Microsoft's XBox One farse, which they at least finally acknowledged and are taking the DRM issue back.
You could not have done the API upgrade in any worse way. I will now strongly discourage my clients from using Twitter, just the opposite to what I used to do.

11 weeks 5 days ago
DAMRacing
@DAMRacing DAM Racing

We have a network of area franchises in our business, each with their own Twitter feed which they update. We previously had the feed added to their area website by using standard code and dropping in the account name dynamically. To replace this, it seems I'd have to individually log in to each of their accounts, create and set up a widget and then drop that code into each site? No thanks! They'll have to live without it for a while, and when we find time to amend the sites, we'll probably go with a straight link to the account insetad of a feed.

It's ok though, the Facebook widgets still work fine...

11 weeks 5 days ago
robbsala
@robbsala robbsala

Just last week we released client-side configuration options for Embedded Timelines (New feature: Dynamic timeline selection for embedded timelines). This should make the use case you described much easier.

11 weeks 5 days ago
lsces
@lsces Lester Caine

USING the new 'API' starts by having to be given access to the clients twitter account - not very good security wise!. But even once one has that access one can't create a custom display that ACTUALLY matches the site that has now lost a working feed. Like others here I'm working with customers simply to close down their use of Twitter and go to something else - there are a lot of options these days!

11 weeks 2 days ago